2013-06-08 2 views
2

Я использую Bochs в Linux. Он работает нормально, но есть проблема, с которой мне не удалось справиться. Я получаю vga-info (доступные режимы, адрес линейного фреймбуфера (LFB)), а затем переключается на 1024 * 768 * 24 в реальном режиме. В соответствии с режимом vga-info 118h (1024 * 768 * 24) поддерживается, а LFB - от E000: 0000 (т.е. E0000 из-за сегмента: смещение или 0xE0000000 в плоской адресации, но эта память не существует, поскольку она почти 3.5GB). Позже я переключаюсь в защищенный режим (PM) и записываю данные в E0000, но не отображаются пиксели. Не делайте этого, если я пишу в 0xE0000000. Однако они делают, если я пишу в A0000, но отображается только память A0000-C0000 (128 Кбит). Я бы хотел использовать PM из-за 32 бит и LFB (без пейджинга). Я знаю, что видеокамера с более низкими разрешениями (например, 320 * 200 * 256) сопоставляется с A0000. В Bochs-config vbe включен (vga: extension = vbe). bochsout.txt говорит: «Расширение дисплея VBE Bochs включено».Bochs with graphics

Вопросы: Почему видеозапись от A0000, а не от E0000? Почему существует только 128-килограммовая видеокамера? (Это должно быть: 1024 * 768 * 3 байта, то есть 2,25 Мб)

Таким образом, графика не может быть выполнена в PM без пейджинга или я делаю что-то неправильно.

Спасибо заранее, грабят

Я нашел кое-что на http://wiki.osdev.org/Bochs_Graphics_Adaptor:

«Использование линейного буфера кадра (LFB)

При использовании линейного буфера кадра, BGA выставляет все из графической памяти в линейном режиме.В старых версиях Bochs и QEMU местоположение фиксировано на 0xE0000000 (VBE_DISPI_LFB_PHYSICAL_ADDRESS). Однако, когда Bochs настроен для эмуляции видеокарты PCI, а не ISA, адрес фреймбуфера больше не фиксированный, но может быть прочитан с первого PCI BAR устройства 0x1234: 0x1111 Чтобы включить LFB, используйте флаг VBE_DISPI_LFB_ENABLED (0x40) при включении расширений VBE (так что напишите значение VBE_DISPI_ENABLED | VBE_DISPI_LFB_ENABLED (0x41)).

QEMU не обращает внимания на флаг VBE_DISPI_LFB_ENABLED. Будут доступны как буфер линейного кадра, так и банк памяти. Бочс обращает внимание на флаг. В режиме LFB он игнорирует запросы об изменении банка, и ничего не происходит, когда вы пишете в банковскую память. В банковском режиме ничего не происходит, когда вы пишете в память LFB. "

Я не понимаю этого 0xE0000000, потому что Bochs поддерживает максимальную 1 ГБ памяти, и это намного больше. Кстати, включение vbe путем компиляции Bochs с --enable-vbe лишено," vga: extension = vbe "should . можно использовать вместо этого в Bochs-конфиге

РЕШЕНИЕ найдено (установлено бит "использовать LFB" во время установки режима VBE):

мов топора, 4F02h; режим VBE набора

мы Ого , 118h; режим 1024 * 768 * 24

или bx, 0100000000000000b; Набор бит четырнадцатый (использование LFB)

INT 10h

И LFB от 0xE0000000 в УПУ-modeinfo-блок сказал.

ответ

0

Есть разные видеорежимы, имеющие разные адреса видеопамяти, попробуйте использовать int 0x10 для изменения видеорежима в реальном режиме.