XINU
Macros | Functions | Variables
initialize.c File Reference

システムの初期化を処理し、nullプロセスとなる。 More...

#include <xinu.h>
#include <string.h>
Include dependency graph for initialize.c:

Go to the source code of this file.

Macros

#define CONSOLE_RESET   " \033[0m\033[2J\033[;H"
 コンソール(コンソールカラー、文字、ポジション)をリセットするためのエスケープシーケンス More...
 

Functions

int32 delay (int n)
 マイクロ秒単位で処理を遅らせる。 More...
 
void main (void)
 最初に生成されるmainプロセスのextern宣言 More...
 
void meminit (void)
 フリーメモリリストを初期化するmeminit()のextern宣言 More...
 
void nulluser ()
 システムの初期化を処理し、nullプロセスとなる。 More...
 
void start (void)
 XINUコードの開始であるstart()のextern宣言 More...
 
local process startup (void)
 スタートアップタスクを完了するプロセス More...
 
int32 stop (char *s)
 処理を停止させる。無限ループによる停止のため、復帰にはリセットが必要である。 More...
 
static void sysinit ()
 内部システムの初期化を行うsysinit()のextern宣言 More...
 

Variables

void * _end
 XINUコードの終わり More...
 
pid32 currpid
 現在実行中のプロセスのID More...
 
struct memblk memlist
 フリーメモリブロックのリスト More...
 
int prcount
 生存しているプロセスの総数 More...
 
struct procent proctab [NPROC]
 プロセステーブルエントリ More...
 
struct sentry semtab [NSEM]
 セマフォテーブルエントリ More...
 

Detailed Description

システムの初期化を処理し、nullプロセスとなる。

Definition in file initialize.c.

Macro Definition Documentation

◆ CONSOLE_RESET

#define CONSOLE_RESET   " \033[0m\033[2J\033[;H"

コンソール(コンソールカラー、文字、ポジション)をリセットするためのエスケープシーケンス

Definition at line 34 of file initialize.c.

Referenced by sysinit().

Function Documentation

◆ delay()

int32 delay ( int  n)

マイクロ秒単位で処理を遅らせる。

Parameters
[in]n遅延時間(マイクロ秒)
Returns
OKを返す。

Definition at line 262 of file initialize.c.

References DELAY, and OK.

Referenced by xsh_sleep(), and xsh_udpecho().

263 {
264  DELAY(n);
265  return OK;
266 }
#define DELAY(n)
マイクロ秒単位で処理を遅らせる。
Definition: delay.h:11
#define OK
処理が成功した場合
Definition: kernel.h:77
Here is the caller graph for this function:

◆ main()

void main ( void  )

最初に生成されるmainプロセスのextern宣言

最初に生成されるmainプロセスのextern宣言

Step1. メッセージを全て受信する(ただし、メッセージ内容は確認しない)。
Step2. XINUシェルを作成/起動する。
Step3. XINUシェルが終了した場合は、以下の処理を行う(無限に繰り返す)。
 ・メッセージ到着を待つ。メッセージが来なければ、待ち続ける。
 ・200[ms]スリープする。
 ・XINUシェルを再作成/起動する。

Returns
OKを返す。

Definition at line 18 of file main.c.

References CONSOLE, create(), kprintf(), OK, receive(), recvclr(), resume(), shell(), sleepms(), and TRUE.

Referenced by startup().

19 {
20 
21  /* Run the Xinu shell */
22 
23  recvclr();
24  resume(create(shell, 8192, 50, "shell", 1, CONSOLE));
25 
26  /* Wait for shell to exit and recreate it */
27 
28  while (TRUE)
29  {
30  receive();
31  sleepms(200);
32  kprintf("\n\nMain process recreating shell\n\n");
33  resume(create(shell, 4096, 20, "shell", 1, CONSOLE));
34  }
35  return OK;
36 }
syscall kprintf(char *fmt,...)
ポーリングI/Oを使用して、フォーマットされた文字列をコンソールに出力する。
Definition: kprintf.c:98
process shell(did32)
Definition: shell.c:54
#define CONSOLE
Definition: conf.h:28
#define OK
処理が成功した場合
Definition: kernel.h:77
umsg32 receive(void)
メッセージの受信を待ち、受信後にreceive()の呼び出し者にメッセージを返す。
Definition: receive.c:17
syscall sleepms(int32)
Definition: sleep.c:26
#define TRUE
Boolean True(1)
Definition: kernel.h:65
umsg32 recvclr(void)
受信メッセージをクリアし、待機している場合はメッセージを返す。
Definition: recvclr.c:14
pri16 resume(pid32)
プロセスを休止状態(サスペンド)からREADY状態に遷移させる。
Definition: resume.c:20
pid32 create(void *, uint32, pri16, char *, uint32,...)
関数の実行を開始するプロセスを作成する。
Definition: create.c:55
Here is the call graph for this function:
Here is the caller graph for this function:

◆ meminit()

void meminit ( void  )

フリーメモリリストを初期化するmeminit()のextern宣言

フリーメモリリストを初期化するmeminit()のextern宣言

Step1. ヒープ開始アドレスとヒープ終了アドレスを設定する。
Step2. メモリリストの先頭に、ヒープ開始から終了までのメモリブロックをセットする。

Note
RAMサイズは512MB。

Definition at line 19 of file meminit.c.

References end, MAXADDR, maxheap, memlist, minheap, memblk::mlength, memblk::mnext, and NULL.

Referenced by sysinit().

20 {
21  struct memblk *memptr; /* Memory block pointer */
22 
23  /* Initialize the minheap and maxheap variables */
24 
25  minheap = (void *)&end;
26  maxheap = (void *)MAXADDR;
27 
28  /* Initialize the memory list as one big block */
29 
30  memlist.mnext = (struct memblk *)minheap;
31  memptr = memlist.mnext;
32 
33  memptr->mnext = (struct memblk *)NULL;
34  memlist.mlength = memptr->mlength =
36 }
#define NULL
連結リスト用のNULLポインタ
Definition: kernel.h:68
メモリブロックを管理するための構造体。
Definition: memory.h:53
void * maxheap
ヒープの終了アドレス
Definition: meminit.c:10
#define MAXADDR
0x80000000から始まる512MB RAMの最終アドレス
Definition: armv7a.h:55
struct memblk * mnext
次のフリーメモリブロックへのポインタ
Definition: memory.h:56
void * minheap
ヒープの開始アドレス
Definition: meminit.c:8
struct memblk memlist
フリーメモリリストの先頭
Definition: initialize.c:27
int end
プログラムの終了アドレス(リンカが追加する)
uint32 mlength
memblk構造体のサイズを含むブロックサイズ
Definition: memory.h:58
unsigned int uint32
符号なし32ビット整数(unsigned int)
Definition: kernel.h:15
Here is the caller graph for this function:

◆ nulluser()

void nulluser ( )

システムの初期化を処理し、nullプロセスとなる。

Step1. XINUデータ構造とデバイスを初期化する。
Step2. XINUシステムのメモリレイアウトを出力する。
Step3. 割り込みを許可状態にする。
Step4. ネットワークデータ構造およびネットワーク関連プロセスを初期化する。
Step5. スタートアップ(初期化)終了プロセスを呼び出し、その中でmainプロセスを呼び出す。
Step6. 本関数はnullプロセスとなる。つまり、他のプロセスを実行する準備ができていない時、
CPUを実行するプロセス(nullプロセス)がある事を保証する。

Note
Cランタイム環境が確立された後に、プログラムの実行は本関数から開始される。
割り込みは最初は無効であり、最終的には明示的に有効にする必要がある。
本関数は、初期化完了後にnullプロセスとなる。nullプロセスは常に実行可能な状態を
維持する必要がある。そのため、中断、セマフォの待機、スリープ状態、または終了を
引き起こす可能性のあるコードを実行できない。特に、コードはkprintfなどのポーリング版を
除いて、I/Oを実行してはならない。

Definition at line 53 of file initialize.c.

References create(), data, ebss, enable(), etext, INITPRIO, INITSTK, kprintf(), memlist, memblk::mlength, memblk::mnext, net_init(), NULL, resume(), startup(), sysinit(), text, and TRUE.

