biosboot(古い内容で書きかけだったりする)
biosbootの処理概要
biosbootはOpenBSDパーティションのPBRに書込まれているプログラムです。ここからkernelイメージをロードして....と行きたいところですが、bisobootはいきなりkernelイメージをロードしません。その前にCPU周りの初期化やHWの検出を行い、kernelのプログラムが動作できる状態を作る必要があるからです。bisobootは、基本的な初期化を行なうboot loaderdを読込み、boot loaderdがkernelを立上げる事になります。
PBRの先頭には、Bootstrap codeへのjump codeが書かれている。mbrの処理から処理が移った最初にこれが実行される。

2. Segment Registerの設定
コードセグメントの調整
ロングジャンプを行ない、CS Registerの値をBOOTSEGの値に再設定する。
スタックの設定
Stack Segment register(SS)を0x0000に設定した後、Stack Pointer Register(SP)をBOOTSTACKOFFに設定する。これによりStackは0x0000:0x7BFCからとなる。(コメントには0x079FFからと書いてあるが間違え?でも0x7BFCだとrelocate MBRが破壊されてしまう)
データセグメントの設定
Data Segment Register(DS)レジスタをBOOTSEGに設定
address   register
0000:0000(0x00000)   ← ss:0x0000
07A0:0000(0x07A00) relocation MBR
07B0:01FF(0x07CFF)
stack??
← sp:0x7BFC
07C0:0000(0x07C00)
07C0:01FF(0x07DFF)
biosboot ← cs,ds:0x07C0
   
図 1.5: 設定後のRegister      

56-58行
Bootstrap Loaderへジャンプ
90行目にジャンプする。
61行
OEM Nameのデータ("OpenBSD")
64-73行
BPBのデータ
75-83行
EBPBのデータ
89-90行
コードセグメントの調整
ロングジャンプをすることにより、Code SegmentをBOOTSEGに再設定する。
96行〜101行
スタックの設定
割り込み禁止。
Stack Segment register(SS)を0に設定。
Stack Pointer Register(ESP)をBOOTSTACKに設定。
Stackは0x0000:0xfffc
設定後、割り込み許可に戻す。
103行〜105行
データセグメントの設定
Data Segment Register(DS)ををBOOTSEGに設定。
120-121行
コンソールに"reading boot"を表示
reading boot
123行〜158行
boot プログラムの読込み
ここではINT13Hを使いbootプログラムの読出しを行う
読出しに使う情報はblock_countblock_tableに格納されている。
block_count読込み回数
block_tableHDD上の読込み位置と読込みセクター数がかかれていて、
最大64個エントリー出来る
size意味
wordcylinder/sector
bytehead
byte読込むセクター数
124行〜125行
転送先の設定(ES register)
読込んだプログラムの転送先(ES register)を0x4000(LOADADDR >> 4)番地に設定
LOADADDRはMakeから渡される定数であり、sys/arch/i386/stand/Makefile.incに0x4000と定義されている
127行〜129行
HDDからの読込み回数を設定
block_count から読込み回数(CX register)を設定
130行〜142行
HDDの読出し位置を設定
読出し回数(CX register)をスタックに待避
progress indicatorを画面に表示
reading boot ....
block_tableから読出し場所の cylinder/sector (CX register), head (DH register),読込むセクター数(AH register)を設定
ドライブ番号(DL register)はMBRで設定した値を使用
143行〜144行
INT13Hの実行
INT13H実行してファイルを読込む。
146行〜149行
エラー時の処理
INT13Hがエラーの場合"Read error"を画面に表示してHALTする。
reading boot ....
Read error
151行〜158行
次の転送先を計算
読出しsector数 * 512 byte = 次の転送先のオフセット(BX register)
読出し回数(CX register)をスタックから取出し、Loop命令を実行
164行〜176行
boot プログラムのmagic番号をチェック
bootプログラムの最初の4byteにはELF magic NO("\177ELF")が格納されている。
ELF magic NOを読込み、2byte目がLFMAGICかチェック
ELF magic NOが不一致の場合、"Bad magic"と画面に表示してHALTする
Using Drive: 0 Partition: 1
reading boot ....
Bad magic
188行〜193行
Boot プログラムに処理を移行
起動ドライブ番号をスタックに格納
Boot Magic番号:BOOTMAGICをスタックに格納
BOOTMAGICはMakeから渡される定数であり、sys/arch/i386/stand/Makefile.incに0xc001d00dと定義されている
Boot プログラム(LINKADDR >> 4)番地にジャンプ
LINKADDRCはMakeから渡される定数であり、Bootプログラムの開始アドレスを示していて、sys/arch/i386/stand/Makefile.incに0x40120と定義されている
Last modified: Tue May 23 18:54:44 JST 2006