読者です 読者をやめる 読者になる 読者になる

by shigemk2

当面は技術的なことしか書かない

main()

Unix

読んでもあまりおもしろくない、らしい

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

  1. 登録されている端末に対しプロセスを生成
  2. 各プロセスは端末のダイアルアップ接続、ユーザのログインを待つ。ログインするとシェルプログラムが起動
  3. /etc/initはその後無限ループに入り、宙に浮いたプロセスを処理し続ける

matome

  • proc[0]はシステムプロセス
  • proc[1]は/etc/initを実行する

経緯

Lions本は読みづらいから読みやすく書き直そう