Издательский дом ООО "Гейм Лэнд"СПЕЦВЫПУСК ЖУРНАЛА ХАКЕР #46, СЕНТЯБРЬ 2004 г.

Тюнинг в стиле X. Часть 2

Alexander S. Salieff

Спецвыпуск Xakep, номер #046, стр. 046-018-3


Надеюсь, теперь твоя звуковуха заработала как нужно.

FrameBuffer - графика без X11

Понятие графического интерфейса в Linux люди неразрывно связывают с наличием X-сервера. Это неверно. Во многих случаях не требуется или нет возможности использовать сложную и ресурсоемкую реализацию клиент-серверной системы X11. Иногда необходим просто эффективный низкоуровневый доступ к интерфейсу вывода изображения через видеокарту. В таких случаях на помощь приходит FrameBuffer.

FrameBuffer - это ядерный интерфейс доступа к кадровому буферу, доступен в ядрах старше 2.4.5. Практически это - девайс, предоставляющий доступ к пиксельному массиву, отображенному на экране в данный момент. Представлен он обычно файлом /dev/fb0 и аналогичными. В первую очередь, нужна поддержка framebuffer в ядре, при этом должна быть включена поддержка экспериментального кода в ядре:

Code maturity level options --> Prompt for development and/or incomplete code/drivers

Теперь можно включить и сам framebuffer:

Console drivers --> Frame-buffer support

Дальше выбираем железо: либо в списке framebuffer-драйверов есть наша карточка (rivafb, tdfxfb и т.д.), либо останавливаемся на VESA 2.0 (vesafb), которая поддерживается сейчас всеми видеокартами. Есть два пути - собрать framebuffer-драйвер в виде ядерного модуля (что породит некоторые трудности, особенно если хочется, чтобы framebuffer был доступен уже во время загрузки ядра) или вкомпилить его прямо в ядро, что, на мой взгляд, намного удобнее.

В случае если драйвер вкомпилен в ядро, на этапе загрузки им управляют с помощью аргументов ядра. Это либо аргумент "vga=xxx" (с vesafb), либо "video=<driver> :<xres> x<yres> [-<bpp> ][@refresh]" (когда драйвер поддерживает modedb), либо собственный формат аргументов, описанный в документации к экзотическому драйверу. С modedb все интуитивно понятно, трудно не догадаться, что аргумент "video=tdfxfb:1024x768-16@85" означает включение framebuffer через драйвер 3DFX, в разрешении 1024x768, 16-битном цвете и с частотой 85 Гц. С VESA немного сложнее - тут используется таблица режимов, которую я и привожу.

На пересечении битности цвета и разрешения находится интересующий тебя режим. Таким образом, аргумент "vga=791" будет означать режим 1024x768 в 16-битном цвете. Во многих случаях данную таблицу приводят с шестнадцатеричными значениями режимов - не ведись на это! Как показывает практика, драйвер vesafb не понимает шестнадцатеричных значений режимов, и их придется перевести в десятичное значение перед использованием. Vesafb поддерживает только одну частоту - 60 Гц. Как это поправить (если твоя карта поддерживает VESA 3.0), мы обсудим ниже.

Если драйвер собран в виде LKM (Loadable Kernel Module), то запускать и управлять им на этапе загрузки ядра достаточно проблематично. Для этого нужно создавать InitRD (Initial RAM Disk), помещать туда необходимые LKM'ы, конфигурировать их использование и делать прочие вещи, рассмотрение которых вряд ли уместилось бы в этой статье. Именно по этим причинам я и рекомендовал вкомпилять framebufer-драйвер в ядро.

Назад на стр. 046-018-2  Содержание  Вперед на стр. 046-018-4