如何从硬件获得内存布局(E820)

E820如何从硬件获得内存布局

背景

在操作系统开始管理内存之前,首先要获取物理内存的信息,比如共有多少物理地址是可用的? 有哪些物理地址是被ACPI(Advanced Configuration and Power Interface)数据使用? 这些信息从何而来?
e820就是BIOS像x86架构(包括x86_64)上的操作系统引导程序提供物理内存信息的功能。当请求BIOS中断号15H,并且置操作码AX=E820H的时候,BIOS就会向调用者报告可用的物理地址区间等信息,e820由此得名。

什么是E820?

E820是基于X86的计算机系统的BIOS将内存映射报告给操作系统或引导加载程序的便利工具。通过将AX寄存器设置为十六进制值E820,可以通过INT15H调用对其进行访问,报告哪些内存地址范围可用,哪些保留给BIOS使用。"BIOS-e820"通常是启动Linux内核报告的第一件事,可以通过dmesg命令看到它。使用dmesg可以看到相关的信息:

hacher@reaper:~# dmesg | grep BIOS-e820
[    0.000000] BIOS-e820: [mem 0x0000000000000000-0x000000000009bbff] usable #01
[    0.000000] BIOS-e820: [mem 0x000000000009bc00-0x000000000009ffff] reserved
[    0.000000] BIOS-e820: [mem 0x00000000000e0000-0x00000000000fffff] reserved
[    0.000000] BIOS-e820: [mem 0x0000000000100000-0x00000000bb4f2fff] usable #02
[    0.000000] BIOS-e820: [mem 0x00000000bb4f3000-0x00000000bb532fff] ACPI NVS
[    0.000000] BIOS-e820: [mem 0x00000000bb533000-0x00000000bb543fff] reserved
[    0.000000] BIOS-e820: [mem 0x00000000bb544000-0x00000000bb554fff] ACPI NVS
[    0.000000] BIOS-e820: [mem 0x00000000bb555000-0x00000000bb55dfff] reserved
[    0.000000] BIOS-e820: [mem 0x00000000bb55e000-0x00000000bb565fff] ACPI NVS
[    0.000000] BIOS-e820: [mem 0x00000000bb566000-0x00000000bb57ffff] reserved
[    0.000000] BIOS-e820: [mem 0x00000000bb580000-0x00000000bb580fff] ACPI NVS
[    0.000000] BIOS-e820: [mem 0x00000000bb581000-0x00000000bb58ffff] reserved
[    0.000000] BIOS-e820: [mem 0x00000000bb590000-0x00000000bb594fff] ACPI NVS
[    0.000000] BIOS-e820: [mem 0x00000000bb595000-0x00000000bb59bfff] reserved
[    0.000000] BIOS-e820: [mem 0x00000000bb59c000-0x00000000bb59cfff] ACPI NVS
[    0.000000] BIOS-e820: [mem 0x00000000bb59d000-0x00000000bb59ffff] reserved
[    0.000000] BIOS-e820: [mem 0x00000000bb5a0000-0x00000000bb5a2fff] ACPI data
[    0.000000] BIOS-e820: [mem 0x00000000bb5a3000-0x00000000bb5a7fff] reserved
[    0.000000] BIOS-e820: [mem 0x00000000bb5a8000-0x00000000bb5b5fff] ACPI NVS
[    0.000000] BIOS-e820: [mem 0x00000000bb5b6000-0x00000000bb5cbfff] reserved
[    0.000000] BIOS-e820: [mem 0x00000000bb5cc000-0x00000000bb5cdfff] ACPI NVS
[    0.000000] BIOS-e820: [mem 0x00000000bb5ce000-0x00000000bfffffff] reserved
[    0.000000] BIOS-e820: [mem 0x00000000e0000000-0x00000000efffffff] reserved
[    0.000000] BIOS-e820: [mem 0x00000000fec00000-0x00000000fec00fff] reserved
[    0.000000] BIOS-e820: [mem 0x00000000fed1b000-0x00000000fed1ffff] reserved
[    0.000000] BIOS-e820: [mem 0x00000000fee00000-0x00000000fee00fff] reserved
[    0.000000] BIOS-e820: [mem 0x00000000ffa00000-0x00000000ffbfffff] reserved
[    0.000000] BIOS-e820: [mem 0x00000000ffe00000-0x00000000ffffffff] reserved
[    0.000000] BIOS-e820: [mem 0x0000000100000000-0x00000002bfffffff] usable #03
...

