Что такое vesa драйвер

Обновлено: 07.07.2024

Статья даёт описание установки и настройки видеокарт nVidia в Linux. Описание осуществляется на примере операционной системы debian (squeeze). Для получения дополнительной информации по данной теме смотри Установка видеокарт в linux.

Обзор режимов работы видеокарт nVidia

Видеокарты nVidia в linux могут работать в текстовом и графическом режимах. Для запуска видеокарты в текстовом режиме (в режиме консоли) не требуется дополнительных действий. Для использования графического режима требуется установка/настройка X-сервера и подключение/указание "графических" драйверов. Могут быть использованы драйвера как включённые в дистрибутив (debian), так и драйвера поставляемые изготовителем видеокарт. В графическом режиме видеокарты nVidia поддерживают как 2D так и 3D ускорение графики.

Поддержка работы видеокарты в графическом режиме осуществляется пакетом Xorg. Подключение установленных драйверов и настройка видеокарты осуществляется в файле конфигурации Xorg - /etc/X11/xorg.conf. Если драйвер видеокарты в файле конфигурации не указан или самого файла нет вовсе, операционная система (например debian squeeze) самостоятельно определит и установит совместимый драйвер.

Для установки графических режимов видеокарт nVidia могут быть использованы

  • драйвера из пакета Xorg - vesa, nv, nouveau
  • драйвер nvidia из дистрибутива поставки debian
  • или драйвер nvidia предоставленный изготовителем

Драйвер vesa

Видеокарты nVidia поддерживают работу в графическом режиме vesa. Описание настройки X-сервера и /etc/X11/xorg.conf в режиме vesa приведено в статье Xorg. Для получения дополнительной информации по данной теме смотри Установка видеокарт в linux.

Драйвер nv

Драйвер nv осуществляет поддержку 2D/3D ускорения.

Для подключения драйвера

  • устанавливаем драйвер xorg-nv
  • добавляем в файл конфигурации X-сервера/etc/X11/xorg.conf секцию
  • перезапускаем X-сервер

Драйвер nouveau

Драйвер nouveau осуществляет полноценную поддержку 2D/3D ускорения. Драйвер требует ядра linux 2.6.32 или выше. В отличие от проприетарного драйвера nvidia nouveau корректно (то есть стандартным образом) поддерживает возможности X-системы Например поддержку через xrandr несколько мониторов.

Для подключения драйвера

  • удаляем (если были установлены) все драйвера nvidia-glx
  • устанавливаем драйвер xorg-nouveau
  • добавляем в файл конфигурации X-сервера/etc/X11/xorg.conf секцию
  • (возможно необязательно?) проверяем модуль и добавляем загрузку драйвера nouveau при старте
  • перезапускаем X-сервер

Драйвер nvidia

Драйвер nvidia осуществляет полноценную поддержку 2D/3D ускорения.

Получить и установить драйвер можно тремя способами:

  • установка закрытых драйверов изготовителя
  • установка готовых (бинарных) OpenSource пакетов с драйверами
  • сборка драйверов под свою машину из исходников

Установка проприетарных драйверов

Для установки драйвера

Установка свободных бинарных драйверов

(незавершенный раздел)
Дистрибутив Debian распространяет через свои хранилища и бинарные драйвера для видеокарт nVidia. При смене ядра (upgrade системы) 3D драйвера следует перекомпилировать. Проще всего это сделать путем переустановки используемых пакетов.

Для установки свободных бинарных драйверов

  • получаем права суперпользователя
  • устанавливаем необходимые пакеты
  • перезапускаем рабочую станцию
  • проводим тестирование ускорения 3D

Компиляция драйверов из исходников

(незавершенный раздел)
Компиляция драйверов из исходников включённых в дистрибутив Debian позволяет собрать драйвера для видеокарт nVidia в том случае если бинарные пакеты не заработали.

Для компиляции драйверов из исходников

  • устанавливаем сборщик модулей как описано в статье Module-assistant
  • компилируем и устанавливаем модуль
  • добавляем в файл конфигурации X-сервера/etc/X11/xorg.conf секцию
  • перезапускаем рабочую станцию
  • проводим тестирование ускорения 3D

Настройка отдельных видеокарт

В таблице приведены ссылки на статьи в википедии с описание настройки отдельных видеокарт nVidia

