Native Inferno
Hosted Infernoと呼ぶのが正しいのかわからないけど、InfernoはホストOS上で動かすのが一般的だと思う。でも、ベアマシン上でも当然Native Infernoが動作する。id:m-shibaさんのエントリで触れられていたので、試してみることにした。環境はQEMUじゃなくてVirtualBox 2.2.4 on MacOS X 10.4.11。Infernoのコンパイルは64bit環境だとうまくいなかったので、VirtualBox上のUbuntu 9.04 i386で行っている。
ブートローダ関連のソースコードはos/boot/pc以下、ネイティブカーネルはos/pc以下に存在する。
まずは、PBS(PCパーティションブートセレクタプログラム)と9load(カーネルローダ)をコンパイルする。ちなみに起動シーケンスはというと、電源が投入後にPBSが実行され、続いて9loadが実行される。9loadはplan9.iniファイルを読み込んで、カーネルをロードすることになる。ここまではPlan9と同じ。init0プロセスはDis VMを起動し、osinit.disを実行する。
$ cd os/boot/pc $ mk pbs.install 9load.install
続いてカーネルをコンパイルする。まずはミニマムな環境を構築することにする。成功するとipcというカーネルが生成される。
$ cd os/pc $ vi pc $ mk
コンフィグレーションファイルpcの差分は次の通り。イーサネットドライバは、VirtualBoxで必要なether79c970を追加したほかは消してしまった。
--- pc.ORIG 2009-06-17 02:25:25.000000000 +0900 +++ pc 2009-06-17 02:25:25.000000000 +0900 @@ -48,10 +48,11 @@ kern link - ether2114x pci + ether79c970 pci +# ether2114x pci # ether82557 pci - ether83815 pci - etherelnk3 pci +# ether83815 pci +# etherelnk3 pci ps2mouse ethermedium # pppmedium ppp compress @@ -70,7 +71,7 @@ math init - wminit + shell code int kernel_pool_pcnt = 10; @@ -79,7 +80,7 @@ int image_pool_pcnt = 40; int cflag=0; int swcursor=0; - int consoleprint=0; + int consoleprint=1; port alarm @@ -137,3 +138,5 @@ /dis/lib/daytime.dis /dis/lib/auth.dis /dis/lib/ssl.dis + /dis/lib/arg.dis + /dis/lib/filepat.dis
plan9.iniを新規作成する。ここではフロッピーから圧縮カーネルipc.gzをロードすると指定するだけ。
bootfile=fd0!ipc.gz
フロッピーイメージの作成はInferno上で行う。
$ emu ; cd os/pc ; gzip ipc ; disk/format -b /Inferno/386/pbs -df inferno.img /Inferno/386/9load plan9.ini ipc.gz
これでフロッピーイメージinferno.imgが生成されるので、VirtualBoxに食わせてブートする。きっとシェルが起動するはずだ。Ethernetがちゃんと認識していないなぁ。
正確にはVirtualBoxのNICはAMD PCnet/FAST III (79c973)になる。デフォルトのカーネルコンフィグレーションにはこのドライバが入ってないので、これを追加し、ether79c970.cに一行追加すればOK。ちゃんと動いているかは確認していないけど、#l0デバイスファイルは見えるようになる。
--- ether79c970.c.orig 2009-06-17 02:23:28.000000000 +0900 +++ ether79c970.c 2009-06-17 02:23:28.000000000 +0900 @@ -540,6 +540,7 @@ switch(x&0xFFFFFFF){ case 0x2420003: /* PCnet/PCI 79C970 */ case 0x2621003: /* PCnet/PCI II 79C970A */ + case 0x2625003: /* PCnet/FAST III 79C973 */ break; default: print("#l%d: unknown PCnet card version %.7ux\n",