内存管理

#+STYLE: <link rel="stylesheet" href="../css/zenburn-emacs.css" type="text/css" />

物理内存的管理

Kernel 获取物理内存布局

参考 Detecting Memory (x86), BIOS 一般提供了两个指令获取内存布局

  • INT 0x12 该指令返回小于 1M 的可用内存
  • INT EAX=0XE820 该指令返回一个列表, 每个列表包括: 基地址, 长度, 类型

BIOS 返回的内存类型:

  • Type 1: Usable (normal) RAM
  • Type 2: Reserved - unusable
  • Type 3: ACPI reclaimable memory
  • Type 4: ACPI NVS memory
  • Type 5: Area containing bad memory

成功获取内存布局后, OS 一般做以下处理: 排序, 合并相邻区域, 修改覆盖的区域 (比如某个区域同时有2和3的内存类型, 把该区域修改为3的), 修改未知区域的类型为2

例如在 Linux 内核中, 会把最后的内存布局打印出来:

$ dmesg # 6G 的内存
[    0.000000] BIOS-provided physical RAM map:
[    0.000000]  BIOS-e820: 0000000000000000 - 000000000009fc00 (usable)
[    0.000000]  BIOS-e820: 00000000000f0000 - 0000000000100000 (reserved)
[    0.000000]  BIOS-e820: 0000000000100000 - 00000000bfe08c00 (usable)
[    0.000000]  BIOS-e820: 00000000bfe08c00 - 00000000bfe5cc00 (ACPI NVS)
[    0.000000]  BIOS-e820: 00000000bfe5cc00 - 00000000bfe5ec00 (ACPI data)
[    0.000000]  BIOS-e820: 00000000bfe5ec00 - 00000000c0000000 (reserved)
[    0.000000]  BIOS-e820: 00000000e0000000 - 00000000f0000000 (reserved)
[    0.000000]  BIOS-e820: 00000000fec00000 - 00000000fed00400 (reserved)
[    0.000000]  BIOS-e820: 00000000fed20000 - 00000000feda0000 (reserved)
[    0.000000]  BIOS-e820: 00000000fee00000 - 00000000fef00000 (reserved)
[    0.000000]  BIOS-e820: 00000000ffb00000 - 0000000100000000 (reserved)
[    0.000000]  BIOS-e820: 0000000100000000 - 00000001bc000000 (usable)

打赏一个呗

取消

感谢您的支持,我会继续努力的!

扫码支持
扫码支持
扫码打赏,你说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