最新の64ビットx86 Linuxでは、カーネル側は仮想ページと物理ページ間のマッピングをどのように設定しますか?ユーザー側では、mmap
4K ページをユーザー・スペースに直接マップするページ・キャッシュからページを取得できます。しかし、私はページがカーネル側でどのようにマッピングされるかに興味があります。
「フルメモリIDマッピング」などを使用していますか?完全なRAM IDマップは通常1GBのページを使用しますか?
答え1
最新の64ビットx86 Linuxを使用していますか?
はい。kmap()
or を呼び出しますkmap_atomic()
が、x86-64は常にIDマッピングを使用します。 x86-32には具体的な定義がありますが、x86-64は一般的な定義を使用しているようです。/linux/highmem.hを含む。
はい、IDマッピングは1GBの大容量ページを使用します。
私はkmap_atomic()を見つけて見つけました。PIOコード.[*]
最後に、read()/ write()がページキャッシュからページキャッシュにデータをコピーしたとき:
generic_file_buffered_read->ページをイテレータにコピー->もう一度kmap_atomic()を実行します。
[*]私は、ページキャッシュでDMAを実行するときにカーネルがマッピングの使用を避けることができることに気づいたので、PIOを見ました。カーネルは物理アドレスを解析してハードウェアに渡すことができます:-). (IOMMUによって異なります)。ただし、カーネルが最初にデータをチェックサムまたは暗号化したい場合は、マッピングが必要です。