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