<!-- $Id: memoryuse.sgml,v 1.4 1997/02/22 13:01:27 peter Exp $ -->
<!-- The FreeBSD Japanese Documentation Project -->
<!-- Original revision: 1.9 -->

<sect><heading>PC におけるメモリの利用<label id="memoryuse"></heading>

<p><em>原作: &a.joerg;.<newline>
  16 Apr 1995.</em>
<p><em>訳: &a.tomo;. <newline>
  29 Oct 1996.</em>

<em>FreeBSDがi386プラットフォーム上でどのようにメモリを使うかに
ついての説明です. </em>

ブート部分は<tt>0:0x7c00</tt>にロードされ, すぐに自分自身を
<tt>0x7c0:0</tt>に移します. (これは手品ではなく, 単なる<tt>%cs</tt>
セレクタのための調節であり, <tt>ljmp</tt>により行われます. )

それから最初の15セクタを<tt>0x10000</tt>(biosbootのMakefileのなかの
BOOTSEG部分)にロードし, 作業領域のスタックを<tt>0x1fff0</tt>以下に
セットします. このあと, boot2 に飛びます. つまり, boot1 自身と
(ダミーの) DOS パーティションテーブルを飛び越えて, %csセレクタを
調節します---この時点ではまだ16ビットモードです. 

boot2はブートファイルを要求し, <tt>a.out</tt>ヘッダを調べます. 
<tt>0x00ffffff</tt>によってファイルエントリポイントを
(通常は<tt>0xf0100000</tt>に)マスクし, ロードします. 
このため, 通常のロードポイントは1MB(<tt>0x00100000</tt>)になります. 
ロードしている間, リアルモードでBIOSを使うため, ブートコードは, 
リアルモードとプロテクトモードの間を行ったり来たりします
(訳注: これは, BIOSがリアルモード用に書かれていて, 
ロードすべき領域がリアルモードではアクセスできない1MBより上位の
アドレスであることから, ブートコードがリアルモードと
プロテクトモードを切り替えながら動作するためです). 

ブートコード自身はプロテクトモードで<tt>%cs</tt>と<tt>%ds/%es</tt>用に
セグメントセレクタ<tt>0x18</tt>と<tt>0x20</tt>を使い, 
リアルモードに戻るのに<tt>0x28</tt>を使います. 
最終的にカーネルはアドレス空間全体をカバーできるようなダミーの
ディスクリプタを参照して<tt>%cs</tt> <tt>0x08</tt>と
<tt>%ds/%es/%ss</tt> <tt>0x10</tt>でスタートします. 

カーネルはそのロードポイントで起動されます. 
別の(高位)アドレスにリンクされるので, 
ページテーブルやページディレクトリなどが適切に設定され, 
ページングが有効になり, カーネルがリンクされたアドレスで
動作するようになるまでは, カーネルはロードアドレスからの
相対アドレス (PIC: position independent code) を用いて
実行されなければなりません. 

<em>寄贈: &a.davidg;.<newline>
  16 Apr 1995.</em>

カーネルの BSS セグメントの直後の物理ページ (実メモリ) に
proc0 (訳注: プロセス番号 0, swapper) のページディレクトリや
ページテーブル, Uページが配置されます. 
仮想記憶機構が初期化された少しあと, 
<tt>0x1000-0x9ffff</tt>の実メモリとカーネル 
(text + data + bss + 上記の proc0 に関わるもの + その他) 
の後ろの実メモリは, 通常の仮想記憶ページの形で利用可能となり, 
グローバルな空きページリストに追加されます. 
