http://deltamaster.is-programmer.com/posts/37297.html

我们都对操作系统如何管理内存有一定的了解,然而,在操作系统开始管理内存之前,首先要获取物理内存的信息,比如一共有多少物理地址是可用的,有哪些物理地址是被ACPI(Advanced Configuration and Power Interface)数据使用,这些信息从何而来呢?

e820就是BIOS像x86架构(包括x86_64)上的操作系统引导程序提供物理内存信息的功能。当请求BIOS中断号15H,并且置操作码AX=E820H的时候,BIOS就会向调用者报告可用的物理地址区间等信息,e820由此得名。

Linux内核也通过这种机制来获得物理地址信息,使用dmesg可以看到相关的信息:

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

[    0.000000] BIOS-provided physical RAM map:

[    0.000000]  BIOS-e820: 0000000000000000 - 000000000009e800 (usable)

[    0.000000]  BIOS-e820: 000000000009e800 - 00000000000a0000 (reserved)

[    0.000000]  BIOS-e820: 00000000000e0000 - 0000000000100000 (reserved)

[    0.000000]  BIOS-e820: 0000000000100000 - 0000000020000000 (usable)  #511MB

[    0.000000]  BIOS-e820: 0000000020000000 - 0000000020200000 (reserved)

[    0.000000]  BIOS-e820: 0000000020200000 - 0000000040000000 (usable)  #510MB

[    0.000000]  BIOS-e820: 0000000040000000 - 0000000040200000 (reserved)

[    0.000000]  BIOS-e820: 0000000040200000 - 00000000aac0d000 (usable)  #1706MB

[    0.000000]  BIOS-e820: 00000000aac0d000 - 00000000aad8e000 (reserved)

[    0.000000]  BIOS-e820: 00000000aad8e000 - 00000000aad95000 (usable)

[    0.000000]  BIOS-e820: 00000000aad95000 - 00000000aad96000 (reserved)

[    0.000000]  BIOS-e820: 00000000aad96000 - 00000000aad97000 (usable)

[    0.000000]  BIOS-e820: 00000000aad97000 - 00000000aadb8000 (reserved)

[    0.000000]  BIOS-e820: 00000000aadb8000 - 00000000aadc6000 (usable)

[    0.000000]  BIOS-e820: 00000000aadc6000 - 00000000aade8000 (reserved)

[    0.000000]  BIOS-e820: 00000000aade8000 - 00000000aaf23000 (usable)

[    0.000000]  BIOS-e820: 00000000aaf23000 - 00000000aafe8000 (ACPI NVS)

[    0.000000]  BIOS-e820: 00000000aafe8000 - 00000000aaffd000 (usable)

[    0.000000]  BIOS-e820: 00000000aaffd000 - 00000000ab000000 (ACPI data)

[    0.000000]  BIOS-e820: 00000000ab000000 - 00000000b0000000 (reserved)

[    0.000000]  BIOS-e820: 00000000e0000000 - 00000000e4000000 (reserved)

[    0.000000]  BIOS-e820: 00000000fec00000 - 00000000fec01000 (reserved)

[    0.000000]  BIOS-e820: 00000000fed10000 - 00000000fed14000 (reserved)

[    0.000000]  BIOS-e820: 00000000fed18000 - 00000000fed1a000 (reserved)

[    0.000000]  BIOS-e820: 00000000fed1c000 - 00000000fed20000 (reserved)

[    0.000000]  BIOS-e820: 00000000fee00000 - 00000000fee01000 (reserved)

[    0.000000]  BIOS-e820: 00000000ff980000 - 00000000ffc00000 (reserved)

[    0.000000]  BIOS-e820: 00000000ffd80000 - 0000000100000000 (reserved)

[    0.000000]  BIOS-e820: 0000000100000000 - 000000014f800000 (usable)  #1272MB

上面是我在自己计算机上得到的数据,其中usable的区间就是实际被映射到物理内存上的地址空间,上面标注出来的四个区间,就是我主要的四个可用的物理地址区间了,大约4GB。

  • Usable:已经被映射到物理内存的物理地址。
  • Reserved:这些区间是没有被映射到任何地方,不能当作RAM来使用,但是kernel可以决定将这些区间映射到其他地方,比如PCI设备。通过检查/proc/iomem这个虚拟文件,就可以知道这些reserved的空间,是如何进一步分配给不同的设备来使用了。
  • ACPI data:映射到用来存放ACPI数据的RAM空间,操作系统应该将ACPI Table读入到这个区间内。
  • ACPI NVS:映射到用来存放ACPI数据的非易失性存储空间,操作系统不能使用。
  • Unusable:表示检测到发生错误的物理内存。这个在上面例子里没有,因为比较少见。

内核读到这些信息后,将其保存在e820map结构体中,有两个副本,一个符号名叫e820,还有一个符号名叫e820_saved。具体的数据结构可以参考arch/x86/include/asm/e820.h。随着内核的启动,内核还会修改e820的信息。

?

1

2

3

[    0.000000] e820 update range: 0000000000000000 - 0000000000010000 (usable) ==> (reserved)

[    0.000000] e820 remove range: 00000000000a0000 - 0000000000100000 (usable)

[    0.000000] e820 update range: 00000000ab000000 - 0000000100000000 (usable) ==> (reserved)

比如在我的系统上发生了这样三次e820的改动,这些改动已经与BIOS没有任何关系了,只是内核自己通过修改自己的内存数据结构,来改变自己对内存区间的使用。