Всех ПК-геймеров планеты Земля, да и консольных игроков тоже, объединяет одна проблема — вертикальные разрывы изображения. И вроде бы есть куча технологий которые решают эту проблему:

  • V-Sync,
  • G-Sync,
  • FreeSync
  • А ведь еще есть Adaptive Sync
  • А в HDMI 2.1 недавно добавили VRR.

Давайте сегодня раз и навсегда разберемся в технологиях адаптивной синхронизации изображения.

Для тех кто не в курсе. А в чём собственно проблема?

Чтобы изображение появилось на экране, должно произойти, как минимум, две вещи:

  1. графический процессор должен подготовить кадр и передать его на монитор,
  2. ваш монитор должен показать этот кадр.

Обычные мониторы работают на частоте 60 Гц, то есть способны выводить 60 кадров в секунду, а игровые на 144 Гц и выше.

А вот графический процессор живет в совершенно ином мире. В играх постоянно всё меняется: колышется листва, журчит ручеёк, враги выпрыгивают из-за угла. Каждый кадр отличается по своей сложности, поэтому на их просчет уходит разное количество времени.

Иными словами, у монитора частота кадров постоянная, а у видеокарты переменная.

Вот и выходит, что за один цикл обновления монитора видеокарта может подготовить больше одного кадра или меньше.

Из-за этого мало того что страдает плавность картинки, так еще и появляются артефакты в виде вертикальных разрывов изображения. Кстати, при просмотре фильмов тоже могут появляться такие артефакты, потому что кино снимают в 24 к/с.

V-Sync

Очевидно проблема требовала решения, и еще на заре компьютерных игр оно появилось! Название у этого решения — вертикальная синхронизация или V-Sync. Наверняка вы встречали такую опцию как в настройках видеокарты, так и в играх.

Работает эта штука достаточно топорно. Фактически она просто принуждает видеокарту выводить кадры с частотой кратной частоте обновления экрана. Например, если у вас монитор 60 Гц, то максимальное количество кадров в секунду тоже будет 60, даже если ваша видеокарта способна на большее. И в общем-то часто такое ограничение вполне уместно, если у видеокарты хватает мощи и нет просадок ниже 60 к/с, но если они есть — начинаются проблемы.

При включенной вертикальной синхронизации, следующее кратное значение — это 30 к/с. Поэтому даже если ваш фреймрейт просел фактически всего на пару кадров, вы всё равно увидите падение до 30 к/с. Такой перепад мало того, что большой и очень визуально ощутимый, так ещё и будет происходить с небольшим лагом. Поэтому если стабильного FPS в 60 к/с или 30 не достичь, то включать V-Sync вообще нет никакого смысла.

Справедливости ради, чем выше герцовка монитора, тем больше мы имеем кратных значений, на которых может работать синхронизация. Поэтому на игровых мониторах V-Sync работает куда лучше.


Но история с кратными значениями — не самая главная проблема технологии. Есть другой неочевидный недостаток: вертикальная синхронизация — увеличивает задержку ввода, то есть создаёт Input Lag.

Игра медленнее реагирует на ваши действия, всё происходит с задержками и как-то плывёт в молоке, поэтому прицелиться становится гораздо сложнее. Почему так происходит?

Это интересно, смотрите! Каждый кадр рассчитывается и выводится на экран через один и тот же конвейер. Упростим его до трёх этапов.

  1. Каждое ваше действие, например щелчок мышки надо как-то интерпретировать и обновить состояние игры. За это отвечает центральный процессор (синяя полоса на картинке ниже). Центральный процессор подготавливает кадры для графического процессора и помещает их в очередь рендеринга графического процессора.
  2. Затем графический процессор (зелёная полоса) берет эти подготовленные кадры из очереди и рендерит их.
  3. Только потом эти кадры выводятся на дисплей (серая полосочка на картинке).

Ну и в чём проблема, спросите вы? Дело в том, что ЦП не берется за подготовку следующего кадра, пока предыдущий не будет выведен на экран. Поэтому ограничивая количество выводимых кадров в угоду синхронизации с дисплеем, мы фактически увеличиваем задержки с которыми обновляется состояние игры! И если в каких-то простеньких играх типа пасьянса такие вещи допустимы, то в соревновательных играх вертикальная синхронизация может стать серьёзной помехой.

G-Sync

Но переживать не стоит, так как решение появилось еще в 2013 году. Именно тогда компания NVIDIA представила свою технологию адаптивной синхронизации — G-Sync. В отличие от старой технологии, G-Sync позволяет подстраивать не видеокарту под частоту обновления монитора, а наоборот заставляет монитор менять свою частоту под видеокарту!

