探测物理内存分布的大小和方法#
bootloader 增加的工作
bootasm.S 中对应了 probe_memory 到 finish_probe 的部分。
通过BIOS 中断 获取内存可调用参数为 e820h 的INT 15h BIOS中断。
BIOS 通过 系统内存映射 地址描述符(Address Range Descrptor)格式来表示系统物理内存布局。
(Values for System Memory Map address type) 内存类型及对用的参数
01h memory, available to OS
02h reserved, not available (e.g. system ROM, memory-mapped device)
03h ACPI Reclaim Memory (usable by OS after reading ACPI tables)
04h ACPI NVS Memory (OS is required to save this memory between NVS sessions)
other not defined yet -- treat as Reserved
INT 15h BIOS 终端的详细调用参数
中断的返回值:
通过调用 INT 15h BIOS 中断, 递增di的值 (20 (系统内存物理布局描述符的)的倍数) 让BIOS 帮我们找到一个一个的内存布局entry 放入到一个保存地址范围描述符结构的缓冲区中
结构定义在 memlayout.h 中
附录B : 具体实现
probe_memory:
// 对0x80000 中的32位单元清零,给位于 0x8000 处的
// sturct e820map 成员变量nr_map 清零
略: 就是不断探测如果eflag cf 位为0 表示还需要进一步探测。
在探测的循环中递增 di(20) 递增 0x8000 出的nr_map
addw $20 %di
incl 0x80000