問題タブ [mmu]

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.

0 投票する
1 に答える
569 参照

operating-system - ページテーブルとページサイズは誰が決める? OSまたはMMU?

物理メモリ容量が変わるとページテーブルのサイズが変わり、プロセス数が変わるとページテーブルのサイズが変わります。誰が実際にそれを決定しますか?OSまたはMMU?OS の場合、LINUX と Windows の間に違いはありますか?

0 投票する
3 に答える
1546 参照

paging - 仮想 TLB とは?

仮想TLBの意味を知っている人はいますか?このVTLBと通常のTLBの違いは何ですか.. Googleで明確な答えが見つかりませんか?

0 投票する
1 に答える
1398 参照

arm - linkscript - 別のリンク アドレスとロード アドレス

ラズベリーパイ用のおもちゃのOSを絞り、MMUをセットアップしようとしています。仮想メモリを 3G:1G に分割したいので、実行時にコードを 0x8000 にロードしながら、コードを 0xC0008000 にリンクする必要があると思います。(0x8000 は、Linux 用にビルドされているため、現在のブートローダーがカーネルを見つけると予想するアドレスです)。

objdump をいじってみるとうまくセットアップできていると思いますが、うまくいきません。qemu でデバッグした後、ブートローダーが私のコードをまったく見つけられないと思います。

0x8000 でリンクおよびロードされている独自のセクションに開始コードを移動すると、カーネルが正常に起動するため、問題はリンクスクリプトにあると思います。

スクリプトと最小限のコードを抽出しました。次のように、

-

(「b loop$」は、相対ブランチを使用する代わりに「b·c0008000」として生成されるため、機能しません。しかし、その部分は気にしないでください。問題は、エントリに到達しないことです)。

これらは、3 つのソース ファイルのみです。Makefile には興味深いものは何もないはずですが、make からの出力は次のとおりです。

そしてobjdump、

明らかでありながら貴重な詳細を見落としていると思い始めています。

====更新====

以下の私自身の回答で述べたように、混乱はqemuでのデバッグによって引き起こされます。ブレークポイントは、仮想アドレスによって設定されます。MMU が有効になっておらず、物理アドレスで実行しているときに gdb が仮想アドレスを考慮しているため、「b エントリ」は機能しません。

したがって、MMU を有効にする前に、「b *0x8000」を使用する必要があります。これにより、正しくヒットするブレークポイントが設定されます。ただし、GDB にはデバッグ情報が表示されない (のようなソース コードがない) ため、まだ混乱しているよう0x00008004 in ?? ()です。「objdump -D」によって生成されたリストがあるので、それは大きな問題ではありません。

MMU を有効にして main に分岐すると、gdb は完全に機能します。重要なのは、絶対分岐を使用して仮想アドレスにジャンプすることです。b/bl相対ジャンプを発行します。だから私は使用しますldr pc =mainbxも動作します。

0 投票する
1 に答える
332 参照

linux - kmap で pkmap_page_table はどのように使用されますか?


pkmap_page_table はカーネル起動時の kmap のページテーブルのポインタを持っています。
たとえば、PKMAP_BASE は 0xFFE00000 で、FIXADDR_START は 0xFFF00000 です。カーネルがハイ メモリを使用しようとする場合、TTB0 の PTE は仮想アドレスに対して 0xFFE00000 ~ 0xFFF00000 に設定する必要があります。
それでは、pkmap_page_table の PTE を使用してマップを作成するにはどうすればよいでしょうか。
また、TTB0 の PTE は pkmap_page_table の PTE と同じようにどのように変更されますか?

ありがとうございました。

0 投票する
1 に答える
1134 参照

c - 仮想メモリを理解するには?

文をどう理解するか

一般化して、各データオブジェクトが複数の独立したアドレスを持つことができ、それぞれが異なるアドレス空間から選択されます。これが仮想記憶の基本的な考え方です(《CSAPP》)

データオブジェクトに一意のアドレスがないのはなぜですか?

0 投票する
1 に答える
7838 参照

kernel - 仮想アドレス空間のどのページがスワップアウトされた物理ページフレームに対応するかを、カーネルはどのように知るのでしょうか?

次の状況を考えてみましょう: カーネルが物理 RAM を使い果たし、ページをスワップアウトする必要があります。最近使用されていないページ フレームを選択し、その内容をディスクにスワップ アウトして、そのフレームを別のプロセスに割り当てます。

私を悩ませているのは、このページ フレームが、一般的に言えば、複数のプロセスの複数の (同一の) ページに既にマップされていることです。カーネルは何らかの方法でこれらのプロセスをすべて見つけ、ページをスワップアウトとしてマークする必要があります。それはどのように実行されますか?

