【发布时间】:2020-02-18 10:58:06
【问题描述】:
我使用指令 0x15, ax = 0xe801 来获取内核加载程序中的总内存并将其移动到稍后从内核中的内存单元中读取。但结果并不像你需要的那样。 引导代码
xor cx,cx
xor dx,dx
mov ax,0xe801
int 0x15
mov ax,cx
mov bx,dx
mov [0x00000600],ax
mov [0x00000620],bx
结果 - 00@4
【问题讨论】:
我使用指令 0x15, ax = 0xe801 来获取内核加载程序中的总内存并将其移动到稍后从内核中的内存单元中读取。但结果并不像你需要的那样。 引导代码
xor cx,cx
xor dx,dx
mov ax,0xe801
int 0x15
mov ax,cx
mov bx,dx
mov [0x00000600],ax
mov [0x00000620],bx
结果 - 00@4
【问题讨论】:
如何获取内存大小?
哪个“内存大小”?
如果您想获得安装的 RAM 总量,那么您可能需要使用“系统管理 BIOS”表;但这个数字(包括“固件窃取的 RAM”和“集成显卡窃取的 RAM”之类的内容)几乎没有实际用途。
如果您想要操作系统可以使用的 RAM 区域列表;那么这实际上是一个列表,而不是一个数字。要获得列表,您将使用“int 0x15, eax=0xE820”,一旦获得列表(并希望对其进行清理),您可以将“可用 RAM”区域的大小相加(并忽略报告为“保留”的区域, "ACPI non-volatile", ... ) 来获取操作系统可以使用的 RAM 总量。
注意:对于古代计算机,还有许多其他函数(“int 0x12”、“int 0x15, ax=0xE881”、“int 0x15, ax=0xE801”、“int 0x15, ah=0xC7”、“int 0x15、 ah=0x8A", "int 0x15, ax=0xDA88", "int 0x15, ah=0x88") 加上其他一些方法(CMOS 位置,探测);不同的计算机支持某些(而不是全部)选项。幸运的是,所有这些在 1990 年代初都已被弃用,现在没有必要关心这些(因为 25 岁以上的计算机在 15 年前大多停止使用)。
【讨论】: