最新の64ビットx86Linuxでは、仮想ページと物理ページの間のマッピングはカーネル側でどのように設定されていますか?ユーザー側では、ページキャッシュからページをmmap
することができます。これにより、4Kページがユーザースペースに直接マップされますが、カーネル側でページがどのようにマップされるかに興味があります。
「RAM全体のIDマッピング」などを利用していますか?そのRAM全体のIDマッピングは一般的に1GBのページを使用していますか?
最新の64ビットx86Linuxでは?
はい。 kmap()
またはkmap_atomic()
を呼び出しますが、x86-64では、これらは常にIDマッピングを使用します。 x86-32には特定の定義がありますが、x86-64は include/linux/highmem.h で一般的な定義を使用していると思います。
はい、IDマッピングは1GBの巨大ページを使用します。
PIOコード 。[*]を見て、kmap_atomic()を見つけました。
最後に、read()/ write()がページキャッシュとの間でデータをコピーする場合:
generic_file_buffered_read -> copy_page_to_iter -> kmap_atomic()再び。
[*] PIOを調べたのは、ページキャッシュとの間でDMAを実行するときに、カーネルがマッピングの使用を回避できることに気付いたためです。カーネルは物理アドレスを解決して渡すことができますハードウェアに:-)。 (IOMMUの対象)。ただし、最初にデータをチェックサムまたは暗号化する場合は、カーネルにマッピングが必要になります。