Переворот графической страницы VESA в защищенном режиме

Пытаюсь понять, как листать страницу в 32-битном защищенном режиме. Я запускаю 0x4F0A и сохраняю таблицу вывода в 0x00008100. Могу ли я быть прав, если команда для установки местоположения LFB должна находиться в 0x00008102? Зная, что это место для этой команды, как мне изменить местоположение LFB в c, не возвращаясь в реальный режим?

void main() {
    char vmem_back_buffer0[3932160];
    char vmem_back_buffer1[3932160];
    char* prot_mode_desc  = (char*)0x00008102;

    /* ... code to file those buffers with data is removed for brevity ... */

    // Here I change the LFB location to vmem_back_buffer0
    // Here I change the LFB location to vmem_back_buffer1

    while (TRUE);
}

person Cal W    schedule 15.09.2020    source источник
comment
Почему эти буферы в локальной памяти вместо, как я ожидал, указателей на фактическое место в видеопамяти?   -  person tadman    schedule 15.09.2020
comment
@tadman, как мне поместить данные непосредственно в видеопамять, а не в локальную память? LFB также доступен через обычную память, так почему это должно быть по-другому? Я не очень разбираюсь в графике VESA / SVGA, поэтому приветствую любую помощь.   -  person Cal W    schedule 15.09.2020
comment
Если вы работаете в защищенном режиме, у вас есть свобода управления любым адресом памяти, поэтому вы можете установить указатель непосредственно на видеопамять и управлять им. Расположение и структура данных различаются в зависимости от того, какой видеорежим вы используете, поэтому найдите хороший справочник по желаемому режиму и обратите очень пристальное внимание на то, что от вас ожидают.   -  person tadman    schedule 15.09.2020
comment
Я предполагаю, что вы имеете в виду 32-битный защищенный режим в DOS, что означает, что вам также нужно больше узнать о DOS API.   -  person tadman    schedule 15.09.2020
comment
О, мой предыдущий код действительно делал это, получая адрес от функции 4F02, но только с одним буфером он работает медленно, поэтому мне нужно иметь возможность переключать буфер. Отредактируйте ваш другой комментарий: Нет, это не DOS. Пишу собственное ядро.   -  person Cal W    schedule 15.09.2020
comment
Без дополнительных подробностей я даже не уверен, в чем проблема. Попробуйте работать с примерами, в которых есть особенности.   -  person tadman    schedule 15.09.2020
comment
По сути, я пытаюсь сделать эту возможность, чтобы указать адрес в памяти, где хранится буфер, используемый для рендеринга. Если вы перерисовываете всю сцену в каждом кадре (что часто бывает при рендеринге видео или 3D), вам просто нужно поменять местами два указателя. Но я не могу найти примеров, как это сделать в защищенном режиме.   -  person Cal W    schedule 15.09.2020
comment
Вы не первый, кто применяет двойную буферизацию в графике DOS. Посмотрите ссылку, которую я предоставил, и поищите больше. Это старый метод, но он не совсем документирован.   -  person tadman    schedule 15.09.2020
comment
@tadman: OP пытается мгновенно переключиться с одного буфера кадра в ОЗУ видеокарты на другой буфер кадра в ОЗУ видеокарты; который обычно используется (как переворачивание страницы при вертикальной синхронизации), чтобы полностью избежать разрывов. Двойная буферизация (с буфером в обычной оперативной памяти) отличается (и проще - не требует аппаратной поддержки).   -  person Brendan    schedule 15.09.2020


Ответы (1)


Пытаюсь понять, как листать страницу в 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