|
GRUB stage1 MBRのチェックについて MBRのサイズは512 byteです。 code部 446(byte)と、パーティション情報 16(byte)x4、boot signature 2(byte)の計512byteです。 grub-0.97のstage1.hから「STAGE1_BPBEND=0x3e」とあります。 0x0B〜 BIOS Parameter Block 0x24〜 Extended BIOS Parameter Block(extended=拡張) cliについてのコメント /* * This is a workaround for buggy BIOSes which don't pass boot * drive correctly. If GRUB is installed into a HDD, check if * DL is masked correctly. If not, assume that the BIOS passed * a bogus value and set DL to 0x80, since this is the only * possible boot drive. If GRUB is installed into a floppy, * this does nothing (only jump). */ おおよその訳です。 これは正しくブートドライブを通過しないバグのあるBIOSのための次善策です。 GRUBがHDDにインストールされるなら、%dlが正しくマスク(割り込み禁止= cli によるEFLAGSレジスタのIFフラグのクリア) がされているかチェックしてください。 そうでなければ、BIOSにバグがあると仮定してください。 そして、これが唯一のブート可能なドライブとして、0x80を%dlに設定してください。(= movb $0x80, %dl) GRUBがフロッピーディスクにインストールされる場合は、この命令は入りません。(単にジャンプするのみです)。 HD起動の場合、stage1で最初にすることは、0x80が%dlに入っているかどうかのチェックです。(= testb $0x80, %dl) 00 = Do not use for booting. 80 = System partition. $ echo -ne "partition" ;od -j 446 -N 64 -tx1 /home/labunix/mbr/sample.img | cut -b 9-55 | nl -n ln -w 1 -s":" | grep ":80" /* do not probe LBA if the drive is a floppy */ /* check if LBA is supported */ movb $0x41, %ah movw $0x55aa, %bx int $0x13 拡張int 13h の利用可否に関わらず、41hをテストします。 int 13hだった場合は、CHSの41hをテストすることになりますが、その結果については何も書かれていませんので、 フロッピーの場合、つまり、CHS方式を使う場合は、テストしないでくださいということです。 拡張int 13hだった場合は、0xAA55を使ってLBA方式が使えるかどうかのテストになります。 /* * Determine the hard disk geometry from the BIOS! * We do this first, so that LS-120 IDE floppies work correctly. */ movb $8, %ah int $0x13 拡張int 13hのテストに失敗した場合は、CHS方式を試します。 CHSモードで異常があると0xAA55が設定されていないか再度確認します。 8h と、int 13hでドライブパラメータの読み込みテストを行い、 %dlが0x80でないか再確認して失敗すると、 「GRUB Hard Disk Error」を表示します。 もうこの時点ではエラーメッセージをHD用にするかFD用にするかの判断をしているのです。 つまり、HDから起動する場合には、少なくとも1つのパーティションが0x80にセットされていて、 MBRに0xAA55がセットされていることが必要で、このエラーはHD固有のものです。 $ echo -n "boot signature check ... ";od -vtx1 -j 510 -N 16 sample.img |cut -b 9-55 | grep "55 aa" > /dev/null && echo "good" || echo "bad" HD用にLBAの計算をします。 LBA計算に失敗すると、「GRUB Geom Error」を表示します。 FD用にCHSの計算をします。 CHSのSectorが0の場合は「GRUB Floppy Error」を表示して停止します。 STAGE1_PARTSTARTからSTAGE_PART_ENDまでをループします。 「0x1fe-0x1be」=0x40=64byte 最大、4つの基本パーティションからの起動を確認することになります。 LBAの場合 movb $0x42, %ah int $0x13 拡張int 13h でドライブからセクターを読みます。 CHSの場合 xorw %bx, %bx /* %bx = 0, put it at 0 in the segment */ movw $0x0201, %ax /* function 2 */ int $0x13 int 13hでドライブからセクターを読みます。 ワード単位の %ds(2byte)を0x100(256)回stage2セグメントにコピーして、 stage2のアドレスにジャンプ、制御を移します。 拡張int 13h での読み込みに失敗した場合は、「GRUB Read Error」を表示します。 NT Boot signatureについて . = _start() + STAGE1_WINDOWS_NT_MAGIC(0x1b8) This is where an MBR would go if on a hard disk. The code here isn't even referenced unless we're on a floppy. Kinda sneaky, huh? ここはHD上のMBR(=MasterBootRecord)なのですから、 どんなシステムでも必ず通る場所です。 なんて卑怯なことをするのでしょう? FD起動のようにOS専用で着脱可能ではなく、すべてのOSにとってMBRは共有スペースのため、 OSに依存したルールを作ることは避けるべきといったところでしょうか。 戻る |