Представляете? Так тоже можно было!

В результате мы получаем потрясающе плавную картинку без вертикальных разрывов и задержки ввода! Просто сказка! G-Sync также работает в огромном диапазоне частот. Изначально это было от 30 до 144 Гц, а сейчас уже есть поддержка до 360 Гц и может даже выше, тут скорее всё зависит от монитора.

А если фреймрейт падает ниже 60 Гц G-Sync умеет дублировать пропущенные кадры.


Получаются сплошные плюсы и проблема решена еще в 2013 году? Так почему же мы до сих пор об этом говорим?

Ну как сказать. Во-первых, эта технология закрытая, соответственно, G-Sync работает только с карточками NVIDIA, но это пол беды.


Все волшебные функции G-Sync стали возможны благодаря специальному чипу, который необходимо встроить в монитор. Естественно, эти чипы производит тоже NVIDIA и стоят они недешево. Поэтому мониторы с поддержкой G-sync в среднем стоят на 250-300$ дороже и таких моделей очень мало. То есть получилась классная, и для 2013 года революционная технология, но не универсальная и дорогая.

VESA Adaptive Sync


Поэтому уже спустя год, в 2014, Ассоциация стандартизации Video Electronics Standards Association или VESA представила открытую технологию Adaptive Sync, которая умеет, в принципе, всё то же самое, что и G-Sync, но без дорогостоящих чипов и работает на частотах от 9 до 240 Гц! Неплохо да?


Но для внедрения технологии нужно, чтобы её поддержку внедрили в прошивку и драйвер монитора, драйвер видеокарты, операционной системы и в игры!

А также необходимо наличие DisplayPort версии не ниже 1.2a, так как технология стала частью именно Display Port. Как видите, чтобы технология взлетела, нужно было проделать много работы. И этой работой занималась компания AMD.

AMD FreeSync

В 2015 году AMD внедрили Adaptive Sync в драйвера своих видеокарт и назвали технологию FreeSync. Реализация от AMD быстро получила очень широкое распространение. Добавить поддержку FreeSync в монитор оказалось настолько дешево, что сейчас сложнее найти игровой монитор без этой фичи, чем с ней.

Но AMD не остановились на просто внедрении стандарта от VESA. Также они добавили поддержку HDMI, начиная с версии 1.4. А в 2017 выпустили FreeSync 2, в который добавилась поддержка HDR и компенсацию низкой частоты кадров, как в G-SYNC.


Кстати, чуть позже, FreeSync 2 переименовали в более элитное FreeSync Premium Pro, а обычный FreeSync для мониторов с частотой 120 Гц и выше стали называть FreeSync Premium. Хотя такие маркетинговые финты я не одобряю, но в остальном сплошной респект AMD за популяризацию стандарта.

Кстати, NVIDIA также в 2017 году добавила поддержку HDR и назвала это всё G-Sync Ultimate.


И вроде бы всё классно, в команде у красных и у зеленых есть по своей шикарной технологии. Но что делать, если у тебя видеокарта от NVIDIA, ты хочешь нормальную поддержку G-Sync, но покупать дорогущий монитор с этой технологией совсем не хочется? Или наоборот — не покупать же Radeon только потому что у тебя монитор с FreeSync?

До недавнего времени выбора не было никакого. Хочешь подешевле и побольше выбор мониторов - покупай Radeon. В другом случае, придется раскошелиться.

G-Sync Compatible

Но в 2019 году NVIDIA пошли навстречу покупателям и добавили поддержку стандарта VESA Adaptive Sync в драйвера для своих видеокарт серии RTX, а также для карточки GTX 1080. А значит теперь можно легко насладиться лучшим из двух миров: взять себе карточку от NVIDIA и монитор с FreeSync по вкусу. Вот только есть проблема. Если на FreeSync мониторе не написано G-Sync Compatible — значит он не был протестирован NVIDIA на совместимость и никаких гарантий, что всё будет работать нормально, вам никто не даёт. А NVIDIA тестирует далеко не все, и далеко не самые доступные модели.


Поэтому инициативу по тестированию в свои руки взяло интернет-сообщество. Они составили табличку с огромным списком протестированных пользователями мониторов.

