操作系统是管理硬件的大管家,所以它要知道有哪些硬件资源啊。比如要检测内存,知道内存的容量。
1.学习 Linux 中的获取内存的方法
学习 Linux 中的获取内存的方法,调用 BIOS 中断 0x15 来实现内存容量的检测。
0x15 中断一共有 3 个子功能:
- EAX=0xe820 ;遍历主机上全部内存
- AX=0xe801 ;分别检测低 15MB 和 16MB~4GB 的内存,最大支持 4GB。
- AH=0x88 ;最多检测 64MB 内存,实际内存超过64MB 也按64MB返回。
这三个功能是由强到弱的,首先使用第一个功能,如果不出错,就结束,否则就使用第二个功能。如果第二个功能也出错,使用第三个功能来检测。如果都出错则机器挂起,停止运行。
BIOS 中断是实模式下的方法,所以要在进入保护模式之前检测内存。
2. BIOS 中断 0x15 的 0xe820 子功能
功能最强大的一个,能过获取内存布局。
调用前往寄存器里输入一些值,调用后就会在寄存器中返回一些值,来代表内存布局的一些信息。
使用步骤:
1.填好“调用前输入”中列出的寄存器
2.执行中断调用 int 0x15
3.在 CF 位为 0 的情况下,“返回后输出”中对应的寄存器会有对应的结果
每次调用返回一个 ARDS(地址范围描述符),所以使用这个子功能要多次调用int 0x15 中断来获取所有的内存部分的信息。
因为内存不只是DRAM,还有ROM、设备内存等。
3. BIOS 中断 0x15 的 0xe801 子功能
第二种方法,0xe801 子功能。
使用步骤:
1.将 AX 寄存器写入0xe801
2.执行中断调用 int 0x15
3.在 CF 位为 0 的情况下,“返回后输出”