問題タブ [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.
c - Linux カーネル ページ テーブルで copy_to_user が失敗する
Linux カーネルで、仮想アドレスと符号なし long ポインターを指定して、対応するページ テーブル エントリを見つけ、その内容を符号なし long ポインターにコピーするシステム コールを作成しています。システムコールは次のとおりです。
システムコールを呼び出しているテストプログラムは次のとおりです。
現在、copy_to_user への呼び出しは、kernel_pte を pte にコピーしていないことを意味する 8 の戻り値で失敗しています。VERIFY_WRITE の access_ok で pte をチェックしたところ、1 が返されました。ただし、kernel_pte で VERIFY_READ を使用して acces_ok を呼び出したところ、0 が返されました。ユーザーポインターを再度チェックするだけのようです。そのため、通話が失敗する理由が少しわかりません。
linux - 多くのページテーブルディレクトリを使用したLinuxページング
Linux 仮想メモリに関する Mel Gorman という本を読みました。Linux は 3 レベルのページ テーブルをサポートすることを読みました: PGD、PMD、および PTE。新しいバージョンのカーネルを間違えていなければ、4 つのページ テーブル レベル (PUD) がありますが、それは問題ではありません。合理的な質問があります。Linux 開発者が 1 つではなく 3 つ (または 4 つ) レベルのページ テーブルを選択するのはなぜですか? 1 つのグローバル ページ テーブル (つまり、プロセスごとのグローバル ページ テーブル) のみを使用すると、メモリ参照の量が減少します。
私の英語でごめんなさい。
memory-management - 3 レベルのページ テーブルのページ エントリ
この質問を見つけましたが、解決方法がわかりません。
新しいプロセッサのメモリ管理ユニット (MMU) を設計しています。プロセッサのワード サイズは 64 ビットで、ポインタのサイズも 64 ビットです。設計の次の部分はすでに決定されています
。 • MMU は 32kB のページ サイズをサポートします。
• 3 レベルの階層ページ テーブルを使用してアドレス変換を実行します。
• x86 マシンと同様に、ページ テーブルの任意のレベルにある個々のテーブルは、物理メモリの 1 ページを占有します。レベル 3 はルート テーブルで、レベル 2 テーブルの物理アドレスを保持するエントリが含まれます。同様に、レベル 2 テーブル エントリはレベル 1 テーブルを指し、レベル 1 テーブル エントリは物理ページまたはフレームを指します。
• すべてのページ テーブル エントリのサイズは 64 ビットになります。
• 物理アドレス空間のサイズは 52 ビット (4096 テラバイト) に制限されていますが、当面はこれで十分です。
この質問の残りの部分は、これらの設計上の決定の結果についてです。
質問:個々のページ テーブル ページにはいくつのエントリがありますか? あなたの働きを見せてください。
少し読んだ後、ページサイズP=2^p
と仮想アドレスサイズが与えられると、ビットn
の仮想ページオフセット(VPO)とp
ビットの仮想ページ数があることがわかりました(n-p)
。これにより、1 レベルのページ テーブル内の PTE の数は次のようになります。
レベルのページ テーブルでは、VPN を異なる VPNk
に分割する必要があります。私の理解では、それらはすべて同じ長さです。これは、個々のページ テーブルの PTE の量が であることを意味します。k
(n-p)/k
2^((n-p)/k)
さて、私の場合、私は持っていP = 32kB = 2^15
ます。これにより、15 ビットの VPO が得られます。私が見逃しているのは、仮想アドレスのサイズn
です。
ワードとポインタのサイズが 64 ビットであることはわかっています。
仮想アドレスが 64 ビット幅であると想定するのは正しいですか? その場合、49/3
ビット VPN を取得しますが、49
で割り切れません3
。
memory - 3 レベルのページ テーブルのサイズ
質問があります:
ページ サイズが 4kB の 32 ビット マシンの単一の 3 レベル ページ テーブルの最大サイズと最小サイズを計算します。この 3 レベルのページ テーブルで仮想ページを表す 20 ビットの分割は、(7、7、残っているビットは何でも) です。
プロセスには少なくとも 1 つのフレームを割り当てる必要があるため、最小サイズは 4k+4k+4k=12k にする必要があることを理解しています。ただし、最大値を計算する方法については混乱しています。20 ビットを 10 と 10 にスライスできるため、2 レベルのページ テーブルでうまく機能します。これは、1024 エントリ * それぞれ 4 バイトで、4k の優れた係数です。しかし、2 ^ 7 全体では奇妙な数が得られます。解決方法についてのアイデアはありますか? ありがとう。
memory-management - Extended Page Tables / Nested Paging : ゲスト PTE 更新時のトラップの防止
そこで、Intel の Virtualization Extensions で EPT について調べました。シャドウ ページ テーブルでは、ゲストが PT に書き込もうとするたびに VMM にトラップされるように、VMM はハードウェア アクセス可能なシャドウ PT を書き込み保護する必要があることを理解しています。このソフトウェア ベースのページ テーブル管理は、EPT / Nested Paging によって解決されるはずの巨大なオーバーヘッドです。
しかし、ネストされたページングはこの問題をどのように解決するのでしょうか? この場合、ゲスト VA からゲスト PA (ホスト VA) とホスト VA からホスト (マシン) PA の 2 つの個別の変換があります。ゲストが管理するページテーブルへのゲストの更新は、トラップする必要はないと主張されています。これは一貫性がありません: ゲストが GVA->GPA マッピングを変更した場合、新しい GPA マッピングも HVA に反映されるべきではありませんか? つまり、ゲストが管理するページ テーブルのすべての変更は、VMM が管理するページ テーブルにも反映されるべきではありませんか? 同じ問題を抱えているようです。EPT の導入によってどのような問題が解決されますか?
ありがとう。
memory - テーブル エントリ サイズの計算
このような質問があり、テーブル エントリのサイズを計算する必要があります。
Microsoft Windows 98 は 32 ビットのメモリ アドレス空間を使用していましたが、デフォルトのページ サイズは 4KB でした。物理メモリが 256MB の場合
i) ページ テーブルのエントリのサイズは?
これはページオフセットと同じですか?