web-dev-qa-db-ja.com

64ビットx86アーキテクチャのカーネルでページキャッシュはどのようにマッピングされますか?

最新の64ビットx86Linuxでは、仮想ページと物理ページの間のマッピングはカーネル側でどのように設定されていますか?ユーザー側では、ページキャッシュからページをmmapすることができます。これにより、4Kページがユーザースペースに直接マップされますが、カーネル側でページがどのようにマップされるかに興味があります。

「RAM全体のIDマッピング」などを利用していますか?そのRAM全体のIDマッピングは一般的に1GBのページを使用していますか?

7
BeeOnRope

最新の64ビットx86Linuxでは?

はい。 kmap()またはkmap_atomic()を呼び出しますが、x86-64では、これらは常にIDマッピングを使用します。 x86-32には特定の定義がありますが、x86-64は include/linux/highmem.h で一般的な定義を使用していると思います。

はい、IDマッピングは1GBの巨大ページを使用します。

kmap_atomicに言及しているLWNの記事

PIOコード 。[*]を見て、kmap_atomic()を見つけました。

最後に、read()/ write()がページキャッシュとの間でデータをコピーする場合:

generic_file_buffered_read -> copy_page_to_iter -> kmap_atomic()再び。


[*] PIOを調べたのは、ページキャッシュとの間でDMAを実行するときに、カーネルがマッピングの使用を回避できることに気付いたためです。カーネルは物理アドレスを解決して渡すことができますハードウェアに:-)。 (IOMMUの対象)。ただし、最初にデータをチェックサムまたは暗号化する場合は、カーネルにマッピングが必要になります。

1
sourcejedi