其中usable的区间就是实际被映射到物理内存上的地址空间,上面标注出来的{#01,#02,#03}区间,就是我主要的可用的物理地址区间。
表示
Usable:表示已经被映射到物理内存的物理地址。
Reserved:表示这些区间是没有被映射到任何地方,不能当作RAM来使用,但是Kernel可决定将该区间映射到其他地方,比如PCI设备。通过读取/proc/iomem可以查看物理地址空间的映射情况,可以知道这些reserved的空间,是如何进一步分配给不同的设备来使用的。
ACPI data:表示映射到用来存放ACPI数据的RAM空间,操作系统应该将ACPI Table读入到这个区间内。
ACPI NVS:表示映射到用来存放ACPI数据的非易失性存储空间,操作系统不能使用。
Unusable:表示检测到发生错误的物理内存。这个在上面例子里没有,因为比较少见。

随着内核的启动,内核还会修改E820的信息{#11,#12,#13}。

hacher@reaper:~# dmesg | grep e820
[    0.000000] BIOS-e820: [mem 0x0000000000000000-0x000000000009bbff] usable
[    0.000000] BIOS-e820: [mem 0x000000000009bc00-0x000000000009ffff] reserved
[    0.000000] BIOS-e820: [mem 0x00000000000e0000-0x00000000000fffff] reserved
[    0.000000] BIOS-e820: [mem 0x0000000000100000-0x00000000bb4f2fff] usable
[    0.000000] BIOS-e820: [mem 0x00000000bb4f3000-0x00000000bb532fff] ACPI NVS
[    0.000000] BIOS-e820: [mem 0x00000000bb533000-0x00000000bb543fff] reserved
[    0.000000] BIOS-e820: [mem 0x00000000bb544000-0x00000000bb554fff] ACPI NVS
[    0.000000] BIOS-e820: [mem 0x00000000bb555000-0x00000000bb55dfff] reserved
[    0.000000] BIOS-e820: [mem 0x00000000bb55e000-0x00000000bb565fff] ACPI NVS
[    0.000000] BIOS-e820: [mem 0x00000000bb566000-0x00000000bb57ffff] reserved
[    0.000000] BIOS-e820: [mem 0x00000000bb580000-0x00000000bb580fff] ACPI NVS
[    0.000000] BIOS-e820: [mem 0x00000000bb581000-0x00000000bb58ffff] reserved
[    0.000000] BIOS-e820: [mem 0x00000000bb590000-0x00000000bb594fff] ACPI NVS
[    0.000000] BIOS-e820: [mem 0x00000000bb595000-0x00000000bb59bfff] reserved
[    0.000000] BIOS-e820: [mem 0x00000000bb59c000-0x00000000bb59cfff] ACPI NVS
[    0.000000] BIOS-e820: [mem 0x00000000bb59d000-0x00000000bb59ffff] reserved
[    0.000000] BIOS-e820: [mem 0x00000000bb5a0000-0x00000000bb5a2fff] ACPI data
[    0.000000] BIOS-e820: [mem 0x00000000bb5a3000-0x00000000bb5a7fff] reserved
[    0.000000] BIOS-e820: [mem 0x00000000bb5a8000-0x00000000bb5b5fff] ACPI NVS
[    0.000000] BIOS-e820: [mem 0x00000000bb5b6000-0x00000000bb5cbfff] reserved
[    0.000000] BIOS-e820: [mem 0x00000000bb5cc000-0x00000000bb5cdfff] ACPI NVS
[    0.000000] BIOS-e820: [mem 0x00000000bb5ce000-0x00000000bfffffff] reserved
[    0.000000] BIOS-e820: [mem 0x00000000e0000000-0x00000000efffffff] reserved
[    0.000000] BIOS-e820: [mem 0x00000000fec00000-0x00000000fec00fff] reserved
[    0.000000] BIOS-e820: [mem 0x00000000fed1b000-0x00000000fed1ffff] reserved
[    0.000000] BIOS-e820: [mem 0x00000000fee00000-0x00000000fee00fff] reserved
[    0.000000] BIOS-e820: [mem 0x00000000ffa00000-0x00000000ffbfffff] reserved
[    0.000000] BIOS-e820: [mem 0x00000000ffe00000-0x00000000ffffffff] reserved
[    0.000000] BIOS-e820: [mem 0x0000000100000000-0x00000002bfffffff] usable
[    0.001803] e820: update [mem 0x00000000-0x00000fff] usable ==> reserved #11
[    0.001805] e820: remove [mem 0x000a0000-0x000fffff] usable #12
[    0.002844] e820: update [mem 0xbc000000-0xffffffff] usable ==> reserved #13
[    0.449865] e820: reserve RAM buffer [mem 0x0009bc00-0x0009ffff]
[    0.449867] e820: reserve RAM buffer [mem 0xbb4f3000-0xbbffffff]

Reference

  1. e820与kernel物理内存映射

  2. Linux如何操作设备中的存储器?

  3. 从硬件获得内存布局–e820

  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值