我在Linux主机上使用“dmesg | grep e820”打印出了e820表的信息:aaa@aaa:~$ dmesg | grep e820
[    0.000000] e820: BIOS-provided physical RAM map:
[    0.000000] BIOS-e820: [mem 0x0000000000000000-0x00000000000903ff] usable
[    0.000000] BIOS-e820: [mem 0x0000000000090400-0x000000000009ffff] reserved
[    0.000000] BIOS-e820: [mem 0x00000000000e0000-0x00000000000fffff] reserved
[    0.000000] BIOS-e820: [mem 0x0000000000100000-0x00000000c9f98fff] usable
[    0.000000] BIOS-e820: [mem 0x00000000c9f99000-0x00000000c9f99fff] ACPI NVS
[    0.000000] BIOS-e820: [mem 0x00000000c9f9a000-0x00000000c9f9afff] reserved
[    0.000000] BIOS-e820: [mem 0x00000000c9f9b000-0x00000000d987cfff] usable
[    0.000000] BIOS-e820: [mem 0x00000000d987d000-0x00000000daeb3fff] reserved
[    0.000000] BIOS-e820: [mem 0x00000000daeb4000-0x00000000daef7fff] ACPI data
[    0.000000] BIOS-e820: [mem 0x00000000daef8000-0x00000000db818fff] ACPI NVS
[    0.000000] BIOS-e820: [mem 0x00000000db819000-0x00000000dbdfefff] reserved
[    0.000000] BIOS-e820: [mem 0x00000000dbdff000-0x00000000dbdfffff] usable
[    0.000000] BIOS-e820: [mem 0x00000000dbe00000-0x00000000dfffffff] reserved
[    0.000000] BIOS-e820: [mem 0x00000000f8000000-0x00000000fbffffff] reserved
[    0.000000] BIOS-e820: [mem 0x00000000fe000000-0x00000000fe010fff] reserved
[    0.000000] BIOS-e820: [mem 0x00000000fec00000-0x00000000fec00fff] reserved
[    0.000000] BIOS-e820: [mem 0x00000000fee00000-0x00000000fee00fff] reserved
[    0.000000] BIOS-e820: [mem 0x00000000ff000000-0x00000000ffffffff] reserved
[    0.000000] BIOS-e820: [mem 0x0000000100000000-0x000000021dffffff] usable
[    0.000000] e820: update [mem 0x00000000-0x00000fff] usable ==> reserved
[    0.000000] e820: remove [mem 0x000a0000-0x000fffff] usable
[    0.000000] e820: last_pfn = 0x21e000 max_arch_pfn = 0x400000000
[    0.000000] e820: last_pfn = 0xdbe00 max_arch_pfn = 0x400000000
[    0.000000] e820: [mem 0xe0000000-0xf7ffffff] available for PCI devices
[    0.135637] e820: reserve RAM buffer [mem 0x00090400-0x0009ffff]
[    0.135638] e820: reserve RAM buffer [mem 0xc9f99000-0xcbffffff]
[    0.135638] e820: reserve RAM buffer [mem 0xd987d000-0xdbffffff]
[    0.135639] e820: reserve RAM buffer [mem 0xdbe00000-0xdbffffff]
[    0.135640] e820: reserve RAM buffer [mem 0x21e000000-0x21fffffff]
aaa@aaa:~$ 可以看到BIOS-e820提供的最大物理地址为0x000000021dffffff,但是我这台主机内存条的大小只有8G,也就是最大物理地址应该是0x00000001ffffffff。
为什么物理地址范围超过了内存条8G的地址空间? 这个e820表应该如何详细解读?

解决方案 »

  1.   

    你应该理解地址空间和内存这两个概念是有区别的,你的最大物理地址0x000000021dffffff,并不代表就是从0到0x000000021dffffff,中间有很多空洞,例如
    [    0.000000] BIOS-e820: [mem 0x0000000000090400-0x000000000009ffff] reserved
    [    0.000000] BIOS-e820: [mem 0x00000000000e0000-0x00000000000fffff] reserved
    这两个都不连续,你把这些不连续的空洞减去,总量应该就是8G了