С мониторами, кажется, разобрались. Но как быть, если хочется поиграть на большом экране телевизора через консоль или ПК. Будет ли работать адаптивная синхронизация? Спешу вас порадовать — будет! При условии что ваш ТВ оснащен портом HDMI версии 2.1, в который добавили технологию переменной частоты обновления VRR - Variable Refresh Rate.

Причём всё будет работать и с видеокартами от NVIDIA и с Radeon. Всё потому, что VRR — это та же самая технология VESA Adaptive Sync, но теперь она стала ещё и частью стандарта HDMI 2.1. Именно таким образом адаптивная синхронизация реализована в консолях нового поколения. А также, вы удивитесь, в Xbox One S и One X. Да, в коробки текущего поколения от Microsoft VRR завезли даже раньше, чем HDMI 2.1.

Итоги


Что, в итоге спустя 6 лет после своего появления, технология Adaptive Sync стала фактически отраслевым стандартом. Захватив видеокарты от AMD и NVIDIA, телевизоры и даже интегрированная графика от Intel в 11-м поколении процессоров теперь поддерживает эту технологию. А это значит, что в светлом будущем мы будем жить без единого разрыва, по крайней мере, вертикального!


В этой части попробуем сделать “невозможное”: научимся использовать графический дисплей без операционной системы. На самом деле это задача не из легких, особенно в случае работы в 32-х битном защищенном режиме, и особенно если хочется использовать приличное разрешение экрана а не 320x200x8. Но все по порядку: раз хотим графику – значит нужно работать с видеокартой.


Современные графические карты – это практически полноценные компьютеры по мощности не уступающие основному: тут и декодирование MPEG2 в качестве 1080p, поддержка 3D графики и шейдеров, технологии вроде CUDA, и многое другое. Это все выглядит весьма сложно. С другой стороны видеокарты – это всего лишь очередной PCI девайс, такой же, как и остальные. Это устройство мы даже “нашли” в предыдущей статье с номером класса устройства 0x03 (class_name=graphics adapter). Как и с любым, устройством с видеокартой можно работать при помощи портов ввода-вывода или MMIO областей памяти, а сама видеокарта может использовать DMA и прерывания для взаимодействия с основным процессором. Если посмотреть на диапазон портов ввода-вывода, доступных у видео карт, то мы увидим, что всего ей выделяется менее 50-ти байт – не так уж и много с учетом огромной функциональности, которой обладают современные видеокарты.


По стандарту VGA для работы с видеокартой будут использоваться именно два диапазона портов ввода вывода: 0x03B0-0x03BB и 0x3C0-0x3DF. Помимо этих диапазонов есть еще диапазон видеопамяти (0xA0000-0xBFFFF), отображаемой в основную память.

Видеопамять — это представление графического экрана в виде обычной памяти. Получается, что бы нарисовать пиксель или символ на экране, нужно записать байты в этот диапазон памяти.
Поскольку есть стандарт, которому соответствуют современные видеокарты, ожидается, что при помощи стандарта можно будет использовать видео карту, не вдаваясь в детали ее реализации.


К сожалению, есть одно но: VGA — стандарт старый и рассчитан на использование простых графических дисплеев с малым, по современным меркам, разрешением экрана. В стандарте определено пару десятков различных графических и текстовых режимов (посмотреть все можно тут), среди которых самыми “крутыми” являются: 320x200 на 256 цветов и 640x480 на 16 цветов. При этом в стандарт входят только функции переключения режимов и функции для работы с палитрой. А где же нормальные разрешения экранов: 1920x1080 24 бита, ну или хотя бы 800x600 24 бита? Где поддержка MPEG2 графики? Где 3D графика? В стандарте VGA этого нет. Про графические режимы еще можно сказать, что они входят в стандарт SVGA работа с которым, осуществляется через расширения BIOS VBE, про которые речь пойдет дальше. А 3D, MPEG2, CUDA и другие модные фишки поддерживаются каждым производителем видеокарт по-своему. Предельное разрешение экрана в 640x480 в стандарте VGA, помимо рассчета на старые дисплеи, обусловлено размером видеопамяти: всего 128 килобайт (для работы с большим разрешением требуется гораздо больше места: 1920x1080 24бит – это более 6Mb). Значит нужно, чтобы была еще область видеопамяти большого размера, и у современных видео карт такая область есть:


