簡體   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