54 {
55  struct memblk *memptr; /* Ptr to memory block */
56  uint32 free_mem; /* Total amount of free memory */
57 
58  /* Initialize the system */
59 
60  sysinit();
61 
62  /* Output Xinu memory layout */
63  free_mem = 0;
64  for (memptr = memlist.mnext; memptr != NULL;
65  memptr = memptr->mnext)
66  {
67  free_mem += memptr->mlength;
68  }
69  kprintf("%10d bytes of free memory. Free list:\n", free_mem);
70  for (memptr = memlist.mnext; memptr != NULL; memptr = memptr->mnext)
71  {
72  kprintf(" [0x%08X to 0x%08X]\n",
73  (uint32)memptr, ((uint32)memptr) + memptr->mlength - 1);
74  }
75 
76  kprintf("%10d bytes of Xinu code.\n",
77  (uint32)&etext - (uint32)&text);
78  kprintf(" [0x%08X to 0x%08X]\n",
79  (uint32)&text, (uint32)&etext - 1);
80  kprintf("%10d bytes of data.\n",
81  (uint32)&ebss - (uint32)&data);
82  kprintf(" [0x%08X to 0x%08X]\n\n",
83  (uint32)&data, (uint32)&ebss - 1);
84 
85  /* Enable interrupts */
86 
87  enable();
88 
89  /* Initialize the network stack and start processes */
90 
91  net_init();
92 
93  /* Create a process to finish startup and start main */
94 
96  "Startup process", 0, NULL));
97 
98  /* Become the Null process (i.e., guarantee that the CPU has */
99  /* something to run when no other process is ready to execute) */
100 
101  while (TRUE)
102  {
103  ; /* Do nothing */
104  }
105 }
syscall kprintf(char *fmt,...)
ポーリングI/Oを使用して、フォーマットされた文字列をコンソールに出力する。
Definition: kprintf.c:98
#define NULL
連結リスト用のNULLポインタ
Definition: kernel.h:68
メモリブロックを管理するための構造体。
Definition: memory.h:53
static void sysinit()
内部システムの初期化を行うsysinit()のextern宣言
Definition: initialize.c:163
local process startup(void)
スタートアップタスクを完了するプロセス
Definition: initialize.c:114
#define INITSTK
初期プロセススタックサイズ
Definition: process.h:57
struct memblk * mnext
次のフリーメモリブロックへのポインタ
Definition: memory.h:56
struct memblk memlist
フリーメモリブロックのリスト
Definition: initialize.c:27
int ebss
BSSセグメントの終了アドレス(リンカが追加する)
int data
データセグメントの開始アドレス(リンカが追加する)
void enable(void)
割り込み許可(intr.Sに定義がある)
void net_init(void)
Definition: net.c:15
int etext
テキストセグメントの終了アドレス(リンカが追加する)
#define TRUE
Boolean True(1)
Definition: kernel.h:65
pri16 resume(pid32)
プロセスを休止状態(サスペンド)からREADY状態に遷移させる。
Definition: resume.c:20
pid32 create(void *, uint32, pri16, char *, uint32,...)
関数の実行を開始するプロセスを作成する。
Definition: create.c:55
uint32 mlength
memblk構造体のサイズを含むブロックサイズ
Definition: memory.h:58
int text
テキストセグメントの開始アドレス(リンカが追加する)
unsigned int uint32
符号なし32ビット整数(unsigned int)
Definition: kernel.h:15
#define INITPRIO
初期プロセス優先度
Definition: process.h:59
Here is the call graph for this function:

◆ start()

void start ( void  )

XINUコードの開始であるstart()のextern宣言

◆ startup()

local process startup ( void  )

スタートアップタスクを完了するプロセス

nullプロセスから実行できないスタートアップ処理(初期化処理)を行い、mainプロセスを作成/実行する。

Step1. DHCPを使用してIPアドレスを取得/表示する。
Step2. mainプロセスを作成し、実行する。

Returns
OKを返す。

Definition at line 114 of file initialize.c.

