問題タブ [tlb]
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 - flush_cache_range() と flush_tlb_range() が機能していないようです
これが私がしたことです:
- ユーザー空間プロセスは
malloc()
、ヒープにメモリを割り当て、特定の文字パターンで埋めてから、malloc()
. プロセス ID とメモリ チャンクのアドレスは、次のようなカーネル モジュールに渡されます。
}
(上記の変数定義の後のコードの 3 行目)によって引き起こされるページ フォールトを追跡するために、Linux カーネル
/li>printk()
の関数にステートメントを追加しました。このようなもの:handle_mm_fault()
target_process_id
さて、私が気付いたのは、最後のprintk()
ステートメントが何もキャッチしていないことです。
関数init_module
は、カーネル モジュールの初期化関数です。insmodを使用して実行中のカーネルに挿入されます...コマンドを使用してinsmod module.ko pid=<processId> addr=<address>
何がうまくいかないのでしょうか?
caching - 典型的なプログラムでのTLBとキャッシュの違いについて
通常、20% のメモリ命令があります。5% のデータ TLB ミスがあり、それぞれの処理に 100 サイクルが必要であると仮定します。各命令の実行に 1 サイクルが必要であり、キャッシュ内の各メモリ操作は 1 サイクルであり、データ アクセスの 10% がキャッシュ ミスであると仮定します。各キャッシュ ミスは 15 サイクルなので、1000 命令を実行するのにかかる時間はどれくらいか。
答えはわかりませんが、TLB とキャッシュの両方が存在することに混乱しています。キャッシュと TLB は同じものであるという印象を受けましたか?
assembly - 変換ルックアサイド バッファの書き込み
アプリケーションは仮想メモリで動作します。これは素晴らしいコンセプトです。連続したブロックのように扱うことができ、物理 RAM で連続しているかどうか、またはハードディスク上にあるかどうかを気にする必要はありません。
私が理解している限り、仮想アドレスと物理アドレス間のマッピングは、変換ルックアサイド バッファーを使用して CPU (または少なくともハードウェア) によって直接行われます。
カーネルがどうにかして TLB の内容を維持していると思いますが、ここで少し行き詰まっているので、3 つの質問があります。
TLB の内容を照会、読み取り、および書き込むための特定のアセンブラー命令は何ですか? このトピックに関連するオペコードをグーグルで検索したのは、あまり幸運ではありませんでした。INVLPG と TLBWI を見つけました。私はそのレベルの深さに慣れていないので、間違った検索用語を使用しているだけかもしれません. すぐに見つけた場合、どの検索語を使用しますか?
これらすべてのアセンブラ命令には、特権 CPU モードが必要ですか?
TLB の初期コンテンツは何ですか? TLB が最初に空の場合、それはオペレーティング システムの最初のアセンブラー命令が物理メモリに直接マップされることを意味しますか (したがって、仮想アドレス == 物理アドレス)?
memory - メモリ - ページングと TLB
次のタスクについて質問があります。
MMU が 2 レベルのページ テーブルをサポートする IA-32 システムを考えてみましょう。第 2 レベルには、4 KB ページ フレームにマッピングされた 1024 ページ テーブル エントリが含まれます。各ページ テーブル エントリ (両方のレベル) のサイズは 4 バイトです。システムは 4 KB のページ サイズのみをサポートします。
バイト 0 から始めて、連続する 8 MB を仮想メモリから順次読み取ります。一度に 1 ワード (4 バイト)
を読み取ります。8 エントリのデータ TLB があります。上記で指定された 8 MB のメモリを読み取るには、何回のメモリ アクセスが必要ですか?
TLB に 8 つではなく 4 つのエントリがある場合、違いはありますか?
というわけで、順番に読んでいきます。これは、8MB/4B = 2M のメモリ アクセスを意味します。2 レベルのページ テーブルがあります。したがって、2M + 2*2M = 6M のメモリ アクセスが TLB なしで行われます。
しかし、TLBを含むメモリアクセスを計算する方法がわかりません。
誰か私にそれを説明してもらえますか? それはとても役に立ちます。
memory-management - TLB ヒット - ページがプロセスのメモリ空間内にあるかどうかの確認
仮想アドレスから物理アドレスへの変換について読んでいます。TLB は、CPU のメモリ管理ユニットに常駐するハードウェア キャッシュであり、最近アクセスされたページのマッピングを含むことを理解しています。
ただし、TLB ヒットがあるとします。OS は、プロセスがページに実際にアクセスできる (プロセスに割り当てられたアドレス空間内にある) ことをどのように保証しますか?
それを行う1つの方法は、プロセスのページテーブルを確認することだと思いますが、それはTLBを使用する目的全体を無効にしているようです. 洞察はありますか?
linux - 「cpsie」アーム命令の場合、TLB はミスしますか?
プログラムのプロファイリングを行ったところ、「_raw_spin_unlock_irq」システム コールが ARM Cortex A15 ボードで多くの iTLB ミスを引き起こしていることがわかりました。アセンブリ コードを注意深く確認したところ、"cpsie" 命令が原因の 1 つである可能性があることがわかりました。したがって、私は自分の仮定を検証するために短いコードをプログラムしました。
以下は私のコードです:
次に、perf ツールを使用して iTLB ミスを確認したところ、次のように報告されました。
89172 dTLB ロードミス
5694 dTLB ストア ミス
43248 iTLB ロードミス
「cpsie i」命令を削除すると、結果は次のようになります。
23453 dTLB ロードミス
1453 dTLB ストア ミス
12035 iTLB ロードミス
結果は、「cpsie i」が iTLB ミスの 4 倍に増加したことを示しています。パフォーマンス レポートを使用してバイナリ コードに注釈を付けました。69.5% の iTLB ミスが "cpsie i" 命令の後に隣接して発生しました。
「cpsie i」命令の後に多くの iTLB ミスが発生したのはなぜですか? それを防ぐ方法はありますか?ありがとう!
tlb - TLB のロックと無効化をチェックするテストを作成する方法は?
ソフトウェア MMU を検証しようとしています。
入手したテストケースでは、「TLB ロックと無効化」をチェックする必要があります。
テストを実行して TLB ミスをチェックしましたが、TLB ロックと無効化が正確に何を意味するのかを理解できませんでした。