Один из приведенных выше диапазонов используется как Linear Frame Buffer (LFB) – тоже видеопамять. Второй диапазон адресов используется для отображения сотен регистров и битовых полей, которые используются для настройки видеокарты. Причем набор регистров и способы работы с ними уникальны не только у каждого производителя видео карт — они могут значительно отличаться как между сериями, так и даже моделями одного производителя, и все это нужно, чтобы обеспечить работу CUDA, MPEG2, 3D,… Исходники всех графических драйверов в ОС Linux занимают более 8 мегабайт:

А вот пример драйвера видеокарты для одного из производителей:


Остальные содержат еще больше кода И это еще без дополнительных библиотек в Linux, которые используются в драйверах.

Значит, чтобы обеспечить поддержку 3D или потокового видео, нужно очень много поработать. Как говориться: если у вас есть еще одна жизнь, чтобы потратить ее, то …

Впрочем, в этой статье мы сосредоточимся на том, чтобы просто включить приличный графический режим и нарисовать в нем что-нибудь красивое: например, фрактал. Посмотрим насколько это просто.

Полную спецификацию можно найти здесь. Мы же кратко опишем то, с чем предстоит работать.

Все режимы, поддерживаемые видео картой нумеруются по порядку от 0x000 до 0x1FF. Не все номера заняты и не все номера после 0x100 имеют в стандарте точное значение разрешения экрана: таким образом, по требуемому разрешению экрана номер еще нужно будет найти. Номера режимов до 0x100 определены стандартом VGA и полностью совпадают с ним. LFB – Linear Frame Buffer, это область видеопамяти, рассчитанная на большие разрешения экрана (обычно она располагается за пределами оперативной памяти, но до 4GB).

Без LFB для работы со всеми графическими режимами используется стандартная область видеопамяти с 0xA0000 по 0xC0000. В этом случае будет использоваться режим “банков”. Весь экран разбивается на нумерованные части (банки) и в каждый момент времени область видеопамяти указывает на одну из таких частей. То есть, прежде чем рисовать пиксель на экране, нужно будет установить номер банка, затем нарисовать пиксель, обращаясь к видеопамяти. Таким образом одна и та же область памяти может использоваться повторно для работы с различными областями на дисплее.


Использовать LFB проще и быстрее, поскольку ничего переключать не нужно, и весь дисплей отображается в LFB целиком. Видеопамять в LFB организована линейным образом: счет пикселей начинается построчно с верхнего левого угла экрана. Каждый пиксель представлен одним, двумя, тремя или четырьмя байтами в зависимости от битности текущего графического режима. Байты расположены подряд и в них закодирован цвет пикселя. Самые простые и приличные режимы это 32-х и 24-х битные (трех и четырех байтные). В этих режимах каждый канал цвета (Red, Green, Blue) представлены 1-м байтом. В 32-х битном режиме еще один байт зарезервирован и не используется (можно сказать, что он используется для выравнивания). Еще одна особенность с LFB: по стандарту, чтобы включить LFB в номере режима нужно установить еще один бит: mode_number | 0x4000.


Таким образом, используя функцию номер 2 (в приведенном выше списке), можно будет найти номер режима с LFB и включить его при помощи функции номер 3. Затем можно будет рисовать на экране просто записывая байтики со значениями RGB по нужному смещению в буфере LFB.
Пока все выглядит многообещающе, но, VBE это расширение BIOS и оно представляет собой 16-ти битный код для Real-Mode обрабатывающий определенную функцию BIOS (в нашем случае 10h). Получается, что надо использовать VBE (16 бит Real Mode) из привычного 32- бита Protected Mode, который мы получили в предыдущей статье. Существует три способа, как это сделать:
1. Переключиться в Real Mode, выполнить нужные действия, вернуться обратно в Protected Mode. Нужно писать функции перехода между режимами, сохранять состояние процессора, да и в общем случае нужно еще прерывания корректно обрабатывать.
2. Использовать расширение VBE через 16-ти битный интерфейс из Protected Mode. Для этого нужно настраивать таблицы дескрипторов, создавать call Gate, компилировать 16-ти битный код и настраивать еще одну дополнительную структуру по стандарту VBE. Тоже не очень удобно, к тому же не все видео карты такое расширение поддерживают.
3. Использовать эмулятор 16-бит Real Mode, который работает в Protected Mode. Единственное ограничение этого эмулятора в том, что трудно будет писать обработчики прерываний для самой видео карты, но нам это и не нужно, ибо все функции VBE прерывания видео карты не используют.

