我正在尝试使用INT 12h BIOS服务分配可用的内存段,但是我不能。如何使用INT 12h分配空闲内存段?
答案 0 :(得分:3)
INT 12h
此中断告诉您在地址0A0000h
下计算机有多少内存。
该中断将返回AX
中的千字节数。这意味着您将AX
的值乘以0x400
来获得内存的字节数。或者您将其乘以0x40
来获得段数。
示例:如果中断返回AX=0x1E0
,则RAM在地址0x7800:0
或0x7000:0x8000
处结束(两个分段的地址都表示线性地址0x78000
)。
我想为我的引导程序找到可用的内存段...
BIOS不执行内存管理。操作系统(例如MS-DOS)可以做到这一点!
当引导加载程序在内存中时,尚未加载任何操作系统。
这意味着您必须自己进行内存管理:计算机的整个RAM由引导加载程序“拥有”!
最简单的方法是在引导加载程序中使用固定地址。由于整个RAM由引导加载程序“拥有”,因此您可以确定某种数据始终存储在地址0x2000:0中。您不必进行某种分配。
如果您实际上需要动态内存分配,则必须编写一个函数,该函数通过存储有关内存的哪一部分尚未“分配”的信息来分配内存。
特别是如果您需要释放内存的功能,这将非常棘手!
...,对于MS-DOS应用程序,在其他情况下。
在这种情况下,内存管理由MS-DOS而不是BIOS执行。
您必须调用MS-DOS函数(而不是BIOS函数)来执行内存管理。
...使用INT 12h BIOS服务分配可用的内存段...
顺便说一句:
引导加载程序可以修改int 12h
以在ax
寄存器中返回较小的值。这样做可以将数据存储在RAM中(例如,用于修改的BIOS中断服务程序),而不会被OS覆盖。
但是,这仅在操作系统使用int 12h
检查RAM大小时才有效。如果操作系统假定RAM大小固定为640 KB,或者使用更新的int 15h
RAM大小服务之一,则此操作将无效。