原作: Jörg Wunsch
<joerg@FreeBSD.ORG>
.
16 Apr 1995.
訳: 渡辺 智雄
<tomo@jp.FreeBSD.org>
.
29 Oct 1996.
FreeBSDがi386プラットフォーム上でどのようにメモリを使うかに ついての説明です.
ブート部分は0:0x7c00
にロードされ, すぐに自分自身を
0x7c0:0
に移します. (これは手品ではなく, 単なる%cs
セレクタのための調節であり, ljmp
により行われます. )
それから最初の15セクタを0x10000
(biosbootのMakefileのなかの
BOOTSEG部分)にロードし, 作業領域のスタックを0x1fff0
以下に
セットします. このあと, boot2 に飛びます. つまり, boot1 自身と
(ダミーの) DOS パーティションテーブルを飛び越えて, %csセレクタを
調節します---この時点ではまだ16ビットモードです.
boot2はブートファイルを要求し, a.out
ヘッダを調べます.
0x00ffffff
によってファイルエントリポイントを
(通常は0xf0100000
に)マスクし, ロードします.
このため, 通常のロードポイントは1MB(0x00100000
)になります.
ロードしている間, リアルモードでBIOSを使うため, ブートコードは,
リアルモードとプロテクトモードの間を行ったり来たりします
(訳注: これは, BIOSがリアルモード用に書かれていて,
ロードすべき領域がリアルモードではアクセスできない1MBより上位の
アドレスであることから, ブートコードがリアルモードと
プロテクトモードを切り替えながら動作するためです).
ブートコード自身はプロテクトモードで%cs
と%ds/%es
用に
セグメントセレクタ0x18
と0x20
を使い,
リアルモードに戻るのに0x28
を使います.
最終的にカーネルはアドレス空間全体をカバーできるようなダミーの
ディスクリプタを参照して%cs
0x08
と
%ds/%es/%ss
0x10
でスタートします.
カーネルはそのロードポイントで起動されます. 別の(高位)アドレスにリンクされるので, ページテーブルやページディレクトリなどが適切に設定され, ページングが有効になり, カーネルがリンクされたアドレスで 動作するようになるまでは, カーネルはロードアドレスからの 相対アドレス (PIC: position independent code) を用いて 実行されなければなりません.
寄贈: David Greenman
<dg@FreeBSD.ORG>
.
16 Apr 1995.
カーネルの BSS セグメントの直後の物理ページ (実メモリ) に
proc0 (訳注: プロセス番号 0, swapper) のページディレクトリや
ページテーブル, Uページが配置されます.
仮想記憶機構が初期化された少しあと,
0x1000-0x9ffff
の実メモリとカーネル
(text + data + bss + 上記の proc0 に関わるもの + その他)
の後ろの実メモリは, 通常の仮想記憶ページの形で利用可能となり,
グローバルな空きページリストに追加されます.