References create(), getlocalip(), INITPRIO, INITSTK, network::ipucast, kprintf(), main(), NetData, NULL, OK, resume(), sprintf(), and SYSERR.

Referenced by nulluser().

115 {
116  uint32 ipaddr; /* Computer's IP address */
117  char str[128]; /* String used to format output */
118 
119  /* Use DHCP to obtain an IP address and format it */
120 
121  ipaddr = getlocalip();
122  if ((int32)ipaddr == SYSERR)
123  {
124  kprintf("Cannot obtain an IP address\n");
125  }
126  else
127  {
128  /* Print the IP in dotted decimal and hex */
129  ipaddr = NetData.ipucast;
130  sprintf(str, "%d.%d.%d.%d",
131  (ipaddr >> 24) & 0xff, (ipaddr >> 16) & 0xff,
132  (ipaddr >> 8) & 0xff, ipaddr & 0xff);
133 
134  kprintf("Obtained IP address %s (0x%08x)\n", str,
135  ipaddr);
136  }
137  /* Create a process to execute function main() */
138 
139  resume(create((void *)main, INITSTK, INITPRIO,
140  "Main process", 0, NULL));
141 
142  /* Startup process exits at this point */
143 
144  return OK;
145 }
syscall kprintf(char *fmt,...)
ポーリングI/Oを使用して、フォーマットされた文字列をコンソールに出力する。
Definition: kprintf.c:98
#define NULL
連結リスト用のNULLポインタ
Definition: kernel.h:68
uint32 ipucast
Definition: net.h:55
struct network NetData
Definition: net.c:6
#define SYSERR
処理が失敗した場合
Definition: kernel.h:79
#define INITSTK
初期プロセススタックサイズ
Definition: process.h:57
#define OK
処理が成功した場合
Definition: kernel.h:77
int32 sprintf(char *, char *,...)
Definition: sprintf.c:12
int int32
符号あり32ビット整数(int)
Definition: kernel.h:11
pri16 resume(pid32)
プロセスを休止状態(サスペンド)からREADY状態に遷移させる。
Definition: resume.c:20
pid32 create(void *, uint32, pri16, char *, uint32,...)
関数の実行を開始するプロセスを作成する。
Definition: create.c:55
uint32 getlocalip(void)
Definition: dhcp.c:142
void main(void)
最初に生成されるmainプロセスのextern宣言
Definition: main.c:18
unsigned int uint32
符号なし32ビット整数(unsigned int)
Definition: kernel.h:15
#define INITPRIO
初期プロセス優先度
Definition: process.h:59
Here is the call graph for this function:
Here is the caller graph for this function:

◆ stop()

int32 stop ( char *  s)

処理を停止させる。無限ループによる停止のため、復帰にはリセットが必要である。

Parameters
[in]s停止時に表示するメッセージ

Definition at line 249 of file initialize.c.

References kprintf().

Referenced by xsh_memdump().

250 {
251  kprintf("%s\n", s);
252  kprintf("looping... press reset\n");
253  while (1)
254  /* Empty */;
255 }
syscall kprintf(char *fmt,...)
ポーリングI/Oを使用して、フォーマットされた文字列をコンソールに出力する。
Definition: kprintf.c:98
Here is the call graph for this function:
Here is the caller graph for this function:

◆ sysinit()

static void sysinit ( )
static

内部システムの初期化を行うsysinit()のextern宣言

XINUデータ構造とデバイスを初期化する。

Step1. コンソールリセットを行う。
Step2. プラットフォーム固有の初期化を行う。
Step3. 割り込みベクタを初期化する。
Step4. フリーメモリリストを初期化する。
Step5. プロセス総数を記録する(nullプロセス分のみ記録するため、1となる)。
Step6. スケジューリングの延期(Defer)状態をリセットする。
Step7. プロセステーブルエントリ(nullプロセス分も含む)を初期化する。
Step8. セマフォテーブルを初期化する。
Step9. バッファプールを初期化する。
Step10. プロセスのREADYリストを作成する。
Step11. リアルタイムクロックを初期化する。
Step12. デバイスとデバイスドライバを初期化する。

Definition at line 163 of file initialize.c.

