内存检测
为了得知操作系统可用的内存空间有多少,在内核进入保护模式之前需要进行内存检测。
GCC内嵌汇编语法
/* volatile : 可选,禁止编译器对汇编代码进行优化 */
__asm__ __volatile__(
/* 汇编指令间使用'\n'分隔 */
"汇编指令"
:"=限制符"(输出参数)
:"限制符"(输入参数)
:保留列表
)
INT中断检测内存
数据结构
Address Range Descriptor Structure,ARDS
| 字节偏移量 | 名称 | 含义 |
|---|---|---|
| 0-3 | BaseAddrLow | 起始地址的低32位 |
| 4-7 | BaseAddrHigh | 起始地址的高32位 |
| 8-11 | LengthLow | 内存长度的低32位(字节) |
| 12-15 | LengthHigh | 内存长度的高32位(字节) |
| 16 | Type | 本段内存的类型 1:可用 2:不可用 |
中断调用
MOV EAX, 0xE820
INT 0x15
调用方法
EDX存放签名0x534d4150EBX: 如果是第一次调用或内存区域扫描完毕,则为 0;如果不是,则存放上次调用之后的计数值ECX: 保存地址范围描述符的内存大小,应该大于等于 20 字节ES:DI: 指向保存地址范围描述符结构的缓冲区,BIOS 把信息写入这个结构的起始地址
返回值
CF为1时,表示内存区域扫描完毕EAX为0x534d4150时,表示调用成功EBX为0时,表示扫描结束ECX返回BIOS往ES:DI处写的地址范围描述符的字节大小