Всем доброго дня!
Среди 4 ГБ адресной памяти я хочу получить те адреса, которые являются оперативной памятью (ОЗУ). На основании полученных сведений я смогу построить таблицу страниц (по 4 МБ на страницу), где у меня будет задействована именно оперативная память (ОЗУ).
Для достижения своих целей решил я использовать функция
0xE820 прерывания
0x15 (
http://ru.osdev.wikia.com/wiki/%D0%9E%D0%BF%D1%80%D0%B5%D0%B4%D0%B5%D0%BB%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BE%D0%B1%D1%8A%D1%91%D0%BC%D0%B0_%D0%BF%D0%B0%D0%BC%D1%8F%D1%82%D0%B8). Это
BIOS прерывание и естественно получать информацию я буду из режима реальных адресов (
R-Mode).
Написал модуль для определения объёма и карты распределения памяти:
Код:
; Имя: test_memory
; Описание: Определение карты памяти
; Автор: Дубровкин Сергей
; Начало: 26.10.2010 - 13:19
; Завершение: ??.??.???? - ??:??
; *******************************************************************************
use16
; *******************************************************************************
; П Р О Ц Е Д У Р Ы
; *******************************************************************************
; ------------------------------------------------------------------------------{
; Название: Test_Memory__Main()
; Описание: Определение карты памяти
; Вход: Нет
; Выход: Нет
; -------------------------------------------------------------------------------
Test_Memory__Main:
mov EAX,0x0000E820
xor EBX,EBX
mov EDI,test_memory__item
mov ECX,24
mov EDX,"SMAP"
int 0x15
cmp EAX,"SMAP"
jnz Test_Memory__Main_Label_1
push EDI
mov EAX,[EDI]
call UnsignedNumberToString
mov ESI,EDI
mov BL,00001111b
mov DH,0
mov DL,0
call Boot__DrawText
pop EDI
add EDI,4
push EDI
mov EAX,[EDI]
call UnsignedNumberToString
mov ESI,EDI
mov BL,00001111b
mov DH,1
mov DL,0
call Boot__DrawText
pop EDI
add EDI,4
push EDI
mov EAX,[EDI]
call UnsignedNumberToString
mov ESI,EDI
mov BL,00001111b
mov DH,2
mov DL,0
call Boot__DrawText
pop EDI
add EDI,4
push EDI
mov EAX,[EDI]
call UnsignedNumberToString
mov ESI,EDI
mov BL,00001111b
mov DH,3
mov DL,0
call Boot__DrawText
pop EDI
add EDI,4
push EDI
mov EAX,[EDI]
call UnsignedNumberToString
mov ESI,EDI
mov BL,00001111b
mov DH,4
mov DL,0
call Boot__DrawText
pop EDI
add EDI,4
mov EAX,[EDI]
call UnsignedNumberToString
mov ESI,EDI
mov BL,00001111b
mov DH,5
mov DL,0
call Boot__DrawText
jmp Test_Memory__Main_Label_End
Test_Memory__Main_Label_1:
mov ESI,test_memory__end
mov BL,00001111b
mov DH,0
mov DL,0
call Boot__DrawText
Test_Memory__Main_Label_End:
ret
; ------------------------------------------------------------------------------}
; *******************************************************************************
; Д А Н Н Ы Е
; *******************************************************************************
test_memory__Data16:
test_memory__itemSize db 24
test_memory__item db 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
test_memory__end db "Function no complete!",0
После вызова данной процедуры, у меня значение двадцати четырёх байт, на начало которых указывает переменная
test_memory__item, так и остаётся нулевым. И регистр
EAX не содержит сигнатуру
SMAP.
О чём это может говорить: либо я что-то не так делаю, либо
BIOS моего
Bochs не совместим с
ACPI?
Как же мне тогда узнать адреса в адресной памяти в 4 ГБ, где у меня располагается оперативная память (ОЗУ)?