Привет всем!
Столкнулся с проблемой, которую не получается разрешить с помощью google, прошу помощи сообщества.
Вводные данные:
имеется в наличии 3 физических компьютера и один виртуальный (QEMU)
имеется желание потрогать VESA через VBE за мягкие места, она с радостью дает себя потрогать, но только в 3 случаях из 4, а именно:
1. Ноутбук ASUS Eee PC 1003HAG с интегрированной видеокартой Intel на борту (ДАЕТ)
2. Ноутбук ASUS X453S с интегрированной видеокартой Intel на борту (ДАЕТ)
3. Эмулятор QEMU, работает на PC Intel(R) Core(TM) i5-4670 CPU @ 3.40GHz (Haswell если что) с интегрированной видеокартой Intel на борту (ДАЕТ)
4. Собственно PC Intel(R) Core(TM) i5-4670 CPU @ 3.40GHz с интегрированной видеокартой Intel на борту (НЕ ДАЕТ)
Как именно не дает: "MACHINE CHECK ERROR" и уходит в ребут
Почему не дает:
Код:
mov dword [0x8000], 'VBE2'
mov di, 0x8000 ; адрес буффера под структуру 'VbeInfoBlock'
mov ax, 0x4F00 ; Return VBE Controller Information
int 0x10
; пока все ОК, если здесь будет cli + hlt, проблем нет, а вот дальше
mov edi, dword [0x8000+14] ; [VbeInfoBlock.VideoModePtr]
; Вот как раз здесь и не дает:
mov cx, word [edi] ; а можно потрогать за номер видеорежима
or cx, 0x4000 ; always try to use linear buffer
mov di, 0x9000 ; Pointer to ModeInfoBlock structure
mov ax, 0x4F01 ; Return VBE Mode Information
int 0x10
Так почему же все таки не дает:
Все дело в том, что в первых 3-х случаях адрес [VbeInfoBlock.VideoModePtr] помещается в WORD, что то типа 0x8040, а в последнем случае имеется 0xC000903D, т.е. в районе 3GB,
ну так нет проблем милая, переходим в Unreal Mode и пытаемся потрогать в нем, опять не дает, так может Unreal Mode не работает, пробуем код:
Код:
mov eax, 0x0000F008 ; обрезанный адрес 0x9DFFF008
mov eax, [eax]
call printx
mov eax, 0x9DFFF008 ; НЕ обрезанный адрес 0x9DFFF008
mov eax, [eax]
call printx
получаем разные значения:
Код:
0x00000000
0x9DFFFC08
т.е. Unreal Mode таки работает, а что же не так, почему за 0x9DFFF008 потрогать можно, а за 0xC000903D нельзя, они же рядом.
А вот почему:
Код:
$ dmesg
Среди всего прочего видим, что потрогать я хочу именно там, где надо:
Код:
Reserving Intel graphics memory at 0x000000009f200000-0x00000000c11fffff
т.е. адресок 0xC000903D аккурат расположен там, где надо, но потрогать его можно только после свадьбы,
но вот есть другой адресок 0x9DFFF008, а что же это за адресок:
Код:
BIOS-e820: [mem 0x000000009dfff000-0x000000009dffffff] usable
Я понимаю, что диапазон адресов 0x000000009f200000-0x00000000c11fffff зарезервирован под 'Intel graphics memory', не вижу препятствий, однако
есть подозрение, что это не просто адреса, а мапнутые порты и как раз попытка прочитать из порта как из обычной памяти и вызывает "MACHINE CHECK ERROR"
Собственно что делать то, как получить список номеров видеорежимов, ежели он расположен в адресе, доступ к которому запрещен?