8

特定の仮想メモリ アドレスに何らかの値を割り当てたいときに、オペレーティング システムがどのように機能するかを理解しようとしています。

私の最初の質問は、MMU が CPU と RAM の間のすべてを処理するかどうかに関するものです。これは本当ですか?ウィキペディアから読み取ることができるものから、私はそう言うでしょう:

ページ メモリ管理ユニット (PMMU) とも呼ばれるメモリ管理ユニット (MMU) は、CPU によって要求されたメモリへのアクセスを処理するコンピュータ ハードウェア コンポーネントです。

その場合、たとえば 8 バイト、64 バイト、または 128 バイトを取得する必要があることを MMU に伝えるにはどうすればよいでしょうか? 書くことはどうですか?

そうでない場合、MMU は単に仮想アドレスを物理アドレスに変換していると思いますか?

ページ フォールトと呼ばれるものがあることを MMU が検出するとどうなるでしょうか。CPUがページ自体をディスクからロードするようにCPUに指示する必要があると思いますか、それともMMUがこれを実行できますか?

ありがとう

4

2 に答える 2

36

エリュシオンをむさぼり食った、

質問には 1 つずつお答えしますが、OS コースまたはコンピューター アーキテクチャの入門コースの教科書を入手することをお勧めします。

MMU は、物理アドレスを生成し、メモリ コントローラーとの間でデータを送受信することを目的としたハードウェア ロジックと状態で構成されます。実際、メモリ変換の仕事は、ハードウェアとソフトウェア (OS) のメカニズムが連携することによって処理されます (少なくとも最近の PC では)。物理アドレスが取得されると、CPU は基本的にその仕事を完了し、実際のメモリ チップに接続されているバスにアドレスを送信します。多くのシステムでは、このバスはフロントサイド バス (FSB) と呼ばれ、メモリ コントローラに接続されています。このコントローラーは、CPU から提供された物理アドレスを取得し、それを使用して DRAM チップと対話し、最終的にメモリ アレイの正しい行と列のビットを抽出します。その後、データは CPU に送り返され、これで操作できます。この説明にはキャッシングは含まれていないことに注意してください。

いいえ、MMUはRAMと直接対話しません。これは、物理DRAMチップを意味するために使用していると思います。また、MMU に 8 バイト、または 24 バイトなどを指定することはできません。アドレスを指定することしかできません。取得できるバイト数は、使用しているマシンと、それがバイト アドレス可能かワード アドレス可能かによって異なります。

最後の質問ですが、MMU は実際には CPU の一部であり、同じシリコン ダイ上にあります (ただし、常にそうであるとは限りません)。

それでは、ページ フォールトの例を見てみましょう。あなたが言ったように、ユーザーレベルのアプリケーションが someAddress = 10 を設定したいとします。someAddress が 0xDEADBEEF であると仮定し、ここではキャッシュを無視しましょう。

1) アプリケーションはストア命令を 0xsomeAddress に発行します。これは、x86 では次のようになります。

mov %eax, 0xDEADBEEF

ここで、10 は eax レジスタの値です。

2) この場合の 0xDEADBEEF は仮想アドレスであり、変換する必要があります。ほとんどの場合、仮想アドレスから物理アドレスへの変換は、Translation Lookaside Buffer (TLB) と呼ばれるハードウェア構造で利用でき、この変換を非常に高速に提供します。通常、これは 1 クロック サイクルで実行できます。変換が TLB ヒットと呼ばれる TLB にある場合、実行はすぐに続行できます (つまり、0xDEADBEEF に対応する物理アドレスと値 10 が書き込まれるためにメモリ コントローラーに送信されます)。

3) ただし、翻訳が TLB で利用できなかったとします (TLB ミスと呼ばれます)。次に、ハードウェアによって定義され、OS によって管理される構造を持つメモリ内の構造であるページ テーブルで変換を見つける必要があります。それらには、仮想アドレスを物理アドレスにマップするエントリが含まれているだけです (より正確には、仮想ページ番号を物理ページ番号にマップします)。しかし、これらの構造体もメモリ内に存在するため、アドレスが必要です! ハードウェアには、現在のページ テーブルの物理アドレスを含む cr3 という特殊なレジスタが含まれています。仮想アドレスを使用してこのページ テーブルにインデックスを付けることができるため、ハードウェアは cr3 の値を取得し、オフセットを追加してアドレスを計算し、メモリにアクセスしてページ テーブル エントリ (PTE) を取得します。

4) でも、いや!0xDEADBEEF のページ テーブルに PTE がない場合はどうなりますか? これはページ フォールトであり、ここでオペレーティング システムの出番です。ページテーブルから取得した PTE は存在し、アクセスするための有効なメモリアドレスであると仮定しますが、OS はそのための VA->PA マッピングをまだ作成していないため、ビットが設定されていたはずです。無効であることを示します。ハードウェアは、アクセス時にこの無効なビットを検出すると、例外 (この場合はページ フォールト) を生成するようにプログラムされています。

5) 例外により、ハードウェアは既知の場所 (ハンドラーと呼ばれるコード) にジャンプして OS を呼び出します。多くの例外ハンドラーが存在する可能性があり、ページ フォールト ハンドラーはその 1 つです。ページ フォールト ハンドラーは、フォールトの原因となったアドレスをレジスタのどこかに格納されているため認識し、仮想アドレス 0xDEADBEEF の新しいマッピングを作成します。これは、物理メモリの空きページを割り当ててから、「VA x と VA y の間のすべての仮想アドレスが、この新しく割り当てられた物理メモリのページ内のアドレスにマップされる」ということによって行われます。0xDEADBEEF はその範囲内のどこかにあるため、マッピングはページ テーブルに安全に配置され、ページ フォールトの原因となった命令 (mov) を再開できます。

6) ここで、ページ テーブルを再度調べると、マッピングが見つかり、抽出した PTE には、保存先の適切な物理アドレスが含まれています。これに値 10 をメモリ コントローラに渡して完了です。

キャッシュはこのゲームを大きく変えますが、これがページングの仕組みを説明するのに役立つことを願っています. 繰り返しになりますが、OS/コンピュータ アーキテクチャの本をいくつか読むと、非常に有益です。これが明確だったことを願っています。

于 2011-02-04T07:19:16.170 に答える
0

どの仮想アドレスがどの物理アドレスに対応するかを記述するデータ構造があります。OS はこれらのデータ構造を作成および管理し、CPU はそれらを使用して仮想アドレスを物理アドレスに変換します。

たとえば、OS はこれらのデータ構造を使用して、「0x00000000 から 0x00000FFF の範囲の仮想アドレスは物理アドレス 0x12340000 から 0x12340FFFF に対応する」と言うかもしれません。ソフトウェアが仮想アドレス 0x00000468 から 4 バイトを読み取ろうとすると、CPU は実際には物理アドレス 0x12340468 から 4 バイトを読み取ります。

通常、すべてが仮想から物理への変換によって影響を受けます (CPU が変換を記述するデータ構造にアクセスしている場合を除く)。また、通常、関連するオーバーヘッドを削減するために、CPU に何らかの変換キャッシュが組み込まれています。

于 2011-01-27T02:53:51.313 に答える