freebsd-skq/share/doc/ja_JP.EUC/handbook/memoryuse.sgml
1997-02-25 04:59:30 +00:00

62 lines
2.6 KiB
Plaintext

<!-- $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 に関わるもの + その他)
の後ろの実メモリは, 通常の仮想記憶ページの形で利用可能となり,
グローバルな空きページリストに追加されます.