DOSモバでGRUB

結局のところA20問題だった。
よって、DOSモバでGRUBを動かすには以下の手順が必要になる。

ビルド

  1. GRUB0.97を展開して./configureする。GRUB2はVGAに依存しているためおそらく使えない。
  2. MakefileのSTAGE2_CFLAGSをSTAGE2_CFLAGS = -Os -fno-stack-protector -march=i386 -m32とする。そうでなければ686命令コードを出力するため、モバイルギアの486では動作しない
  3. stage2/asm.Sを以下のように変更する
3:      /* use keyboard controller */
        pushl   %eax

        call    gloop1
        movb $2,%al /* 以下3行を追加 */
        outb $0x92
        call gloop1

インストール

  1. CFをFAT16でフォーマットする。低容量のCFはFAT12でフォーマットされているかもしれない。また一部のCFは完全に起動しない。もし、GRUB等が起動せず、通常のUnishellが起動するようなら、CFの交換を検討する(Sundiskは比較的よく動作する)。
  2. CFをマウントし、/boot/grubを準備する。適切なmenu.lstを準備する必要もある(キーボードが効かないため)。
  3. ホスト側でgrubを起動し、普通にセットアップ*1
  4. bviなりなんなりでMBRシグニチャを修正する http://d.hatena.ne.jp/mjt/20081023/p1
  5. CFを挿した状態で電源を投入する。すでに電源が入っている状態であればリセットする。

A20問題

http://www.win.tue.nl/~aeb/linux/kbd/A20.html
ここで説明されているIBM_L40の対応がモバイルギアにも必要。
他に、認識されているRAM容量がおかしい等の問題がある。

*1:http://www.gentoo.org/doc/ja/handbook/handbook-x86.xml?part=1&chap=10 gentooの文章が参考になる。しかし、通常の方法でコンパイルされたGRUBはほぼ間違いなく動作しないことに注意