ありがとうございました。

編集:質問へのイラスト:

スワッピング プロセス 1 と 2 が物理メモリ フレーム 1 に常駐する共有ページ 1 を持つ前は、次のようになります。

ここに画像の説明を入力

ここで、システムのメモリが使い果たされ、カーネルはフレーム 1 からページ 1 をスワップアウトしてページ 2 に置き換えることにより、プロセス 3 にメモリを割り当てます。これを行うには、

1)ページ1を参照して、すべてのプロセスを見つけます(この場合、プロセス1とプロセス2)

2) ページ テーブル エントリを変更し、"Present" ビットを 0 に設定し、ページ 1 の場所をスワップに設定します。

ここに画像の説明を入力

したがって、ステップ1がどのように実行されるかわかりません。カーネルは、フレーム 1 を指しているページ テーブル エントリを見つけるために、すべてのプロセスのページ テーブルを繰り返し調べることはできません。ページ フレームからページ テーブル エントリへのある種の逆マッピングが必要です。

答えは:

「ページテーブル管理の最も重要で重要な変更は、リバース マッピング (rmap) の導入です。「rmap」と呼ぶのは、「頭字語」の一般的な使用法であり、-rmap と混同してはならないため、意図的に言及しています。 Rik van Riel によって開発されたツリーは、逆マッピングだけでなく、ストック VM に多くの変更を加えています。

1 つの文で、rmap は、構造体ページだけが与えられた特定のページをマップするすべての PTE を見つける機能を付与します。2.4 では、メモリ マップ共有ライブラリなどの共有ページをマップするすべての PTE を見つける唯一の方法は、すべてのプロセスに属するすべてのページ テーブルを線形検索することです。これはコストがかかりすぎるため、Linux はスワップ キャッシュを使用して問題を回避しようとします (セクション 11.4 を参照)。これは、多くの共有ページがある場合、ページの経過時間や使用パターンに関係なく、Linux がプロセス全体をスワップアウトしなければならない可能性があることを意味します。2.6 には代わりに、すべての構造体ページに関連付けられた PTE チェーンがあり、それを参照するすべてのページ テーブルからページを削除するためにトラバースすることができます。このようにして、LRU 内のページは、プロセス全体をスワップすることに頼ることなく、インテリジェントな方法でスワップアウトできます。」

Linux のメモリ管理を理解するから、「Linux2.6 の新機能」

0 投票する
2 に答える
9123 参照

linux-kernel - ブート中の Linux カーネル空間のページ テーブル

Linux カーネルのページテーブル管理に混乱を感じていますか?

Linux カーネル空間で、ページ テーブルがオンになる前。カーネルは、1 対 1 のマッピング メカニズムを使用して仮想メモリで実行されます。ページ テーブルがオンになると、カーネルはページ テーブルを参照して、仮想アドレスを物理メモリ アドレスに変換します。質問は次のとおりです。

  1. この時点で、ページ テーブルをオンにした後、カーネル スペースはまだ 1GB (0xC0000000 から 0xFFFFFFFF まで) ですか?

  2. また、カーネル プロセスのページ テーブルでは、0xC0000000 ~ 0xFFFFFFFF の範囲のページ テーブル エントリ (PTE) のみがマップされます。カーネル コードがそこにジャンプしないため、PTE がこの範囲外にある場合はマップされませんか?

  3. ページテーブルをオンにする前後のマッピングアドレスは同じですか?

    例えば。ページ テーブルをオンにする前に、仮想アドレス 0xC00000FF が物理アドレス 0x000000FF にマップされ、ページ テーブルをオンにした後、上記のマッピングは変更されません。仮想アドレス 0xC00000FF は引き続き物​​理アドレス 0x000000FF にマップされます。異なる点は、ページ テーブルをオンにした後、CPU がページ テーブルを参照して仮想アドレスを物理アドレスに変換することだけです。これは以前は必要ありませんでした。

  4. カーネル空間のページ テーブルはグローバルであり、ユーザー プロセスを含むシステム内のすべてのプロセスで共有されますか?

  5. このメカニズムは、x86 32 ビットと ARM で同じですか?

0 投票する
2 に答える
747 参照

linux-kernel - カーネル空間とユーザー空間の管理ページ テーブル エントリ (PTE) の違いは?

Linux OS では、ページ テーブルを有効にした後、カーネルはカーネル空間に属する PTE を一度だけマップし、二度と再マップしませんか? このアクションは、プロセスの切り替えが発生するたびに再マッピングする必要があるユーザー空間の PTE とは逆ですか?

そこで、カーネル空間とユーザー空間での PTE の管理の違いを知りたいです。

この質問は、次の質問から拡張された部分です: Page table in Linux kernel space during boot