繁体   English   中英

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

[英]How to alloc a segment of memory using BIOS service?

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

INT 12小时

此中断告诉您计算机在地址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覆盖。

但是,这仅在OS使用int 12h检查RAM大小时才有效。 如果操作系统假定RAM大小固定为640 KB,或者使用了较新的int 15h RAM大小服务之一,则此操作将不起作用。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM