Пытаюсь понять, как листать страницу в 32-битном защищенном режиме. Я запускаю 0x4F0A и сохраняю таблицу вывода по адресу 0x00008100. Могу ли я быть прав, если команда для установки местоположения LFB должна быть расположена по адресу 0x00008102?
16-битное значение в 0x00008102 может содержать смещение (в сегменте кода VBE) функции Set / Get Display Start. Если это так, вам нужно будет настроить различные дескрипторы в вашем GDT (например, 32-битный сегмент кода для VBE, сегмент данных для VBE) и использовать 32-битный дальний вызов для загрузки CS с 32-битным сегментом кода для VBE. одновременно загружая EIP со значением (от нуля до 32 бит) по адресу 0x00008102 после того, как вы загрузили DS и / или ES с любым необходимым VBE.
Тем не мение; для VBE 3.0 (последняя версия и наиболее вероятная версия VBE для компьютеров, которым не исполнилось 20 лет) эта функция является необязательной и может не существовать. Вместо; VBE 3.0 добавил интерфейс защищенного режима VBE 3.0 (который представляет собой 16-битный код для защищенного режима, позволяющий видеопЗУ перезаписывать существующий код и меньше беспокоиться о нехватке места в крошечном ПЗУ объемом 64 КиБ).
Конечно, для очень старых видеокарт (до VBE 2.0) интерфейс защищенного режима VBE 3.0 никогда не будет существовать.
Это означает, что для поддержки всех VBE вы должны использовать либо реальный режим, либо режим virtual8086, либо интерпретатор для VBE 1.2 и старше; и может использовать один и тот же реальный режим, режим virtual8086 или интерпретатор как для VBE 2.0, так и для VBE 3.0 (чтобы избежать лишних хлопот, связанных с интерфейсом защищенного режима VBE 2.0 и интерфейсом защищенного режима VBE 3.0).
Есть и другие проблемы; в основном, VBE не предоставляет никаких IRQ для вертикальной синхронизации, если вы используете параметр set display start on vertical sync (в функции VBE Set / Get Display Start), он будет тратить огромное количество времени процессора на опрос, чтобы определить, если / когда вертикальный синхронизация началась, и если вы этого не сделаете, вы закончите с разрывом (а предотвращение разрывов - это весь смысл выполнения перелистывания страниц). Это можно исправить, используя таймер для эмуляции IRQ при вертикальной синхронизации (в частности, вызовите Set / Get Display Start по истечении таймера, а затем используйте время, необходимое Set / Get Display Start, чтобы вернуться, чтобы настроить, когда истечет таймер. next, чтобы вы знали, что таймер истечет незадолго до того, как произойдет вертикальная синхронизация).
Еще одна вещь, о которой нужно беспокоиться, - это ошибки в коде VBE. В общем, часто используемый код (например, для установки режима видео) более тщательно протестирован и с меньшей вероятностью будет содержать ошибки, а редко используемый код (например, для установки запуска дисплея) с большей вероятностью будет иметь ошибки (и выйдет из строя, и все испортит) . Я не уверен, но я думаю, что можно снизить некоторые риски, изолировав код VBE (выполняемый через интерфейс защищенного режима VBE) внутри песочницы CPL = 3 (например, процесса).
Конечно, для современных компьютеров (с UEFI) VBE вообще не существует; а UEFI не предоставляет альтернативного способа перелистывания страниц. Это означает, что (если вы используете VBE и перелистывание страниц) будет сложно перенести ОС на оборудование, которое будет актуально позже.
По всем этим причинам; лучше использовать загрузчик, настраивающий буфер кадра с использованием любой прошивки, а ядро / ОС использует только буфер кадра и ничего больше (до тех пор, пока он не запустит собственный видеодрайвер / ы); и избегайте огромного объема работы для чего-то, что (в лучшем случае) не может хорошо работать.
Зная, что это местоположение этой команды, как мне изменить местоположение LFB в c, не возвращаясь в реальный режим?
Большинство компиляторов C не поддерживают сегментацию; Это означает, что вам придется использовать заглушку на ассемблере для загрузки сегментов VBE (включая дальний вызов, который загружает сегмент кода VBE) и впоследствии восстановить ваши обычные сегменты.
Вам также нужно будет беспокоиться о том, что произойдет, если IRQ произойдет во время выполнения кода VBE. Вы действительно не хотите отключать IRQ (потому что нет гарантии, что функция VBE будет быстрой, и нет гарантии, что отключение IRQ во время работы кода VBE не приведет к нарушению задержки IRQ для всех драйверов вашего устройства, особенно для большого количества ненужных Процессорное время при ожидании случая вертикальной синхронизации); поэтому все обработчики прерываний захотят иметь возможность обрабатывать прерывание кода VBE.
Помимо этого; вы можете думать о начале отображения как о смещении в LFB, где будет первый пиксель, отправленный на монитор (обратите внимание, что начало отображения также может использоваться для плавной прокрутки - например, перемещение отображения запускает одну строку пикселей только для вертикальной прокрутки одного пикселя в время). Вам также понадобятся некоторые меры предосторожности (например, отказ от переворачивания страниц, если LFB недостаточно велик для 2 кадров, на основе поля TotalMemory (в блоках по 64 КиБ) структуры, возвращаемой информацией о контроллере возврата VBE, и вертикальной разрешение и bytesPerLine, взятые из структуры, возвращаемой функцией получения информации о режиме VBE).
person
Brendan
schedule
15.09.2020