手写操作系统 - 5.内存检测

86 阅读1分钟

B站视频链接 -【206.内存检测】

内存检测

为了得知操作系统可用的内存空间有多少,在内核进入保护模式之前需要进行内存检测。

GCC内嵌汇编语法

/* volatile : 可选,禁止编译器对汇编代码进行优化 */
__asm__ __volatile__( 
  /* 汇编指令间使用'\n'分隔 */
  "汇编指令"
  :"=限制符"(输出参数)
  :"限制符"(输入参数)
  :保留列表
)

INT中断检测内存

数据结构

Address Range Descriptor Structure,ARDS

字节偏移量名称含义
0-3BaseAddrLow起始地址的低32位
4-7BaseAddrHigh起始地址的高32位
8-11LengthLow内存长度的低32位(字节)
12-15LengthHigh内存长度的高32位(字节)
16Type本段内存的类型
1:可用
2:不可用
中断调用
MOV EAX, 0xE820
INT 0x15

调用方法

  • EDX存放签名0x534d4150
  • EBX: 如果是第一次调用或内存区域扫描完毕,则为 0;如果不是,则存放上次调用之后的计数值
  • ECX: 保存地址范围描述符的内存大小,应该大于等于 20 字节
  • ES:DI: 指向保存地址范围描述符结构的缓冲区,BIOS 把信息写入这个结构的起始地址

返回值

  • CF为1时,表示内存区域扫描完毕
  • EAX0x534d4150时,表示调用成功
  • EBX为0时,表示扫描结束
  • ECX返回BIOS往ES:DI处写的地址范围描述符的字节大小