カーネルのドキュメント/ x86の/ x86_64版/ mm.txt言う:なぜこのような大規模な仮想アドレスは、x86_64版のカーネルのメモリレイアウトである
ffff880000000000 - ffffc7ffffffffff (=64 TB) direct mapping of all phys. memory
ので、私は、実際の物理的なDRAMのサイズよりも大きいアドレスのマッピングがあってはならないと仮定この地域ではしかし、16ギガバイトのDRAMとカーネルv4.2.8とx86_64版のPC上で、私は、/ SYS /カーネル/デバッグ/ kernel_page_tablesからこの結果を得た:
---[ Low Kernel Mapping ]---
......
0xffff88008b3ff000-0xffff88008b400000 4K RW GLB NX pte
0xffff88008b400000-0xffff8800c0000000 844M pmd
0xffff8800c0000000-0xffff880100000000 1G pud
0xffff880100000000-0xffff880400000000 12G RW PSE GLB NX pud
0xffff880400000000-0xffff88043dc00000 988M RW PSE GLB NX pmd
0xffff88043dc00000-0xffff88043dc25000 148K RW GLB NX pte
0xffff88043dc25000-0xffff88043dc27000 8K ro GLB NX pte
.......
0xffff88045c200000-0xffff88046f000000 302M RW PSE GLB NX pmd
0xffff88046f000000-0xffff880480000000 272M pmd
0xffff880480000000-0xffff888000000000 494G pud
0xffff888000000000-0xffffc90000000000 66048G pgd
あなたは( virt_to_physを使用して、仮想アドレス0xffff88043dc00000のページエントリがある見ます)は、実際のDRAMサイズ(16GBはちょうど 0x400000000)よりも大きいので、 が明らかに違法である0x43dc00000が得られます。
これらの大きな仮想アドレスではどのようなルールがあり、どのように適切な物理アドレスを得ることができますか?
ありがとう!
ありがとうございます!私は最終的に[リンク] http://resources.infosecinstitute.com/system-address-map-initialization-x86x64-architecture-part-2-pci-express-based-systems/を紹介しましたメモリレイアウト。私が得たもう1つの質問は、この大きなアドレスがDMA操作に使用できないように思われるため、アドレスが「メインメモリリコールアドレス範囲」内にあると仮定します。 virt_to_phys()から取得したアドレスは、DDRコントローラのビューからのアドレスと同じではなく、この違いはDMAに使用できません。私が間違っている場合は私を修正する –