Третий способ выглядит самым простым, поскольку можно взять готовый эмулятор x86emu (простой и хорошо переносимый) и использовать его для вызова функций VBE.
Поработать, конечно, придётся, но мы сможем за относительно небольшое количество действий собрать программу, которая на любой современной видеокарте сможет, без операционной системы, включить графический режим и нарисовать фрактал. Пока без шейдеров и 3D но, зато графика.

! ВАЖНО!: Все дальнейшие действия могут успешно осуществляться только после успешного прохождения всех 6-ти шагов из первой части статьи “Как запустить программу без операционной системы”

1. Добавить несколько функций в common, которые нам понадобятся для x86emu и рисования фракталов.
2. Портировать x86emu.
3. Написать несколько функций для работы с VBE.
4. Написать функцию рисования фрактала.
5. Все объединить и запустить.

Шаг 1. Дополняем common стандартными функциями.

Сперва нужно добавить несколько функций работы с 64-х битными числами. Они понадобятся gcc для компиляции x86emu.

1. Добавляем следующие файлы в папку common: udivdi3.c, umoddi3.c, moddi3.c, qdivrem.c, divdi3.c. Их можно взять здесь.


3. Теперь, качаем библиотеку newlib.Она понадобится еще для одной функции. Из исходников библиотеки нужно скопировать файл newlib-2.0.0\newlib\libm\math\s_floor.c в папку common. В нем заменяем строку:

4. Еще нужно добавить функции setjmp/longjmp. Эмулятор x86emu использует эти функции для обработки ошибок. Реализация этих функция приводится ниже, он была создана на основе реализации из newlib, но немного упрощена. Функция позволяет сохранить состояние процессора, а затем его восстановить. По сути похоже на ручную реализацию C++ исключений. Для того, чтобы эти функции появились в нашем коде, надо создать файл setjmp.s в common со следующим содержанием (немного простого ассемблера):


Ассемблерный код просто сохраняет регистры в определнном порядке, а затем их восстанавливает.
5. Теперь функции нужно объявить для языка C. Для этого создаем файл setjmp.h в include со следующим содержанием:


6. Еще один важный набор функций, который потребуется, это функции работы со строками и памятью (memset, strlen итд.). Эти функции готовыми можно взять из bitvisor, поэтому нужно скачать исходники этого гипервизора. Из этих исходников скопируем файл core\string.s в common. В нем заменим строку:

7. Далее нужно скопировать из bitvisor еще файл include\core\string.h в include. В нем заменить строку:

8. Последнее, что понадобиться – это функции работы с портами ввода-вывода. Для этого добавляем файл io.h в каталог include, который без изменений можно взять из того же проекта bitvisor (в исходниках проекта он расположен в include\io.h).
9. Чтобы все скопилировалось, заменяем содержимое include\types.h на следующие:

Эти изменения необходимы для определения ряда типов и макросов, которые нужны в используемых сторонних исходниках. Как видно по коду, все определения тривиальны.

Шаг 2. Портирование x86emu

Теперь, нужно внести несколько изменений в эти исходники:
1. В файле x86emu\x86emu.c заменить строки:

2. В файле x86emu\x86emu.h заменить строки:


3. В файле x86emu\x86emu_util.c заменить строки:


4. Далее необходимо в файл x86emu\x86emu_util.c добавить несколько функций перед функцией x86emu_init_default:

Эти функции представляют собой обертки над функциями обращения к портамм ввода-вывода.

5. В самой же функции x86emu_init_default добавить следующие определения:

Поскольку видеокарта – это устройство и VBE будет работать с ней через порты ввода-вывода при помощи ранее определенных функций, то эмулятору нужно сообщить о их наличии.

Шаг 3. Добавление функций для работы с BIOS.

Теперь можно использовать функции BIOS VBE через x86emu. Осталось сделать несколько функций которые непосредственно выполняют запрос к BIOS. Для этого создаем файл bios.c в папке common со следующим содержанием:

И в папке include файл bios.h со следующим содержанием:


Таким образом мы определили функцию для инициализации работы с bios (VBE_BiosInit), которую нужно будет вызвать в начале работы и функцию вызова функции bios (VBE_BiosInterrupt). Название последней следует из того, что именно через инструкцию int (interrupt) происходит вызов функций BIOS в Real-Mode. При помощи этой функции можно вызывать функции VBE в соответствие со стандартом. Для вызова прерывания необходимо заполнить структуру с состоянием процессора и вызвать эмулятор. Эмлуятор начнет декодировать и эмулировать код из таблицы IVT и собственно кода BIOS. Инструкция за инструкцией эмулятор выполнит весь необходимый код обработчика int 10h. В процессе работы эмулятор будет вызывать функции работы с портами ввода-вывода, которые мы указали ранее, на шаге 2.

