如何使用BIOS服务分配内存段?

时间:2019-06-14 11:55:44

标签: assembly x86-16 bios

我正在尝试使用INT 12h BIOS服务分配可用的内存段,但是我不能。如何使用INT 12h分配空闲内存段?

1 个答案:

答案 0 :(得分:3)

  

INT 12h

此中断告诉您在地址0A0000h下计算机有多少内存。

该中断将返回AX中的千字节数。这意味着您将AX的值乘以0x400来获得内存的字节数。或者您将其乘以0x40来获得段数。

示例:如果中断返回AX=0x1E0,则RAM在地址0x7800:00x7000: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大小服务之一,则此操作将无效。