物理内存布局探测

物理内存布局探测

计算机启动后,需要知道当前机器上实际的物理内存布局。一般是通过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 失败时保存出错代码

参考资料

posted @ 2022-12-11 18:41  HachikoT  阅读(96)  评论(0编辑  收藏  举报