Шаг 4. Добавление функций для работы с VBE.


Теперь создадим файл vbe.c в папке common со следующим содержанием:


Рассмотрим подробнее функции, объявленые в этом файле:
• VBE_GetGeneralInfo. Эта функция проверяет наличие VBE у видео карты. Она использует функцию BIOS и проверяет возвращаемые значения в соответствие со спецификацией.
• VBE_GetModeInfo. Эта функция спрашивает у видео карты информацию о режиме по номеру. Возвращает информацию об этом режиме в виде структуры. Параметры передаваемые VBE_BiosInterrupt обусловлены спецификацией VBE.
• VBE_SetMode. Эта функция просто включает нужный режим по номеру. Параметры передаваемые VBE_BiosInterrupt обусловлены спецификацией VBE.
• VBE_Setup. Самая важная функция: она перебирает все режимы и ищет тот, который удовлетворяет указанному в параметрах разрешению экрана. Так же функция ищет режим только 24-х и 32-х битные и с поддержкой LFB. В результате поисков она заполняет три глобальных переменные:
o vbe_lfb_addr – адрес LFB. В него можно срезу писать данные для рисования на экране.
o vbe_selected_mode – номер выбранного режима, чтобы его можно было включить.
o vbe_bytes – количество байтов на пиксель (3 или 4).

Все готово для рисования.

Шаг 5. Добавление функции рисования фрактала.

Приступаем к самому интересному: рисуем фрактал. Будем рисовать фрактал на множестве Жюлиа. За основу для рисования фрактала был взят код из этой замечательной статьи. Для рисования фрактала, можно просто создать файл fractal.c в корневой директории с исходниками, со следующим содержанием:

Разберем этот код чуть подробнее. Во-первых, этот код содержит необходимые определения:

Во-вторых, определена функция преобразования цвета HSVtoRGB. Она нужна, чтобы все выглядело красиво. Ее реализация была взята отсюда

Наконец, самая главная функция рисования фрактала DrawFractal. В ней нужно отметить несколько моментов:

1. Сперва в ней определены параметры экрана которые будут использоваться для режима и рисования:
int x = 0, y = 0, w= 800, h = 600;
Вы можете менять эти функции на свой вкус.

2. Затем настраивается VBE:


3. Потом включается найденный графический режим:


4. Далее рисуется фрактал. Для установки точки на экране используется простая запись числа в память, при этом вычислив правильное смещение:


Теперь, когда все готово, надо вызвать эту функцию из main, иначе мы не увидим результаты своих трудов. Вносим изменения в kernel.c:

Шаг 6. Доработка makefile и запуск

Остается доработать только makefile, чтобы все скомпилировалось. Для этого внесем следующие изменения:
1. Обновим OBJFILES:

2. Добавим еще одну директорию include, для этого внесем изменение в строку:

3. Добавим цель для компиляции ассемблера:

4. Теперь можно пересобрать проект:


5. Запускаем проект, чтобы убедиться, что все работает:


Если все сделано правильно, то мы должны увидеть вот такую красоту:

Как и в предыдущих частях статьи, при помощи команды dd можно скопировать образ hdd.img на флешку и проверить работу программы на реальном компьютере.

В итоге получилась программа, которая демонстрирует возможности по использованию видео карт без операционной системы, при этом используя расширение VBE с привычными разрешениями экрана. Для включения графического режима пришлось портировать целый эмулятор инструкций, но оно того стоило, ведь иначе пришлось бы портировать какой-нибудь драйвер видео карты, а это заняло бы гораздо больше времени. Теперь на основе этой программы можно рисовать на экране все что угодно, даже создать собственную игру или построить оконную систему, но об этом в другой раз.

Ссылки на следующие статьи цикла:
"Как запустить программу без операционной системы: часть 4. Параллельные вычисления"
"Как запустить программу без операционной системы: часть 5. Обращение к BIOS из ОС"
"Как запустить программу без операционной системы: часть 6. Поддержка работы с дисками с файловой системой FAT"

Статья содержит общие элементы описания установки видеокарт в Linux.

