再び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