2017-06-27 4 views
0

カーネルのドキュメント/ 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が得られます。

これらの大きな仮想アドレスではどのようなルールがあり、どのように適切な物理アドレスを得ることができますか?

ありがとう!

答えて

0

お使いのPCには、DRAMだけでなく、ROM(今日のフラッシュ)とI/Oメモリも搭載されています。下位互換性のためには、それらの一部を20ビットおよび32ビットのアドレス空間にマップする必要があります。したがって、RAMの最後の部分は0x400000000より上のいくつかのアドレスで終了します。

+0

ありがとうございます!私は最終的に[リンク] http://resources.infosecinstitute.com/system-address-map-initialization-x86x64-architecture-part-2-pci-express-based-systems/を紹介しましたメモリレイアウト。私が得たもう1つの質問は、この大きなアドレスがDMA操作に使用できないように思われるため、アドレスが「メインメモリリコールアドレス範囲」内にあると仮定します。 virt_to_phys()から取得したアドレスは、DDRコントローラのビューからのアドレスと同じではなく、この違いはDMAに使用できません。私が間違っている場合は私を修正する –

0

物理アドレスはRAM用だけではありません。マシンに接続されたさまざまなデバイスには、物理​​アドレスもいくつかあります。プロセッサは単にアドレスバス上に物理アドレスを置き、一方またはデバイスはそれに応答する。

あなたのケースでは、これらの物理アドレスはROM(CD ROMなど)のようなIOデバイスである可能性があります。

また、RAMの物理アドレスは16GBを超えるものでもかまいません。どこに置かれているかだけに依存します。

関連する問題