Описание настройки отдельных типов видокарт приведено в статьях

  • Установка ATI в linux - статья об установке и настройке видеокарт ATI/RADEON
  • Установка nVidia в linux - статья об установке и настройке видеокарт nVidia
  • Установка видеокарт Intel в linux - статья об установке и настройке видеокарт Intel

(Как правило) Видеокарты могут работать в текстовом режиме, в графическом режиме с поддержкой 2D/3D ускорения, в том числе на уровне аппаратного ускорения.

Текстовый режим видеокарт

Для запуска операционной среды linux в текстовом режиме (режим командной строки) дополнительных действий не требуется.

Обзор графических режимов

Поддержка графических режимов в linux обеспечивается пакетом Xorg. Настройка видеокарты в xorg осуществляется в файле конфигурации X-сервера - /etc/X11/xorg.conf. В данном файле (в Section "Device") указываются драйвера видеокарты. (Как правило) C конкретной видеокартой могут быть совместимы различные драйвера обеспечивающие различный уровень аппаратного ускорения. Например универсальный драйвер vesa или специфичные video-ati для ati/radeon и nouveau для nVidia. Если драйвер видеокарты в файле конфигурации не указан или этот файл отсутствует вовсе, операционная система (например debian squeeze) самостоятельно определит и установит (наилучший) совместимый драйвер из доступных в системе.

Графический режим VESA

Драйвер vesa может быть использован, если видеокарта поддерживает стандарт VESA. (На текущий момент) Нам неизвестны видеокарты не поддерживающие данный стандарт. Последние версии драйвера vesa (например в debian squeeze с xorg версии 7.5) обеспечивают поддержку и 2D/3D ускорения.

Для подключения драйвера

  • устанавливаем пакет xserver-xorg-video-vesa содержащий драйвер xorg-vesa
  • добавляем в файл конфигурации X-сервера/etc/X11/xorg.conf секцию
  • перезапускаем X-сервер / менеджер дисплея

Поддержка аппаратного ускорения

Поддержка аппаратного ускорения, как правило, может быть обеспечена драйверами изготовителя. Часто это самая простая или единственная возможность. Но бывают случаи, когда изготовитель "забросил" поддержку определённой видеокарты или предлагает драйвера для "другой" операционной среды. В этом случаев ускорение может быть достигнуто с помощью драйверов включённых в поставку Xorg. Поэтому способы поддержки аппаратного ускорения для разных моделей видеокарт даже для одного изготовителя могут серьзёно различаться.

Установка и настройка видеокарт Intel в Linux это процесс установки видеокарт Intel в операционной среде Debian/GNU Linux.

Как правило видеокарты Intel это встроенные в материнскую плату графические адаптеры, поддерживающие работу как в текстовом так и в графическом режимах. Для запуска видеокарты в текстовом режиме (в режиме консоли) не требуется дополнительных действий. Для использования графического режима требуется установка/настройка X-сервера и активизация драйверов. В графическом режиме видеокарты Intel поддерживают как 2D так и 3D ускорение графики.

Поддержка работы видеокарты в графическом режиме осуществляется пакетом Xorg. Подключение установленных драйверов и настройка видеокарты осуществляется в файле конфигурации - /etc/X11/xorg.conf. Если драйвер видеокарты в файле конфигурации не указан или самого файла нет вовсе, операционная система (например от debian squeeze и выше) самостоятельно определит и установит совместимый драйвер.

Для включения графических режимов видеокарт Intel могут быть использованы драйвера vesa и intel.

Драйвер VESA

Видеокарты Intel поддерживают работу в графическом режиме vesa. Описание настройки X-сервера и файла конфигурации /etc/X11/xorg.conf в режиме vesa приведено в статьях Xorg и Установка видеокарт в linux.

Некоторые часто используемые команды

Драйвер INTEL

Специальный драйвер intel, включённые в поставку Xorg, обеспечивают поддержку графического ускорения видеокарт Intel.

Для установки драйвера intel на примере операционной системы debian squeeze

  • устанавливается драйвер intel
  • добавляется в файл конфигурации /etc/X11/xorg.conf секция
  • перезапускается X-сервер, а в случае изменения настроек KMS - перезапускается рабочая станция целиком
  • проверяется ускорение 3D с помощью пакета Mesa-utils

Настройка отдельных видеокарт

В таблице приведены ссылки на статьи в википедии с описание настройки отдельных видеокарт Intel

Читайте также: