实现内存检测,理解Linux内存管理,实现101012分页
参考:
检测内存容量
趣谈 Linux 操作系统
内存管理
《操作系统真相还原》
1.内存检测
BIOS 中断 0x15 的子功能够获取0xE820 能够获取系统的内存布局,由于系统内存各部分的类型属性不同,
BIOS 就按照类型属性来划分这片系统内存,所以这种查询呈迭代式,每次 IOS 只返回一种类型的内存
信息,直到将所有内存类型返回完毕。子功能 OxE820 的强大之处是返回的内存信息较丰富,包括多个属
性字段,所以需要一种格式结构来组织这些数据。内存信息的内容是用地址范围描述符来描述的,用于存
储这种描述符的结构称之为地址范围描述符( Address Range Descriptor Structure, ARDS )
typedef struct {
unsigned int base_addr_low;
unsigned int base_addr_high;
unsigned int length_low;
unsigned int length_high;
unsigned int type;
}ARDS;
其中的 Type 宇段用来描述这段内存的类型,这里所谓的类型是说明这段内存的用途,即其是可以被操作系统使用,还是保留起来不能用。
BIOS 中断 0x15 的子功能 0xE820 是一个用于获取系统物理内存布局的功能。它可以检测系统中可用或不可用的内存地址范围以及其属性,包括内存大小、类型(例如 RAM、ROM、ACPI 等)、保留位等。该子功能通常用于可引导操作系统、虚拟机管理软件和其他需要在系统启动时了解内存布局信息的应用程序。
该子功能由以下输入参数和输出参数组成:
- 输入参数:
- eax:功能号,应设置为 0xE820(十进制数为 0x0000E820)
- ebx:签名标识符(signature),应设置为字符串"SMAP"
- ecx:缓冲区大小,表明可以返回的可用内存段结构体所占的最小字节数
- edx:传入此次调用之前使用该功能获得的下一个可用内存段信息的标识符,初始值为 0
- 输出参数:
- eax:操作完成后返回给系统的值,代表可用内存段信息的数量
- edx:传回一个下一可用段信息的标识符,该值在下一次调用时作为输入参数 edx 的值。如果没有其他可用段,则返回值为 0
- 可用内存段信息结构体:代表物理内存段的信息,共24个字节,结构如下: BaseAddr:8字节,代表内存段的基地址
- Len:8字节,代表内存段的长度(单位:字节)、
- Type:4字节,代表内存段类型(1 为可用,其余值不可用)
- Reserved:保留字段,大小为4字节
使用该子功能的步骤通常为:
- 1.使用 INT 0x15 中断的子功能 0x88 获取 BIOS 版本信息,检查是否支持子功能 0xE820。
- 2.如果支持,则通过循环调用子功能 0xE820 来获取所有可用的内存段信息。
- 3.当返回参数 eax 的值为 0 或者已经获取到了所有可用的内存段时,停止调用。
memory_check:
xor ebx, ebx ; 第一次调用前 需要初始化为0
mov di, BIOS_ARDS_