問題タブ [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.
c - mremap() よりもメモリ ページを移動する高速な方法は?
私は mremap() を試してきました。仮想メモリ ページを高速で移動できるようにしたいと考えています。少なくともそれらをコピーするよりも高速です。メモリページを非常に高速に移動できることを利用できるアルゴリズムのアイデアがいくつかあります。問題は、以下のプログラムが mremap() が非常に遅いことを示していることです (少なくとも私の i7 ラップトップでは)。実際に同じメモリ ページをバイト単位でコピーする場合と比較して。
テスト ソース コードはどのように機能しますか? mmap() オン CPU キャッシュよりも大きい 256 MB の RAM。200,000 回繰り返します。各反復で、特定のスワップ メソッドを使用して 2 つのランダムなメモリ ページをスワップします。mremap() ベースのページ スワップ メソッドを使用して 1 回だけ実行します。再度実行し、バイトごとのコピー スワップ メソッドを使用して時間を計ります。mremap() は 1 秒あたり 71,577 ページ スワップしか管理しないのに対し、バイトごとのコピーは 1 秒あたりなんと 287,879 ページ スワップを管理することがわかります。したがって、mremap() は、バイトごとのコピーよりも 4 倍遅くなります。
質問:
なぜ mremap() はとても遅いのですか?
より高速なユーザーランドまたはカーネルランドの呼び出し可能なページマッピング操作 API は他にありますか?
複数の連続していないページを 1 回の呼び出しで再マップできるようにする、別のユーザーランドまたはカーネルランドの呼び出し可能なページマッピング操作 API はありますか?
このようなことをサポートするカーネル拡張機能はありますか?
更新: 「カーネル空間へのラウンドトリップ」がどれほど速いかを疑問視する必要がないように、getpid() を 3 回続けて、1 秒間に 81,916,192 回呼び出すことができることを示すパフォーマンス テスト プログラムを次に示します。 i7 ラップトップ:
更新 2: 私が発見した modify_ldt() という関数を呼び出す WIP コードを追加しました。man ページは、ページ操作が可能である可能性があることを示唆しています。ただし、何を試しても、読み取ったバイト数を返すことを期待している場合、関数は常にゼロを返します。'man modify_ldt' は、「成功すると、modify_ldt() は実際に読み取られたバイト数 (読み取りの場合) または 0 (書き込みの場合) を返します。失敗すると、modify_ldt() は -1 を返し、エラーを示すために errno を設定します。」(a) modify_ldt() が mremap() の代替になるかどうかについてのアイデアはありますか? (b)modify_ldt()を機能させる方法は?
memory-management - Linux カーネルで TLB ミスを処理するためのコール グラフ
Linux カーネルが TLB ミスを処理する方法を理解しようとしています。具体的には、ページ テーブル ウォークが発生することはわかっていますが、TLB ミスが発生した場合follow_page
にmm/memory.c
follow_page がどのように呼び出されるかを知っています。struct page
follow_pageの戻り値 ( ) はどのようにハードウェアに戻されますか? ハードウェアによって TLB ミス例外が発生してから が呼び出されるまでの TLB ミス処理の呼び出しグラフを誰かが説明できますかfollow_page
?
follow_page
カーネル コードhttp://lxr.linux.no/linux+v3.4.4/+search=follow_page内を検索しましたが、結果はあまり役に立たないようです。明確にするために、ハードウェアが x86_64 であるとしましょう。
linux - IntelPEBSを使用したDTLBミスアドレストレース
ハードウェアパフォーマンスカウンタを使用して、D-TLBミスのアドレストレースを生成しようとしています。Intelプロセッサには、サンプルが取得されるたびにハードウェアレジスタの内容をダンプできる「PreciseEvent Based Sampling」(PEBS)があります。このレジスタダンプを使用して、D-TLBミスの原因となったアドレスを作成する必要があります。ただし、レジスタダンプからアクセスのアドレスを生成するにはどうすればよいかわかりません。
誰かが似たようなことをした経験があり、これについていくつかの指針を教えてくれますか?
ありがとう
アルカ
memory-management - 設計されたTLBと設計されたページテーブル
アーキテクトされたTLBとアーキテクトされたページテーブルの違いは何ですか?
mips - MIPS R4000: 各 EntryLo レジスタにグローバル ビットがあるのはなぜですか?
次の R4000 ドキュメントの 81 ページ: http://www.scribd.com/doc/53181649/70/EntryLo0-2-and-EntryLo1-3-Registers
各 TLB エントリに 1 つのグローバル ビットを表示します (これは理にかなっています)。グローバル ビットが TLB エントリに設定されている場合、ルックアップ中に ASID は無視されます。
However, on the following page, the EntryHi register has a reserved (0) field in place of the TLB entry's global bit (as mentioned in the header on page 82). In its place, there are two global bits, one in each EntryLo{0,1} register.
Several sources (including "See MIPS Run") suggest that, when writing a TLB entry using the TLBW instruction, if the EntryLo0 (G) and EntryLo1 (G) bits are not identical, "bad things will happen." Other sources, such as a forum post on linux-mips.org, (http://www.linux-mips.org/archives/linux-mips/2003-04/msg00226.html) suggest that "in other words, writing a TLB entry with only one of the G bits in the EntryLo{0,1} register pair set will result in a TLB entry with the G bit cleared." (Which, in and of itself, is unclear what exactly will happen -- "something bad", or a TLB entry with its G bit clear).
What is the reason for two global bits, then? Is it in place for legacy support, or am I missing out on something?
c - 仮想メモリ システム、ページ テーブル、および TLB
私はこの問題を解決するために頭をぶつけていましたが、一歩も進むことができませんでした。質問は次のようなものです。
次の C プログラムを考えてみましょう。
ページ サイズが 4 KB で、TLB が 64 エントリのマシンでこのプログラムを実行した場合、内側のループを実行するたびに TLB ミスが発生する M と N の値はどれですか?
どうすれば解決できるのか、誰かヒントを教えてください。
linux - 1GBページと透過的な巨大ページ(Linux)
最近のLinuxカーネルでのTransparent Huge Pages(THP)
サポートにより、異なるページサイズ間での自動昇格/降格が可能になります(たとえば、x86-64では4KBと2MB)。しかし、THPがページ間またはページ間またはページ間4KB
でページサイズを昇格/降格できるかどうかはわかりません。1GB
2MB
1GB
誰かがこれについてコメントできますか?
x86 - TLB invlpg 命令のレイテンシが長い
そのため、ページ テーブル操作を行うこのカーネル モジュールに取り組んでいますが、TLB エントリのフラッシュが遅いことに気付きました。どのくらい遅いですか?invlpg の呼び出しごとに 100 ns 以上! それは 280 サイクル以上です。私はこれを喜んで受け入れます...しかし、ハードウェアでサポートされているページングとアドレス変換の場合、これは直感に反するように思えます。なぜこれがそんなに悪いのか誰か知っていますか?
4 コア 2.8 Ghz Intel Core i5 で実行しています
x86 - invlpg 命令が呼び出されたときのセグメンテーション違反
tlb フラッシュ機能を実装しようとしています。フラッシュにはINVLPG
命令を使用しますが、残念ながら、常にセグメンテーション違反が発生します。この問題で私を助けてもらえますか?
コードは次のとおりです。
x86 - x86_64 アーキテクチャでの複数のページ サイズでの TLB の使用
最新の x86_64 マイクロプロセッサ (Intel SandyBridge、AMD Bulldozer) で、TLB (L1 および L2) が複数のページ サイズでの同時アクセスをサポートしているかどうか知っている人はいますか? x86 コア パイプラインはページ サイズに関する情報を MMU に提供しますか?
よろしくお願いします、
アレックス