-----------
boot プログラムを作成するときには build プログラムと boottable プログ
ラムという 2 つの補助プログラムを使います。
まず、boottable プログラムについて説明します。
i386 CPU 上でプログラムを動かすためには、セグメントレジスタを設定する
必要があります。セグメント自体は 8086 からありましたが、i386 ではセグ
メントレジスタの値としてアドレスではなく、GDT あるいは LDT というテー
ブルへのインデックスを入れるようになっています。
そのため、i386 でプログラムを動かすには、まず GDT の設定をする必要があ
ります(GDT を使う場合には LDT の設定をする必要がありません)。GDT は、
それぞれの要素に次の情報を含んだテーブルです。
o オフセットアドレス
o セグメントのサイズ
o セグメントの属性 (アクセス情報等)
boottable は、GDT の内容を作成するプログラムです。
引数として GDT の設定を記述したファイルを指定するとそのファイルに従った
GDT が作成されます。
とりあえず B-Free OS 用に次のように設定しています。
00000000:00000:00 未使用
00000000:FFFFF:9A カーネル(OS) テキスト(プログラム)用
00000000:FFFFF:92 カーネル(OS) データ用
00000000:FFFFF:FA ユーザプログラムテキスト(プログラム)用
00000000:FFFFF:F2 ユーザプログラムデータ用
B-Free OS では、仮想メモリの管理はページ単位で行っており、セグメント機
構はほとんど使っていません。そのため、GDT の設定も 4G の領域をそのまま
使うというだけになっています。
今回、PC9801 から IBM PC 互換機に移植するにあたって、この boottable プ
ログラムは変更していません (CPU が同じですから。。。)
-----------
次に build プログラムについて説明します。
移植記の第2回で説明したように、boot フロッピィは、5 つの要素に分かれ
ています。
(1) 1st boot
(2) 2nd boot 情報部分 (512 バイト)
(3) GDT 情報 (8192 バイト)
(4) ページ情報 (20480 バイト)
(5) 2nd boot のプログラム部分
build プログラムは、boot フロッピィのイメージを作成します。
動作としては、
(1) 1st boot の書き込み
(2) 2nd boot 情報(ダミー)の書き込み
(3) GDT の書き込み
boottable というファイルの内容をそのまま書き込む
(4) ページ情報を書き込む
これは、0 クリアしているだけです。実際の仮想ページの
情報は、2nd boot が作成します。
(5) 2nd boot 本体の書き込み
(6) 最後に (2) で書き込んだ 2nd boot 情報の部分に本当の 2nd
boot の情報を書き込む
というようになります。
元々の PC9801 では、フロッピィのブロックサイズが 1024 バイトのものを想
定していました。そのため、2nd boot の情報部分などは 1024 バイトになっ
ていました。今回 IBM PC 互換機に移植するにあたっては、512 バイト単位に
なるように変更しています(というかこれから変更します)。
--- B-Free プロジェクト実行中! 詳細はこの WWW へ -> (http://www.b-free.orient.co.jp/)内藤隆一 (ggc00661@niftyserve.or.jp/night@bfree.rim.or.jp)