解析のメモリをアドレス指定するためのページストレージメカニズム上のセクション
背景
それ以上のタッチ味わっているセグメントのページ管理、オペレーティング・システムのメカニズムが、一度よりも、時間のこのコースのオペレーティング・システムの学習、私は、オペレーティングシステムがこのメカニズムを持っている理由を知りません。今の時間は長い長い時間のために忘れられた原則とメカニズム、背後にあるメカニズムについては、長い過去です。。最近の知見では、それによって彼自身の理解を記録し、オペレーティングシステムを確認してください。
セグメントのページ管理機構の開発プロセスを理解するために、我々は以前のプロセッサへの対応から始めなければなりませんでした。
メモリアドレッシング・モードの開発
まず、メモリアドレッシングの概念の下に簡単な、現代のコンピュータアーキテクチャノイマンに基づいており、このアーキテクチャは、ストレージセントリック、すべての操作の前提があるデータ・メモリの取得を開始しているありますので、ある程度のメモリアドレッシングは、コンピュータ技術の技術を表しています。
直接アドレッシング
プロセッサの開発の初期段階では、Intelはその簡単、粗方法をアドレッシングプロセッサ-8080の最初の8ビットのメモリを導入し、プログラムは絶対にハードコードされた形式でアドレスメモリに配置されています。この場合、プログラムは、重大な欠点があります、弱い制御可能な再配置が困難、維持することは困難とのように。
セクション
すぐために基づき登録するために困難レジスタ20、16の製造、拡張アドレスライン20に1M、すなわちまで対処することができる別のIntelプロセッサ8086を発売20ビットのアドレス空間をアドレス指定、それは重要な概念を紹介- 、段
セグメントアドレスは、他の言葉で空間を1M 64K(16ビット・レジスタは、アドレス指定)管理対象セグメントに分割され、レジスタに格納されます。したがって、セグメンテーションメカニズム8086は、メモリ内にアドレス指定しました:
1 |
4左セグメント・ベースの物理アドレス+オフセット= |
良好な支持分割機構、プロセッサ8086によって使用されるプログラム・コード・セグメント、データ・セグメントに対して、各スタックセグメントは、これらのセグメントを保持するための特別な16ビット・セグメント・ベース・レジスタを提供します。セグメンテーション機構の導入後、ハードコーディングされたアドレスにプログラムもはやニーズ、およびデバッグエラーと見つけることがより簡単に、そしてさらに重要な、より大きなメモリアドレス空間をサポートするために。
ページ仮想メモリ
ページング機構は、第1のコンピュータ・システムのメモリに対処する上で大きな進展が後で大きな影響を与えている80386プロセッサ、に登場します。合わせるために32ビットに80386アドレス空間虚拟内存
技術は、ページングメカニズム、単純に次の仮想メモリ技術を導入しました。
シンプルで、虚拟内存
技術的なコンピュータの実際のメモリより多くのメモリを使用するアプリケーション。ここでは簡単な例であるノイマン型プログラムが実行されている場合、プログラムのニーズがメモリにロードされることを教えてくれるが、それは、それは5Gメモリに必要がある場合にビッグゲームを実行されますが、32ビットのノートブックの最大のサポート4Gメモリあなたが実行する前に、あなたはまだ、このゲームをプレイしていませんか?いいえ、仮想メモリ技術の使用は、このプログラムを実行することができ、そしてちょうどスタックポイントを得ることができます。
ハードディスクの空き容量の性質上の仮想メモリは技術のメモリにマップされ、プログラムはより大きなメモリ空間を使用することができるようになっています。シンプルなアプローチは、(外部ディスクスペースに)、あなたがメモリにロードされたプログラムのディスク・スペースの内容に対応したアクセスアドレスにプログラムメモリを必要とするときのアドレスにアクセスできない場合、プログラムの内容をロードするプロセスが古い直面する可能性があります交換。これらの管理を容易にする方法置换
や加载
コンテンツを?オペレーティングシステムは、紹介页
ページの概念は、記憶部、4Kの通常サイズです。
とにかく、あなたができる段机制
これらのコンテンツを交換している管理し、それをロードされましたか?不便なので、メモリとディスクの間に全体の仮想空間の大きさに、可変部分の大きさは、ここに転送しているので、より小さく、より柔軟なストレージユニットの必要性がある-ページ管理と呼ばれる仕組みをスワップアウトすること页机制
。
必要とされる実際の物理ページアドレス機構内に線形アドレスへの線形アドレス - 変換機構によって得られたページング機構の導入後、単にセグメントアドレス中間アドレスです。メモリをアドレス指定するプロセスを要約すると、論理アドレスは、最終的な物理アドレスにプログラム変換処理に使用されます。
1 |
論理アドレス - >(セグメンテーション機構)線形アドレス - >(ページング)物理アドレス |
メモリのアドレス指定プロセス分析
オペレーティングシステムメモリアドレッシングの開発プロセスについての簡単な導入、アドレッシングメモリのセグメンテーションとページング機構のプロセスについて、次の詳細な分析。論理アドレスの概念の下で最初に簡単に、リニアアドレス、物理アドレスは言いました:
- 論理アドレス:アドレス番号または操作するためのプログラムコード内の命令
- 線形アドレス:仮想アドレスがマッピングされてもよい(製品ページング機構、論理的に連続)4Gメモリ
- 物理アドレス:メモリバスに対応した電気信号のピンにプロセッサに送信
詳細なセグメンテーションメカニズム
論理アドレスコードを使用する2つの部分から構成されます。
段选择符
:16ビットのフィールド段内偏移地址
:32ビットのフィールド(最大セグメントサイズが4GBです)
すばやく見つけるために段选择符
指定されたセグメントの位置を、セグメント・レジスタは、プロセッサ(提供cs
、、 、、ss
、)、ds
8086に比べて、80386を添加し 、 主に減少させるために、追加のセグメント・レジスタ このレジスタの負担が導入され。es
fs
gs
fs
gs
es
なお、 cs
0にユーザモードのための現在のCPU DPL、3の特権レベルを指定する2ビットフィールド、カーネルモードを含むレジスタ。
記述子
前述したように段选择符
、以下のように16ビットのフィールドです。
- 15〜3:インデックスインデックス
- 2:GDT(TI = 0)またはLDT(TI = 1)セグメント記述子におけるTIフラグが指定されました
- 1〜0:RPLフラグ、要求者の特権レベル
段选择符
インデックス番号情報のセグメントにインデックスを付けることができ、8バイトの情報がされ段描述符
、表現段描述符
に格納されている全局描述符表
(GDT)及び局部描述符表
(LDT)です。また、GDTとLDTアドレスは通常、システムの初期化時に初期化し、レジスタに格納された gdtr
制御レジスタを、ストレージに加えて、各プロセス場合GDT、GDTのアドレスを書き込み、だけでなく、自分自身の追加セグメントを必要とする、あなたが作成することができます LDT
、 LDT
アドレステーブルがに書き込まれる ldtr
レジスタ。
クイックアクセス記述子
唯一セグメントので、レジスタに格納された段选择符
アドレス、段选择符
インデックス付きの実際の段描述符
必要性ルックアップテーブルGDTまたはLDT。線形アドレスに論理アドレスの変換を促進するために、80×86は、追加の非プログラムレジスタを提供し、すなわち、いつでも段选择符
レジスタに時間、対応する段描述符
プログラミング・レジスタにメモリから無負荷に。
そのようなセグメントの論理アドレスは、GDTまたはLDTテーブル、ストレージへの直接参照アクセスしないリニアアドレス変換段描述符
のような非プログラムレジスタを。
セグメンテーション機構のアドレス変換プロセス
論理のアドレス段选择符
と段内偏移组成
、線形アドレスに変換する際に、分割部は、次の操作を実行します。
- チェックセグメント
选择符
TIフィールド裁判官このセグメントは、段描述符
GDTまたはLDTに保存されています - そしてによって
段选择符
実際のインデックス指数で段描述符
- インデックスの実際のインデックス
段描述符
アドレス✖️8、プラスgdtr
またはldtr
レジスタの値。プロセスが完了した段
開始位置の計算 - 最後に、論理アドレスを追加することによって計算した結果
段内偏移
、線形アドレスには、得られます
Linuxでのセグメント
使用セグメントに非常に限られた方法でのLinux、ページングされたメモリ管理フォームを使用することを好む、理由は次のとおりです。
- すべてのプロセスが同じセグメント・レジスタを使用する場合、メモリ管理は、それらが、線形アドレスの同じセットを共有できることを意味簡単になります
- Linuxの設計目標は、RISCは、セグメンテーションのためのサポートが制限されしかし、ほとんどのプラットフォームに移植されます
80X86セグメント化機構上で実行するLinuxプラットフォーム上で、それぞれのセグメント・セレクタを定義する4つのマクロを定義することによって
- __USER_CS:ユーザモードコード・セグメント・セレクタ
- __USER_DS:ユーザ・モード・データ・セグメント・セレクタ
- __KERNEL_CS:カーネルモードのコード・セグメント・セレクタ
- __KERNEL_DS:カーネル状態データ・セグメント・セレクタ
タイム・カーネルコードのその期間は、のみに__KERNEL_CS値に必要アドレッシング cs
たセグメント・レジスタ cs
セグメント・セレクタによって指定されたセグメント・レジスタのRPLの値は、現在のプロセスがカーネルモードであるか、またはユーザモードが属することを示します。
GDTは、Linux、GDT各CPUの対応するものにおいては、GDTの全てに格納されている cpu_gdt_table
GDTアドレスとそのサイズは、に格納されているのに対し、 cpu_gdt_descr
システムの起動に先立って初期化されるアレイ。
詳細なページングメカニズム
前述のページング機構は、オペレーティングシステムと導入仮想メモリ管理に沿って、ページング機構の目的は、線形アドレスを物理アドレスに変換することです。
基本コンセプト
簡単に言えばの話について页
、页框
、页表
の概念
- ページ:リニア・アドレスへの線形アドレスに対応するには、通常の固定サイズ、ページと呼ばれる、4Kページサイズの単位でグループ化されています
- フレーム:物理アドレスに対応するが、物理アドレスがRAMで、固定サイズのページフレームに分割され、各ページ・フレーム実ページに対応します
- ページ表:特定のページのフレーム構造のためのページマッピングデータ
一般的なページング
各ページのサイズは4キロバイト、マッピングするために4ギガバイトの物理的な空間であるため、ページテーブルが1MB(2 ^ 20に)それほどページテーブルエントリが受け入れられない保存する各プログラムに対応するマップエントリを有します、それはマルチレベルページテーブルの概念につながる、とも呼ばれます页目录
。
アドレスリニアその変換プロセスは、最初は見つけることです、2つのステップを必要とし页目录
、特定のページテーブルとページテーブルのルックアップを見つけ、特定のページを見つけること。このページはRAMに存在しない場合、すなわち、ページフォルト、ページフォールトは、ページング要求をトリガされます。RAMは、特に物理アドレスへのアドレスリニア完了することができます。
各アクティブなプロセスのためのメカニズムをページングすると、ページのディレクトリを持っている必要があり、ページテーブルは、実際に割り当てるために使用された場合にのみ、すべてのプロセスがRAMを割り当てられていない、これは、プロセスが使用している、より効率的になる页目录
に格納されているアドレス cr3
レジスタを。
リニア・アドレス・フィールド分析
次のようにリニアアドレスは、三つの部分に分かれています。
- ディレクトリ:ディレクトリ内のページディレクトリエントリを決めるサイズ10
- 表:デシジョンページテーブルエントリのサイズ10
- オフセット:ページフレームの相対的な位置を
ページディレクトリとページテーブルエントリが1024にアップしているように、ディレクトリおよび表のフィールドは、サイズ10ですので。ページテーブルとページディレクトリの同様のデータ構造は、次のフィールドがあります。
- 現在のシンボル:1(メインメモリ内のページ)0(メインメモリに、ページフォールトを引き起こしていません)
- アクセスフラグ:たびにフラグを設定するために対応するページフレームアドレスにユニットをページング
- ダーティフラグ:書き込みにページフレームは、これを設定しますたびにのみページテーブルエントリを適用
- 読み取り/書き込みフラグ:ページ・テーブルを含むページへのアクセスまたは
- ユーザー/スーパーバイザーフラグ:特権アクセスページまたはページ・テーブルを含む画分
- PCDおよびPWTフラグ:制御ハードウェアキャッシュハンドルページとページテーブル
- ページサイズ表記:のみのページディレクトリエントリのため、1に設定すると、そのページのフレームサイズは2メガバイトまたは4メガバイトであります
- グローバルマーク:唯一のページテーブルエントリのため、一般的にTLBキャッシュからページの更新を防ぐために使用
変換ルックアサイド・バッファ(TLB)
内部ハードウェアキャッシュに加えて、さらに線形アドレスの変換をスピードアップするためにキャッシュに変換索引バッファ(TLB)を含みます。初めてリニアアドレスは、遅いページ・テーブルによってRAMにアクセスするために対応する物理アドレスを計算し、物理アドレスは、同一の物理アドレスへの次の基準を迅速にすることができるように、TLBのエントリに格納されている場合変換を取得します。
マルチプロセッサでは、各CPUは、自身のTLBを有しています。ときにCPU cr3
レジスタが変更されたとき、それは新しい現在使用されているため、すべてのTLBエントリは、無効になった页目录
の。
Linuxのページネーション
4ページテーブルの導入の先頭から32ビットシステムのための二つのページテーブルは十分であるが、64ビットシステムをサポートするために、あなたはまた、マルチレベルページテーブルを導入する必要があり、Linuxバージョン2.6.11:
- ページグローバルディレクトリ
- ページの親ディレクトリ
- ページ中央のディレクトリ
- ページテーブル
32ビットの物理アドレス拡張システムのために時間によって、2個のページテーブルを十分に有効になっていない页上级目录
と页中间目录
ビットは、それによって2つのページテーブルフォーマットを維持する、0にすべての設定されています。
メモリ初期化フェーズは、コアカーネル物理アドレスにマッピングされる物理アドレスを指定するために確立されなければならない利用可能な範囲で、かつありません。カーネルは、以下のページが予約箱であることに注意してくださいます。
- ページフレームの物理アドレス範囲では使用できません。
- カーネルのコードとデータ構造を含むページフレームが初期化されています
予約ページフレームのページが動的に割り当てられたり、ディスクにスワップしてはいけません。プロセスのリニアアドレス空間は2つの部分に分かれています。
- リニア・アドレスから0x00000000の0xbfffffffに、カーネルモードやユーザーモードで実行されている両方のスレッドに対処することができます
- リニア・アドレスから0xc0000000は0xffffffffに、唯一のカーネルモードのスレッドが対処することができます