物理内存布局探测
计算机启动后,需要知道当前机器上实际的物理内存布局。一般是通过BIOS的INT 15
中断来获取,根据参数(%eax
)的不同,分为三种方式:0xe820,0x801和0x88。
e820方式
e820方式用内存范围描述符(Address Range Descriptor)格式来保存获得的一段内存布局。
字段 | 大小 | 说明 |
---|---|---|
address | 8字节 | 内存块基地址 |
length | 8字节 | 内存大小 |
type | 4字节 | 内存类型 |
内存类型代码如下。
代码 | 说明 |
---|---|
01 | 系统可用内存 |
02 | 保留,不可用(例如硬件映射的ROM) |
03 | ACPI Reclaim内存(usable by OS after reading ACPI tables) |
04 | ACPI NVS内存(OS is required to save this memory between NVS sessions) |
其他 | 未定义,不可用 |
e820方式中断的调用参数如下。
参数 | 说明 |
---|---|
%eax |
值为e820h,INT 15 的中断调用参数 |
%edx |
值为534D4150h(即4个ASCII字符“SMAP”) |
%ebx |
如果是第一次调用或内存区域扫描完毕,则为0。 如果不是,则存放上次调用之后的计数值 |
%ecx |
保存内存范围描述符的内存大小,应该大于等于20字节 |
es:di |
用来保存内存范围描述符结构的缓冲区 |
此中断的返回值如下。
返回值 | 说明 |
---|---|
eflags的CF位 | 若INT 15 中断执行成功,则不置位,否则置位 |
%eax |
534D4150h ("SMAP") |
es:di |
指向保存内存范围描述符的缓冲区,此时缓冲区内的数据已由BIOS填写完毕 |
%ebx |
下一个地址范围描述符的计数地址 |
%ecx |
返回BIOS往ES:DI处写的地址范围描述符的字节大小 |
%ah |
失败时保存出错代码 |