問題タブ [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.
assembly - TLB は 4K、2M、1GB のページを同時にマッピングできますか?
x86-64 のロング モードで、最近の Intel/AMD マイクロプロセッサでは、TLB が仮想アドレスをページ 4K、2MB、および 1GB (ヒュージ ページ) の物理アドレスに同時に変換できますか?
マニュアルを読んで理解したように、次のように設定すると可能です。
しかし、私はそれを試したことがないので、コーディングを始める前に、それが機能するかどうか教えていただけますか?
operating-system - x86-64でTLBに直接物理アドレスを提供する
ロングモードのx86-64アーキテクチャ上のTLBに直接、特定の仮想アドレスの物理アドレスを提供することは可能ですか?
たとえば、PML4Eにゼロを設定すると、無効なアドレスが検出されるため、ページフォールト例外がトリガーされます。例外の間に、CPUは、この仮想アドレスがX物理にあることを命令を使用して、TLBに通知できます。ページフレーム?
これを実行したいのは、コードによって物理アドレスがどこにあるかを簡単に判断できるためです。これにより、コストのかかるページウォークを回避できます。
memory - MIPS メモリ実行防止
I'm doing some research with the MIPS architecture and was wondering how operating systems are implemented with the limited instructions and memory protection that mips offers. I'm specifically wondering about how an operating system would prevent certain addresses ranges from being executed. For example, how could an operating system limit PC to operate in a particular range? In other words, prevent something such as executing from dynamically allocated memory?
The first thing that came to mind is with TLBs, but TLBs only offer memory write protection (and not execute).
I don't quite see how it could be handled by the OS either, because that would imply that every instruction would result in an exception and then MANY cycles would be burned just checking to see if PC was in a sane address range.
誰かが知っている場合、通常はどのように行われますか? 初期化中にハードウェアによって何らかの方法で処理されますか (たとえば、アドレス範囲が指定され、範囲外の場合は例外が発生しますか?)
java - メモリバリアとTLB
メモリバリアは、データキャッシュの一貫性を保証します。ただし、TLBの一貫性が保証されますか?
スレッド間でMappedByteBufferを渡すときに、JVM(java 7 update 1)がメモリエラー(SIGBUS、SIGSEG)でクラッシュすることがあるという問題が発生しています。
例えば
Thread.yield()がないと、force()、put()、およびCのmemcpy()でクラッシュが発生することがあります。これらはすべて、メモリに不正にアクセスしようとしていることを示しています。Thread.yield()を使用しても問題はありませんが、信頼できる解決策のようには思えません。
誰かがこの問題に遭遇しましたか?TLBとメモリバリアについての保証はありますか?
編集:OSはCentos 5.7ですが、i7およびDualXeonマシンでの動作を確認しました。
なぜ私はこれをするのですか?メッセージの書き込みにかかる平均時間は長さにもよりますが35〜100 nsであり、プレーンなwrite()の使用はそれほど高速ではないためです。現在のスレッドでメモリマップとクリーンアップを行う場合、これには50〜130マイクロ秒かかります。バックグラウンドスレッドを使用すると、メインスレッドがバッファを交換するのに約3〜5マイクロ秒かかります。なぜバッファを交換する必要があるのですか?私は多くのGBのデータを書き込んでおり、ByteBufferのサイズを2GB以上にすることはできないためです。
c - LinuxカーネルによるTLBエントリの無効化
Linuxカーネルでは、copy_page_range
(mm / memory.c)に似たコードを記述したため、COW最適化を使用してあるプロセスから別のプロセスにメモリをコピーします。宛先アドレスと送信元アドレスはによってオフセットすることができPAGE_SIZE
、COWは引き続き機能します。ただし、ユーザープログラムで、同じ送信元アドレスから別の宛先アドレスにコピーすると、TLBが適切にフラッシュされていないように見えることに気付きました。高レベルでは、ユーザーレベルのコードは次のことを行います(一度に1ページ、0x1000バイトをマシンにコピーします)。
SRC = 0x20000000
- SRCに書き込みます(関連するページを呼び出します
page1
)。 - 宛先プロセスでSRCを0x30000000にコピーするSyscall。これで、srcプロセスアドレス0x20000000と宛先プロセスアドレス0x30000000が同じページを指します(
page1
)。 - SRCとは異なるものを記述します(これにより、COWを処理するためのページフォールトがトリガーされます)。送信元アドレスがを指していると仮定し
page2
ます。 - 宛先プロセスでSRCを0x30001000にコピーするシステムコール。
この時点で、2つの別々のページが存在する必要があります。SRC0x20000000 page2
DST 0x30000000 page1
DST 0x30001000page2
手順3で、src 0x20000000に別の何かを書き込んでも、ページフォールトは生成されないことがわかりました。検査すると、実際のページマッピングは次のようになります。SRC0x20000000 page1
DST 0x30000000 page1
DST 0x30001000page1
私のコードではflush_tlb_page
、送信元アドレスを呼び出して渡すと、ユーザーコードは適切なページマッピングで期待どおりに機能します。したがって、TLBを正しく維持していないと確信しています。ではcopy_page_range
、カーネルはmmu_notifier_invalidate_range_start/end
ページテーブルを変更する前後に呼び出します。私はまったく同じことをしていて、実際に正しいstruct_mmとアドレスをに渡していることを再確認しましたmmu_notifier_invalidate_range_start/end
。この関数はtlbのフラッシュを処理しませんか?
さて、文字通りこれを入力し終えたとき、私はチェックして、dup_mmap
の主要な呼び出し元(kernel / fork.c)が。を呼び出すことに気づきました。カーネルコードの前後に呼び出す必要があると思います。これは正しいです?正確には何をしますか?copy_page_range
dup_mmap
flush_tlb_mm
flush_cache_range
flush_tlb_range
mmu_notifier_invalidate_range_start/end
linux - TLB のカーネル メモリ (仮想アドレス エントリ)?
Linux は OS であり、ARM はこのコンテキストで参照されるプロセッサです。
TLB には、カーネル空間とユーザー空間の両方の仮想アドレスが含まれていますか? カーネル メモリは
、最初の 3 GB がユーザー空間に属する場所0xc000_0000
から始まり、その場所に移動します。0xFFFF_FFFF
プロセス間のコンテキスト切り替えの間に、TLB がフラッシュされます。
TLB には、カーネル空間とユーザー空間の両方の仮想アドレスが含まれていますか?
カーネルメモリ(仮想)は物理メモリに直接対応します(オフセットするだけで0xC000_0000
物理アドレスが得られます)。TLB にカーネル メモリ (仮想) が必要ですか (TLB に存在すると言う場合)? ユーザー空間アドレスのみが存在する必要があります。
caching - L1ミスがL2アクセスと大きく異なる場合...TLB関連ですか?
私はいくつかのアルゴリズムでいくつかのベンチマークを実行し、それらのメモリ使用量と効率(L1 / L2 / TLBアクセスとミス)をプロファイリングしてきましたが、結果のいくつかは私にとって非常に興味深いものです。
包括的キャッシュ階層(L1およびL2キャッシュ)を考慮すると、L1キャッシュミスの数はL2キャッシュアクセス の数と一致するべきではありませんか?私が見つけた説明の1つは、TLBに関連するものです。仮想アドレスがTLBにマップされていない場合、システムは一部のキャッシュレベルでの検索を自動的にスキップします。これは合法だと思いますか?
tlb - TLBの結合性(ウェイの数)を知る方法は?
TLBキャッシュのさまざまな方法を学ぶタスクがあります。どのアルゴリズムを使用する必要がありますか?
linux - Linux でラージ/ヒュージ ページを使用するオープンソース アプリケーション
Linux (x86-64)でラージ/ヒュージ メモリ ページ(サイズが 4KB を超える OS メモリ ページ)を利用するオープンソース アプリケーションを探していました。今日、どのくらい大きなページが使用されているかを調べたかったのです。誰かがそのようなアプリケーションをいくつか教えてもらえますか?
ありがとう
アルカ
linux - LINUX で TLB ミスを測定するコマンド
LINUX で TLB ミスを測定するコマンドを教えてもらえませんか? マイナー ページ フォールトを TLB ミスと見なしても問題ありませんか?