GRUB stage1

コメントから読む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に依存したルールを作ることは避けるべきといったところでしょうか。


戻る