Таблицы ACPI
Необходимо из ПМ прочитать таблицы ACPI.
Жду советов и предложений.
Заранее благодарен.
А на этот вопрос есть только один ответ - RTFM.
Я спросил не потому, что мануал не читал, а потому, что не понял.
Я спросил не потому, что мануал не читал, а потому, что не понял.
Если бы вы читали то указали бы на то, что не поняли, с цитатами, разделами, пунктами, параграфами и тд и тп. А так, делаем вывод, что не читали ибо в мануале все написано, а кто то просто не хочет приложить усилия, и подавай ему все на блюдечке с золотой каемочкой да в разжеванном виде.
Итого: Возвращайтесь после прочтения, енотег.
Очень прошу поделиться кодом.
А вообще:
mov al,8Fh
out 70h,al
in al,71h
mov eax,cr0
or al,1
mov cr0,eax ; вошли в PM
and al,0FEh
mov cr0,eax ; вернулись в RM
mov al,0Fh
out 70h,al
in al,71h
sti
hlt
jmp $-1
Поэтому будь точнее в озвучивании "тех. задания".
Меня больше интересует подготовка дескрипторов и разбиение сегментов(конкретно интересует сегмент стека) для этого....
Чем проще будет написано, тем лучше...
Чтоб мне чётко понять сегменты и конструирование дескрипторов для обоих режимов.
Заранее благодарен.
Чтоб мне чётко понять сегменты и конструирование дескрипторов для обоих режимов.
Заранее благодарен.
Нужный вам код (вход в защищённый режим и выход из него) имеется в книге "Основы языка ассемблера", К. Г. Финогенов.
Сказал же, ищи по форуму. Делал это неоднократно. Сейчас возврат в RM не использую, поэтому подходящих исходников нет.
Ну, Ё! Возьми руководство Intel и посмотри. А вообще описание дескрипторов в сети не найдет только ленивый.
http://forum.codenet.ru/showthread.php?t=36150
http://forum.codenet.ru/showthread.php?t=42032&page=8
Все шаги для перехода в PM и для возврата в RM опять-таки можно найти в руководстве Intel. Учти, что для полной инициализации нужно также настроить регистры IDTR и TR. В LDTR можно загрузить NULL, т.к. LDT сейчас практически не используется.
Я не могу разобраться, как сформировать стек для РМ.
тут обсуждалось
Сразу скажу, что растущие вниз сегменты для стеков сейчас практически не используются. Если тебя все-таки интересует, как правильно определить именно такой сегмент для стека, то могу рассказать. Если нет, то остается либо FLAT-модель (об этом я уже рассказывал), либо сегментная. В последнем случае просто определяешь сегмент данных, помещаешь его селектор в ss, устанавливаешь esp на его вершину. Это все.
:eek:
Почему?
Таблица RSDT содержит адреса таблиц, а в поле длина указано количество этих таблиц. Я его читаю и там написано 003h.
Вопрос 1: Они считали с 0, т.е. таблиц - 4 или с 1(3 таблицы)?
Вопрос 2: Может кто знает, какие из таблиц - основные(Преподаватель сказал, что я 4 должен распечатать)?
5.2.7 Root System Description Table (RSDT)
...
Length, in bytes, of the entire RSDT. The length implies the number of Entry fields (n) at the end of the table.
PS: Осознайте наконец необходимость чтения мануала ибо писан он именно для этого.
Просто препод мне сказал, что их 4!!! основных должно быть.
В RSDT(поле длина) записано, что их 3..., а если просто подряд поля входов, то их вообще 5, но это, скорее всего, связано с тем, что не все таблицы есть в RSDT, а некоторые так просто "валяются"...
Но что-то мне подсказывает, что основные должны быть в RSDT.
В этом и вопрос. Если их там 3(т.е. он считаются с 1), то может ли RSDT считаться вместе с ними, а если их 4, то действительно ли они - основные...
Мне просто нужно узнать сигнатуры основных 4-х таблиц ACPI....
Какие из таблицы 5-5!!! и 5-6!!! основные в мануале не написано.
Так же там есть раздел:
Что значит 003h? Тебе же привели выдержку из руководства, в которой четко написано, что длина задается в байтах, включая заголовок. Т.е. если поле Length=40, то таблица одна, 44 - две, 48 - три и т.п. Задание насчет основных таблиц сформулировано весьма мутно, поэтому почему бы тебе упрепода не уточнить, что именно он имел в виду. Есть такое понятие как обязательные (т.е. всегда присутствующие) таблицы, но основные - ???
Спросить у него не могу, т.к. в универ. нес сейчас не пускают.
Возможно, я не совсем корректно сформулировал.
Обязательные таблицы.
Если у тебя поле Length=3, то ищи ошибку, потому что для корректной RSDT этого в принципе быть не может, т.к. только заголовок занимает 36 байт.
01FF0000 52 53 44 54 2C 00 00 00 01 01 42 4F 43 48 53 20 RSDT,.....BOCHS
01FF0010 42 58 50 43 52 53 44 54 01 00 00 00 42 58 50 43 BXPCRSDT....BXPC
01FF0020 01 00 00 00 2C 00 FF 01 38 09 FF 01 46 41 43 50 ....,.я.8.я.FACP
Вариантов два: либо в боксе таблицы ACPI реализованы неправильно, что мало вероятно, либо я прав. Как видно, RSDT имеет размер 2Сh=44 байт (что указано в поле Length). И действительно после 44 байт уже начинается другая таблица - FACP.
shr ecx,4
Я считал поле длины в есх.
Как там расположены данные? Просто, может, что у меня там 30h записано...
Но в любом случае, я опирался на описание из спецификации, т.е. я согласен, что могу быть неправым, но там же написано, что это число входов....
Length, in bytes, of the entire RSDT.
!The length implies the number of Entry fields (n) at the end of the table.!
И всё же, какие из таблиц являются обязательными? Я просто их выведу...
А потом как ты считаешь кол-во входов! Правильно так:
shr ecx,2
!The length implies the number of Entry fields (n) at the end of the table.! - вот это пояснение
Вот код. Если правильный, то я запутался и он выдает неадекватное число, если - нет, то как правильно?
mov ecx,1FFFFFh
mov ebx,000E0000h
RSDP_Scan:
cmp DWORD PTR ds:[ebx],' DSR'
jnz RSDP_Next
cmp DWORD PTR ds:[ebx+4],' RTP'
jz RSDP_Found
RSDP_Next:
inc ebx
cmp ebx,000FFFFFh
jnz RSDP_Scan
jmp RSD_NFound
RSDP_Found:
mov eax,DWORD PTR ds:[ebx+16]
mov ebx,eax
mov di,510
cmp DWORD PTR ds:[ebx],'TDSR'
jnz RSD_NFound
mov di,510
mov ax,0b800h
push ax
pop es
mov ecx,DWORD PTR ds:[ebx+4]
shr ecx,4
sub ecx,36
shr ecx,2
add esi,36
RSDT_Read:
mov edx,DWORD PTR ds:[ebx+esi]
mov ah,1Bh
mov al,BYTE PTR ds:[edx]
mov es:[di],ax
add di,2
mov al,BYTE PTR ds:[edx+1]
mov es:[di],ax
add di,2
mov al,BYTE PTR ds:[edx+2]
mov es:[di],ax
add di,2
mov al,BYTE PTR ds:[edx+3]
mov es:[di],ax
add di,2
mov al,'|'
mov es:[di],ax
add di,2
mov al,' '
mov es:[di],ax
add di,2
add esi,4
loop RSDT_Read
st1:
jmp st1
[COLOR="Red"]shr ecx,4[/COLOR]
sub ecx,36
shr ecx,2
add esi,36
RSDT_Read:
Нафег нужно, скажем дружно?
читать как
В коде присутствует как минимум еще одна неточность. RSDP нужно искать не только в диапазоне 0xE0000-0xFFFFF, но еще и в первом килобайте EBDA, причем RSDP должен начинаться на границе параграфа (16 байт), поэтому будет значительно эффективнее использовать шаг в 16 байт, а не как у тебя. Впрочем, лучше см. руководство.
Но вопрос остаётся в силе...
Какие таблицы - обязательные?
В общем, всем большое спасибо.
Код следующий:
Код: