linux-0.01-rm-3.5をQEMU上で実行

Linux-0.01を最近のLinux上でビルドできるようにする「Linux 0.01 remake(linux-0.01-rm)」というプロジェクトがあります。


Debian 7.7(wheezy)上で試してみました。


結論としては、以下のエラーでブートは完了しないのですが、

Kernel panic: Unexpected HD interrupt

2つ、解決した問題があるので、それもメモしておきます。

  • 問題1: ビルド時に、"undefined reference to `columns'"
  • 問題2: 実行時に、何も表示されない(スケジューラ内でループ)

ファイルダウンロードから、ビルドまで

現時点で最新の3.5(linux-0.01-rm-3.5.tgz)を、以下からダウンロード

また、ルートファイルシステムイメージ(hd_oldlinux.img.zip)を、以下からダウンロード


展開

$ tar zxf linux-0.01-rm-3.5.tgz
$ unzip hd_oldlinux.img.zip
$ cd linux-0.01-rm-3.5/


ビルドに必要なパッケージをインストール

$ sudo apt-get install bin86 kvm qemu gcc build-essential


ビルド

$ make
  • ここで問題1が発生


なお、以上は、ほぼ以下の記事の受け売りです。

問題1: ビルド時に、"undefined reference to `columns'"

「columns」の定義箇所のstaticを外して、グローバル変数化が簡単なワークアラウンドだと
以下の記事のコメント欄で紹介されています。
(記事の筆者の方が、linux-0.01-rmプロジェクトにメールを送った返信のようです)


なので、以下の修正で解決しました

diff --git a/kernel/console.c b/kernel/console.c
index d08d223..11dbd18 100644
--- a/kernel/console.c
+++ b/kernel/console.c
@@ -33,7 +33,8 @@ static unsigned long scr_end=SCREEN_START+LINES*COLUMNS*2;
 static unsigned long pos;
 static unsigned long x,y;
 static unsigned long top=0,bottom=LINES;
-static unsigned long lines=LINES,columns=COLUMNS;
+static unsigned long lines=LINES;
+unsigned long columns=COLUMNS;
 static unsigned long state=0;
 static unsigned long npar,par[NPAR];
 static unsigned long ques=0;


これで、ビルドはできるようになりました。

問題2: 実行時に、何も表示されない(スケジューラ内でループ)

以下のコマンドで、QEMU上で実行します。

$ qemu -hdb ../hd_oldlinux.img -fda Image -boot order=ac


ですが、ブートログが何も表示されない状態。
QEMUのモニタ機能でEIPを見ると、スケジューラ内でループしていました。


どういう経緯か忘れましたが、以下の記事を参考に

以下のように修正しました

diff --git a/mm/memory.c b/mm/memory.c
index 24c9209..3ce64b6 100644
--- a/mm/memory.c
+++ b/mm/memory.c
@@ -63,7 +63,8 @@ __asm__ __volatile__("std ; repne ; scasw\n\t"
 	"leal 4092(%%edx),%%edi\n\t"
 	"rep ; stosl\n\t"
 	"movl %%edx,%%eax\n"
-	"1:"
+	"1:\n\t"
+	"cld"
 	:"=a" (__res)
 	:"0" (0),"i" (LOW_MEM),"c" (PAGING_PAGES),
 	"D" (mem_map+PAGING_PAGES-1)


ですが、今度は冒頭でも書いた通り、以下のエラーが出るようになり、
これは未解決です。

Kernel panic: Unexpected HD interrupt