問題タブ [page-tables]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
linux - なぜ kmalloc() は vmalloc() より効率的ですか?
kmalloc()
オフセットを追加するだけで、仮想メモリ空間が物理メモリ空間に直接マッピングされるため、カーネルに連続した物理ページを割り当てると思います。
しかし、なぜそれがより効率的であるかはまだわかりませんvmalloc()
。まだページ テーブル (カーネル ページ テーブル) を通過する必要がありますよね? プロセスがカーネルに切り替わるときに MMU が無効にならないためです。では、なぜ Linux はカーネルの仮想空間を物理メモリに直接マップするのでしょうか? メリットは何ですか?
にはinclude/asm-x86/page_32.h
、次のものがあります。
カーネルが物理アドレスを計算する必要があるのはなぜですか? とにかく、メモリにアクセスするには仮想アドレスを使用する必要がありますよね?物理アドレスが必要な理由がわかりません。
memory - アドレスのサイズは、エントリの数、エントリの合計サイズ、またはその両方と関係がありますか?
仮想メモリのアドレスが 32 ビットの場合、2^32 エントリがありますか、それともエントリの合計サイズは 2^32 バイトですか? または両方?
私が尋ねる理由は、それが 2^32 全体を意味すると思ったからです。
次の問題を実行した後、わかりません:
- マシンに 48 ビットの仮想アドレスと 32 ビットの物理アドレスがあるとします。ページが 4KiB の場合、単一レベルしかない場合、ページ テーブルにはいくつのエントリがありますか?
解決策: 2^48/2^32 = 2^16 ページ。
ただし、エントリ数/ページサイズ!=ページ数です。
総エントリのサイズ/ページのサイズ = ページ数。
したがって、32 ビット アドレスは 2^32 エントリがあることを意味するのか、それとも合計エントリが 2^32 バイトに等しいのか、あるいはその両方なのか疑問に思っています。
virtual-memory - プロセスは複数のページ テーブルを持つことができますか?
クイズで「プロセスサイズは 2^6+^2^12+2^23 バイトで、システムの総メモリサイズは 4GB ページサイズは 4k ページテーブルはいくつありますか ページディレクトリとページディレクトリはいくつありますか?」ページ?最初はすべてのメモリが空いていたと仮定しますか?これをどのように解決しますか?
windows - プロセスのページ テーブルはカーネル アドレス空間にマップされていますか?
私は Windows システム プログラミングを行っていて、ソース コード レベルでプロセスのページ テーブルにアクセスできるかどうか疑問に思いました。
仮想メモリに関連するページテーブルについて私が知っていることは次のとおりです。
ユーザーが Windows OS (32 ビット) で「A」プロセスと呼ばれるプロセスを実行したとします。
まず、OS は A プロセス用に 4GB の仮想アドレス空間を作成して維持します。
(そのうちの 2GB はカーネル アドレス空間で、残りの 2GB はユーザー アドレス空間です。
ユーザー アドレス空間のコードは、カーネル アドレス空間に直接アクセスできません。)
次に、OS は物理メモリ内に A プロセス用のページ テーブルを作成して維持し、仮想メモリ アドレスを物理メモリ アドレスにマップします。
これが私の質問です。
OS が A プロセスのページ テーブルを作成した後、ユーザーがソース コードから間接的にページ テーブルにアクセスできるように、このページ テーブルは A のカーネル アドレス空間にマップされますか?
または、ページ テーブルは A の仮想アドレス空間のいずれにもマップされず、物理メモリにのみ存在するため、ユーザーはページ テーブルにアクセスできませんか?
x86 - x86-64 ページ テーブル グローバル ビット
この設定のすべての PTE (ページ テーブル エントリ) には、このエントリによってマップされる物理ページの範囲を制御する G ビット (G = グローバル) があります。
G ビットが設定されている場合、エントリはすべてのプロセスに対してグローバルであり、他のアクセス権に従って、すべてのプロセスがマップする物理ページにアクセスできます。G ビットがゼロの場合、エントリはグローバルではなく、プロセスに対してプライベートです。[カーネルはそのページに G ビットを設定しますが、そのページの U ビット (U = ユーザー モード) を無効にすることで、ユーザー モード アクセスを防ぎます。]
G ビットがユーザーモード PTE (U ビットが設定されているもの) に設定されている場合、システム上のすべてのプロセスが PTE マップのページにアクセスできるため、セキュリティ違反ではありませんか?
何か不足していますか?ユーザーモード PTE に G ビットを設定する方法はありますが、システム上のすべてのプロセスではなく、信頼できるプロセスのグループ間でのみグローバルに設定できますか? PTE に G ビットと U ビットの両方を設定できますか?