読んでもあまりおもしろくない、らしい
P430
ken/main.c
/* * Initialization code. * Called from m40.s or m45.s as * soon as a stack and segmentation * have been established. * Functions: * clear and free user core * find which clock is configured * hand craft 0th process * call all initialization routines * fork - process 0 to schedule * - process 1 execute bootstrap * * panic: no clock -- neither clock responds * loop at loc 6 in user mode -- /etc/init * cannot be executed. */ main() { extern schar; register i, *p; /* * メモリとスワップ領域の初期化 */ updlock = 0; i = *ka6 + USIZE; UISD->r[0] = 077406; for(;;) { UISA->r[0] = i; if(fuibyte(0) < 0) break; clearseg(i); /* メモリが1バイトずつ増えていくイメージ */ maxmem++; /* 物理領域 */ /* 空き領域が増えていく */ mfree(coremap, 1, i); i++; } if(cputype == 70) /* メモリの領域がわかる */ for(i=0; i<62; i=+2) { UBMAP->r[i] = i<<12; UBMAP->r[i+1] = 0; } printf("mem = %l\n", maxmem*5/16); printf("RESTRICTED RIGHTS\n\n"); printf("Use, duplication or disclosure is subject to\n"); printf("restrictions stated in Contract with Western\n"); printf("Electric Company, Inc.\n"); maxmem = min(maxmem, MAXMEM); /* スワップの領域確保 */ mfree(swapmap, nswap, swplo); /* * クロック装置の初期化 */ UISA->r[7] = ka6[1]; /* io segment */ UISD->r[7] = 077406; lks = CLOCK1; if(fuiword(lks) == -1) { lks = CLOCK2; if(fuiword(lks) == -1) panic("no clock"); } /* * プロセス0(絶対に死なないプロセス)の生成 */ proc[0].p_addr = *ka6; proc[0].p_size = USIZE; proc[0].p_stat = SRUN; proc[0].p_flag =| SLOAD|SSYS; u.u_procp = &proc[0]; /* * 資源の初期化 */ *lks = 0115; /* コンソールの初期化 */ cinit(); /* ブロックの初期化 */ binit(); /* スーパーブロックの初期化 */ iinit(); rootdir = iget(rootdev, ROOTINO); rootdir->i_flag =& ~ILOCK; u.u_cdir = iget(rootdev, ROOTINO); u.u_cdir->i_flag =& ~ILOCK; /* * make init process * enter scheduling loop * with system process */ /* プロセス1の作成 */ if(newproc()) { expand(USIZE+1); estabur(0, 1, 0, 0); copyout(icode, 0, sizeof icode); /* * Return goes to loc. 0 of user init * code just copied out. */ return; } sched(); }
bssとスタックの間の隙間を増やしてメモリを確保する breakとexpand
$ find sys/ -type f | xargs grep "lks" -n sys/dmr/dp.c:8: * device it talks to, which is to say most of the protocol sys/dmr/hs.c:46: register mblks; sys/dmr/hs.c:49: mblks = 1024; /* RJS03 */ sys/dmr/hs.c:51: mblks = 2048; /* RJS04 */ sys/dmr/hs.c:52: if(bp->b_blkno >= mblks) { sys/ken/clock.c:35: *lks = 0115; sys/ken/main.c:90: lks = CLOCK1; sys/ken/main.c:91: if(fuiword(lks) == -1) { sys/ken/main.c:92: lks = CLOCK2; sys/ken/main.c:93: if(fuiword(lks) == -1) sys/ken/main.c:111: *lks = 0115; sys/systm.h:47:int *lks; /* pointer to clock device */
クロックとは、定期的に上がってくる何か。PCの動きと同期しておらず、むしろ同期しないほうがいい
/etc/init
- 登録されている端末に対しプロセスを生成
- 各プロセスは端末のダイアルアップ接続、ユーザのログインを待つ。ログインするとシェルプログラムが起動
- /etc/initはその後無限ループに入り、宙に浮いたプロセスを処理し続ける
matome
- proc[0]はシステムプロセス
- proc[1]は/etc/initを実行する
経緯
Lions本は読みづらいから読みやすく書き直そう