Как программируются графические интерфейсы низкого уровня?

Недавно я экспериментировал с такими вещами, как arch Linux, и это подняло несколько вопросов. Я постоянно вижу использование графики в очень низкоуровневых частях ОС (такие как GRUB или почти все загрузочные меню). Некоторые из них даже показывают изображения. Я также вижу графические манипуляции в таких вещах, как команда "pacman", где полоса загрузки будет меняться без нарушения текста над ней. Другим примером может быть программа, подобная cfdisk. Я просто хотел бы знать, как запрограммированы эти типы функций?

Изменить: Под этим я подразумеваю, какие системные вызовы используются, чтобы сделать это возможным?

Меню загрузки

2 ответа

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

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

Например, в режимах цветного экрана (например, CGA, EGA) текст может быть визуализирован через определенную область памяти, где один байт определяет символ, а другой байт указывает цвет (передний план и фон в виде 4-битного каждого для EGA). Вы просто пишете значения там, и они отображаются на экране. Если бы вы изменили свою таблицу символов, то будут показаны измененные символы.

Я не могу поверить, я вспомнил это только сейчас, но адрес памяти A000 видимо сгорел в моем мозгу. Вы можете прочитать больше на https://en.wikipedia.org/wiki/Enhanced_Graphics_Adapter

Конечно, существуют более высокие режимы экрана, которые поддерживают запись реальных пикселей, и именно так мы привыкли писать игры. Известно, что режим VGA 320x200 был очень легким и быстрым, чтобы получить "реалистичную" и плавную анимированную графику с потрясающими 256 цветами, не беспокоясь о битовых плоскостях или о чем-либо.

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

Я довольно много узнал о том, как инициализировать и работать в низкоуровневых графических режимах прямого доступа к памяти из почтенного Fractint (оригинал работал на DOS). Все вкусности находятся в файле video.asm. В дополнение к EGA/VESA et. al., он также обрабатывал некоторые из доступных в то время видеокарт, например, Hercules.

Они выбрали X-сервер, чтобы перенести его на Linux как XFractint. Большая часть оригинального внешнего вида и духа приложения остается прежней. Вероятно, это хороший и безопасный способ начать.

Для более низкого уровня можно попробовать SVGAlib (я не пробовал это). Кажется, что большая часть низкоуровневой графики Linux от ядра использует VESA BIOS Extensions.

Другие вопросы по тегам