Как программируются графические интерфейсы низкого уровня?
Недавно я экспериментировал с такими вещами, как 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.