References bufinit(), clkinit(), CONSOLE_RESET, currpid, Defer, getstk(), init(), initevec(), kprintf(), meminit(), defer::ndefers, NDEVS, newqueue(), NPROC, NSEM, NULL, NULLCH, NULLPROC, NULLSTK, platinit(), PR_CURR, PR_FREE, prcount, procent::prname, proctab, procent::prprio, procent::prstate, procent::prstkbase, procent::prstklen, procent::prstkptr, readylist, S_FREE, sentry::scount, semtab, sentry::squeue, sentry::sstate, and strncpy().

Referenced by nulluser().

164 {
165  int32 i;
166  struct procent *prptr; /* Ptr to process table entry */
167  struct sentry *semptr; /* Ptr to semaphore table entry */
168 
170  kprintf("\n%s\n\n", VERSION);
171 
172  /* Platform Specific Initialization */
173 
174  platinit();
175 
176  /* Initialize the interrupt vectors */
177 
178  initevec();
179 
180  /* Initialize free memory list */
181 
182  meminit();
183 
184  /* Initialize system variables */
185 
186  /* Count the Null process as the first process in the system */
187 
188  prcount = 1;
189 
190  /* Scheduling is not currently blocked */
191 
192  Defer.ndefers = 0;
193 
194  /* Initialize process table entries free */
195 
196  for (i = 0; i < NPROC; i++)
197  {
198  prptr = &proctab[i];
199  prptr->prstate = PR_FREE;
200  prptr->prname[0] = NULLCH;
201  prptr->prstkbase = NULL;
202  prptr->prprio = 0;
203  }
204 
205  /* Initialize the Null process entry */
206 
207  prptr = &proctab[NULLPROC];
208  prptr->prstate = PR_CURR;
209  prptr->prprio = 0;
210  strncpy(prptr->prname, "prnull", 7);
211  prptr->prstkbase = getstk(NULLSTK);
212  prptr->prstklen = NULLSTK;
213  prptr->prstkptr = 0;
214  currpid = NULLPROC;
215 
216  /* Initialize semaphores */
217 
218  for (i = 0; i < NSEM; i++)
219  {
220  semptr = &semtab[i];
221  semptr->sstate = S_FREE;
222  semptr->scount = 0;
223  semptr->squeue = newqueue();
224  }
225 
226  /* Initialize buffer pools */
227 
228  bufinit();
229 
230  /* Create a ready list for processes */
231 
232  readylist = newqueue();
233 
234  /* Initialize the real time clock */
235 
236  clkinit();
237 
238  for (i = 0; i < NDEVS; i++)
239  {
240  init(i);
241  }
242  return;
243 }
syscall kprintf(char *fmt,...)
ポーリングI/Oを使用して、フォーマットされた文字列をコンソールに出力する。
Definition: kprintf.c:98
#define NULL
連結リスト用のNULLポインタ
Definition: kernel.h:68
struct defer Defer
defer構造体のextern宣言
Definition: resched.c:8
char * strncpy(char *, const char *, int32)
文字列s1に文字列s2をN文字(Byte)分コピーする。
Definition: strncpy.c:15
void meminit(void)
フリーメモリリストを初期化するmeminit()のextern宣言
Definition: meminit.c:19
#define NDEVS
Definition: conf.h:74
byte sstate
エントリ状態が利用可能(S_FREE)か、利用中(S_USED)かを表す。
Definition: semaphore.h:22
int prcount
生存しているプロセスの総数
Definition: initialize.c:30
セマフォテーブルエントリであり、本構造体の配列(長さNSEM)が静的に確保される。
Definition: semaphore.h:19
#define NSEM
Definition: conf.h:80
int32 initevec(void)
#define NULLPROC
NULLプロセスのID。NULLプロセスは、他に動かすプロセスがない時に動く空プロセス
Definition: process.h:54
uint32 prstklen
Bytesで表されたスタックの長さ(最大値。Byte)。
Definition: process.h:96
struct procent proctab[NPROC]
プロセステーブルエントリ
Definition: initialize.c:23
qid16 readylist
READY状態のプロセスリストに対するグローバルID.
Definition: ready.c:9
pri16 prprio
プロセスのスケジューリング優先度。
Definition: process.h:90
#define PR_CURR
プロセスが現在動作中。
Definition: process.h:37
void platinit(void)
Definition: platinit.c:31
char prname[PNMLEN]
プロセス名。
Definition: process.h:98
#define NPROC
Definition: conf.h:79
#define NULLSTK
NULLプロセスのスタックサイズ
Definition: kernel.h:96
char * prstkbase
ランタイムスタックの基点(メモリ領域で最上位のアドレス)。
Definition: process.h:94
int int32
符号あり32ビット整数(int)
Definition: kernel.h:11
uint16 prstate
プロセス状態(PR_CURR, ..., etc)。
Definition: process.h:88
#define PR_FREE
プロセステーブルエントリが使用されていない状態。
Definition: process.h:35
qid16 squeue
セマフォ待機中プロセスのキュー
Definition: semaphore.h:26
status bufinit(void)
バッファプールデータ構造を初期化する。
Definition: bufinit.c:17
void clkinit(void)
Definition: clkinit.c:15
int32 ndefers
未処理の延期プロセスの数
Definition: resched.h:19
pid32 currpid
現在実行中のプロセスのID
Definition: initialize.c:32
qid16 newqueue(void)
グローバルキューテーブルにキューを割り当て、テーブルを初期化する。
Definition: newqueue.c:15
プロセステーブル(32bitsの倍数)。
Definition: process.h:85
#define CONSOLE_RESET
コンソール(コンソールカラー、文字、ポジション)をリセットするためのエスケープシーケンス ...
Definition: initialize.c:34
struct sentry semtab[NSEM]
セマフォテーブルエントリ
Definition: initialize.c:25
int32 scount
セマフォカウント(負の値(-N)の場合は、キューにN個の待機プロセスがある。それ以外はキューが空である) ...
Definition: semaphore.h:24
#define S_FREE
セマフォテーブルエントリが利用可能
Definition: semaphore.h:11
#define NULLCH
NULL文字(NULL終端)
Definition: kernel.h:70
char * getstk(uint32)
スタックメモリを割り当て、最上位のワードアドレスを返す。
Definition: getstk.c:25
char * prstkptr
保存されたスタックポインタ。
Definition: process.h:92
syscall init(did32)
デバイスとデバイスドライバを初期化する。
Definition: init.c:17
Here is the call graph for this function:
Here is the caller graph for this function:

