研究室の端末 PC はほとんどが hp 製品で、PentiumD 以降のプロセッサは EM64T なので、FreeBSD/amd64 を動かそうと思って準備している (いまは FreeBSD/i386 だが、diskless なので、親玉サーバでユーザ環境を作って DHCP の設定を変えるだけだ)。
ところが、最新の dx7400 を除くモデル (PentiumD な dc7600 や、Core2Duo な dx7300) では FreeBSD/i386 は起動するものの、FreeBSD/amd64 は kernel panic してしまう。
SMAP、というのはキムタクのあれではなくて、BIOS からもらえる System Memory mAP なのだが、これが hp のちょっと前の世代のマシンではうまく取得できないらしく、google で探すとかなりいろいろでてくるのだが、解決した気配はない。わかったことは、
– FreeBSD/i386 なら起動する、というマシンは loader prompt で smap コマンドを叩いても、何も出ない。つまり、FreeBSD/i386 でもちゃんと取得できていない (loader は同じみたいだしね)
– FreeBSD/amd64 がちゃんと起動するマシンは smap コマンドを叩くとちゃんとリストが出る
ということだ。
で、この panic を出しているのは
– sys/amd64/amd64/machdep.c の 898 行めで、loader が取得した値をそのまま使っている
– 対応するところは i386 だと、sys/i386/i386/machdep.c の 1751 行めあたりで、loader に頼らずに自力で取りにいっている
というわけだ。
さあて、どうするか。
私物の ThinkPad の SMAP table はこんな感じ。
SMAP type=01 base=00000000_00000000 len=00000000_0009d800 SMAP type=02 base=00000000_0009d800 len=00000000_00002800 SMAP type=02 base=00000000_000d2000 len=00000000_00002000 SMAP type=02 base=00000000_000e0000 len=00000000_00020000 SMAP type=01 base=00000000_00100000 len=00000000_bf5b0000 SMAP type=03 base=00000000_bf6b0000 len=00000000_0001c000 SMAP type=04 base=00000000_bf6cc000 len=00000000_00034000 SMAP type=02 base=00000000_bf700000 len=00000000_00100000 SMAP type=02 base=00000000_bf800000 len=00000000_00800000 SMAP type=02 base=00000000_f0000000 len=00000000_04000000 SMAP type=02 base=00000000_fec00000 len=00000000_00010000 SMAP type=02 base=00000000_fed00000 len=00000000_00000400 SMAP type=02 base=00000000_fed14000 len=00000000_00004000 SMAP type=02 base=00000000_fed18000 len=00000000_00001000 SMAP type=02 base=00000000_fed19000 len=00000000_00001000 SMAP type=02 base=00000000_fed1c000 len=00000000_00004000 SMAP type=02 base=00000000_fed20000 len=00000000_00070000 SMAP type=02 base=00000000_fee00000 len=00000000_00001000 SMAP type=02 base=00000000_ff000000 len=00000000_01000000 SMAP type=01 base=00000001_00000000 len=00000000_3c000000
http://www.uruk.org/orig-grub/mem64mb.html に、int 15h:e820h の説明がある。
Linux を dx7300 で起動してみると、
BIOS-provided physical RAM map: BIOS-e820: 00000000_00000000 - 00000000_0009fc00 (usable) BIOS-e820: 00000000_0009fc00 - 00000000_000a0000 (reserved) BIOS-e820: 00000000_000e8000 - 00000000_00100000 (reserved) BIOS-e820: 00000000_00100000 - 00000000_7efb1d00 (usable) BIOS-e820: 00000000_7efb1d00 - 00000000_7f000000 (reserved) BIOS-e820: 00000000_f4000000 - 00000000_f8000000 (reserved) BIOS-e820: 00000000_fec00000 - 00000000_fed40000 (reserved) BIOS-e820: 00000000_fed45000 - 00000001_00000000 (reserved)
みたいにちゃんと SMAP が取れているので、loader を hack すればなんとかなるかな?