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がちゃんと認識していないなぁ。

正確にはVirtualBoxNICAMD 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",