This is an archive of past FreeBSD releases; it's part of the FreeBSD Documentation Archive.
原作: 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 に関わるもの + その他) の後ろの実メモリは, 通常の仮想記憶ページの形で利用可能となり, グローバルな空きページリストに追加されます.