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