3

Linuxデバイスドライバを調べていますが、ページ数がフレーム数と同じであることがわかりました。各ページは各フレームにマップされます。プログラムがメモリを必要とするときはいつでも、ページを割り当てるように表示されます。

しかし、OSの本では、仮想アドレスがページに分割され、これらのページがフレームにロードされるように見えました。それでは、ページ数をフレームに等しくするにはどうすればよいでしょうか。

上記のどれが正しいですか?Linuxは、仮想、ページ、フレームマッピングに関する情報をページテーブルにどのように保存しますか?

私は完全に混乱しています。

4

1 に答える 1

21

物理ページが呼び出されpage framesます (フレームと呼ぶことができます)。この用語は、仮想メモリ内のページpageに対して予約されています。

仮想メモリは、カーネルによって同じサイズのチャンクに分割されます。物理メモリも同じサイズのページ (ページ フレーム) に分割されます。

たとえば、32 ビット アーキテクチャで 4GB の RAM がある場合、これは次のことを意味します。サイズ 4KB の 1048576 ページ フレーム

続けましょう、

ページ フレーム (物理ページ) ごとに、カーネルは構造を維持しますstruct page。この構造体はlinux/mm_types.h( https://github.com/torvalds/linux/blob/master/include/linux/mm_types.h ) で定義されており、この構造体には、ページ フレームが存在するアドレス空間を指定するmapping( )という名前のメンバーが含まれています。struct address_space *mapping位置した。indexこのマッピング内のオフセットを表すという名前のメンバーもあります。

すべての構造体ページはグローバルmem_map配列に保持されます。この配列は、仮想メモリと物理メモリ間のすべての関連付けを知るためにカーネルによって使用されます。

最後に、仮想アドレスを物理アドレスに変換するために、カーネルは( https://github.com/torvalds/linux/blob/master/include/asm-generic/memory_model.h )でvirt_to_page()定義されたマクロを使用します。asm-i386/page.hpfn_to_page

例の前に、32 ビット アーキテクチャのアドレスのレイアウトを見てみましょう。

| | 10 ビット - ディレクトリ | 10 ビット - ページ テーブル | 12 ビット - オフセット |

メモリの仮想アドレスを物理アドレスに変換する例を見てみましょう:

http://img11.imageshack.us/img11/9426/pagingexample.png

この助けを願っています。

よろしく。

于 2012-08-03T06:39:51.210 に答える