还有一个典型的例子是当内核启动参数中有置顶memmap这样的参数项时,内核会修改指定的usable的区间为reserved,这样内核就不能将虚拟地址映射到这些物理地址空间了,换言之就是不能使用这块物理内存了(其实通过ioremap还是可以将其映射到内核的虚拟地址空间的,但是这些行为都是自己控制的而不会受到其他程序的干扰)。这样当我们需要自己管理某段物理内存而不希望内核干预时就很有用处,比如基于物理内存的文件系统,就可以这样实现。

内核中还提供了一系列操作e820数据结构的函数,函数声明都在arch/x86/include/asm/e820.h,相应的定义都在arch/x86/kernel/e820.c中。文章开头看到的这段信息,就是由void __init e820_print_map(char *who)来打印的。

在这个过程中,e820_saved始终保持原始的状态不变,以便查询BIOS提供的真实映射信息,不过内核目前好像没有使用这个数据结构。我曾经有使用过它,用来检查某个物理地址是否确实是物理内存。

e820与kernel物理内存映射相关推荐

  1. linux kernel内存映射实例分析

    作者:JHJ(jianghuijun211@gmail.com) 日期:2012/08/24 欢迎转载,请注明出处 引子 现在android智能手机市场异常火热,硬件升级非常迅猛,arm cortex ...

  2. [内存管理] linux kernel内存映射实例分析

    作者:JHJ(jianghuijun211@gmail.com ) 日期:2012/08/24 欢迎转载,请注明出处 引子 现在android智能手机市场异常火热,硬件升级非常迅猛,arm corte ...

  3. linux应用对物理内存映射,深入理解Linux内存映射机制 (1)

    一. 绪 论 二. X86的硬件寻址方法 三. 内核对页表的设置 四. 实例分析映射机制 一. 绪 论 我们经常在程序的反汇编代码中看到一些类似0x32118965这样的地址,操作系统中称为线性地址, ...

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

    E820如何从硬件获得内存布局 背景 在操作系统开始管理内存之前,首先要获取物理内存的信息,比如共有多少物理地址是可用的? 有哪些物理地址是被ACPI(Advanced Configuration a ...

  5. 谈谈Linux内核物理内存与虚拟内存之间的映射(超详细~)

    1.用户编制程序时使用的地址称为虚地址或逻辑地址,其对应的存储空间称为虚存空间或逻辑地址空间:而计算机物理内存的访问地址则称为实地址或物理地址,其对应的存储空间称为物理存储空间或主存空间. 2.虚拟存 ...

  6. linux内存布局及页面映射

    在Linux系统中,以32bit x86系统来说,进程的4GB内存空间(虚拟地址空间)被划分成为两个部分 ------用户空间和内核空间,大小分别为0-3G,3-4G. 用户进程通常情况下,只能访问用 ...

  7. linux kernel 内存管理 感想总结(未完待续)

    理解内存管理需要知道的概念 什么是 MMU , MMU的作用? 什么是页帧,页,页表,区,他们之间的关系又是怎样的 ? 什么是页的高速缓存 地址线, 寻址, cpu 和 各级高速缓存的关系, cpu ...

  8. 深入理解Linux内存映射机制

    Author: wzt EMail: [email]wzt@xsec.org[/email] Site: [url]http://www.xsec.org[/url] Date: 2008-6-13 ...

  9. VFIO - 将 DMA 映射暴露给用户态

    <ARM SMMU原理与IOMMU技术("VT-d" DMA.I/O虚拟化.内存虚拟化)> <提升KVM异构虚拟机启动效率:透传(pass-through).DM ...

最新文章

  1. atomic原子类实现机制_JUC学习笔记--Atomic原子类
  2. 机器学习加深了“知识”和“理解”之间的鸿沟
  3. 计算机软件基础操作,计算机软件基础 第九章 Excel基本操作(1页)-原创力文档...
  4. Pro ASP.NET MVC –第五章 使用Razor
  5. HTML 事件属性_03
  6. 【视频版】有一种机房叫处女座的机房。。。
  7. Pytorch中DataLoader类
  8. 余弦欧式距离matlab,余弦相似度和欧几里得距离
  9. 死锁产生的原因及条件、如何避免死锁
  10. Windows 网络通讯开发
  11. UWP 流畅设计中的光照效果(容易的 RevealBorderBrush 和不那么容易的 RevealBackgroundBrush)...
  12. Cygwin的进程管理
  13. 世界排名第一的免费开源CRM客户关系管理系统介绍
  14. 解决C语言运行窗口一闪而过问题
  15. Python获取字符串中特定的内容
  16. Python饿汉式和懒汉式单例模式的实现
  17. Jenkins学习(执行命令路径,脚本上传静态html代码)(一)
  18. 【系统设计】本地生活之附近商家 LBS 服务实现
  19. 相当不错的在线用户故事地图绘制工具
  20. Linux 文档编辑 : ex 命令详解

热门文章

  1. 蚂蚁分类信息系统 列表显示标签名称和值
  2. 风行python_初识python
  3. Redis基础用法、高级特性与性能调优以及缓存穿透等分析
  4. SQL优化 20 连击
  5. winform图文编辑器三个开源项目
  6. 图斑从西北角起始编号,可分村分组,从左到右,从上到下的顺序编号。任意起始方位,任意排列方向,亦可轻松搞定。
  7. 抓取程序端口号http://localhost:12345
  8. 《数据科学导论》期末复习整理~2020
  9. 论文翻译—PolyLaneNet Lane Estimation via Deep Polynomial Regression
  10. 云总机的未来-移动办公