再びuserinit

再びuserinit関数に戻って.テキストセグメントは次のように設定している.initcodeってのが実行コードらしい.

port/portdat.h
  750: extern  uchar    initcode[];

pc/main.c
  258:         s = newseg(SG_TEXT, UTZERO, 1);
  259:         s->flushme++;
  260:         p->seg[TSEG] = s;
  261:         pg = newpage(0, 0, UTZERO);
  262:         memset(pg->cachectl, PG_TXTFLUSH, sizeof(pg->cachectl));
  263:         segpage(s, pg);
  264:         v = tmpmap(pg);
  265:         memset(v, 0, BY2PG);
  266:         memmove(v, initcode, sizeof initcode);
  267:         tmpunmap(v);

このinitcodeがどこで作られるかというと,_mainが特殊な実行ファイルを作って,sedで配列に流し込んでいるのである.

pc/mkfile
  119: init.h:         ../port/initcode.c init9.c
  120:         $CC ../port/initcode.c
  121:         $CC init9.c
  122:         $LD -l -R1 -o init.out init9.$O initcode.$O /386/lib/libc.a
  123:         strip init.out
  124:         {echo 'uchar initcode[]={'
  125:          cat init.out | xd -1x |
  126:                 sed -e 's/^[0-9a-f]+ //' -e 's/ ([0-9a-f][0-9a-f])/0x\1,/g'
  127:          echo '};'} > init.h