[英]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: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覆蓋。
但是,這僅在OS使用int 12h
檢查RAM大小時才有效。 如果操作系統假定RAM大小固定為640 KB,或者使用了較新的int 15h
RAM大小服務之一,則此操作將不起作用。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.