Variable Documentation

◆ _end

void* _end

XINUコードの終わり

◆ currpid

pid32 currpid

現在実行中のプロセスのID

現在実行中のプロセス。

Definition at line 32 of file initialize.c.

Referenced by arp_resolve(), dnslookup(), getpid(), icmp_recv(), irq_dispatch(), receive(), recvclr(), recvtime(), resched(), sleepms(), sysinit(), udp_recv(), udp_recvaddr(), and wait().

◆ memlist

struct memblk memlist

フリーメモリブロックのリスト

フリーメモリリストの先頭

Definition at line 27 of file initialize.c.

Referenced by freemem(), getmem(), getstk(), meminit(), nulluser(), printFreeList(), and printMemUse().

◆ prcount

int prcount

生存しているプロセスの総数

現在アクティブのプロセス。

Definition at line 30 of file initialize.c.

Referenced by create(), kill(), and sysinit().

◆ proctab

struct procent proctab[NPROC]

プロセステーブルエントリ

プロセステーブル。

Definition at line 23 of file initialize.c.

Referenced by addargs(), chprio(), create(), getprio(), irq_dispatch(), kill(), newpid(), printMemUse(), ready(), receive(), recvclr(), recvtime(), resched(), resume(), send(), shell(), sleepms(), suspend(), sysinit(), unsleep(), wait(), and xsh_ps().

◆ semtab

struct sentry semtab[NSEM]

セマフォテーブルエントリ

セマフォテーブルエントリのextern宣言

Definition at line 25 of file initialize.c.

Referenced by kill(), newsem(), semcount(), semcreate(), semdelete(), semreset(), signal(), signaln(), sysinit(), and wait().