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.displan9.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",