DragonFlyBSD и графическая консоль

Автор: Алексей Федорчук
30 мая 2005 г

Консольная графика, то есть вывод произвольных попиксельных изображений (в том числе и шрифтов) средствами системы, без привлечения оконной системы X или специализированных библиотек (типа SVGAlib), до сего дня был слабым местом BSD-систем. Особенно — в сравнении с Linux, где графическая консоль (через Frame Buffer) поддерживается ядром уже очень давно. В OpenBSD же и NetBSD, насколько мне известно, вообще нет аналогов этому. А во FreeBSD графическая консоль (т.н. pixel mode) была реализована не лучшим образом: с максимальным разрешением до 800×600, да и не на всех видеокартах картина получалась мало-мальски приличной.

А вопрос консольной графики нынче приобретает актуальность в связи с распространением LCD-мониторов. Ведь на них оптимальным образом будет выглядеть картинка (идет ли речь о воспроизводстве собственно графики или текстов со шрифтовым оформлением) лишь при разрешении, равном физическому разрешению матрицы. Которое даже для 14-15-дюймовых моделей составляет минимум 1024×768. Я уж не говорю о совершенно непроизводительном расходе мест на больших (от 17 дюймов) экранах, на которых чисто текстовая консоль со стандартной плотностью символов (80×25) выглядит весьма убого. Попытка же использовать нестандартные текстовые плотности символов (типа 80×43 и так далее) приводит к тому, что зрелище становится просто душераздирающим.

И вот — свершилось: в DragonFlyBSD заявлена поддержка графической консоли, причем с разрешениями вплоть до максимально разумных (и допустимых для видеокарты). Остается только прикрутить эту самую графическую консоль — по умолчанию она не задействована, — и наслаждаться.

Впрочем, прикрутить к DragonFlyBSD графическую консоль легко: для этого достаточно переконфигурировать ядро системы, внеся в файл конфигурации строки

options         VESA
options         SC_PIXEL_MODE

скомпилировать и инсталлировать его. После чего дело остается за малым — опробовать все доступные разрешения и настроить виртуальные консоли на наиболее комфортное из них.

Все описанное ниже основано на моих экспериментах, базой которых послужила Toshiba Satellite Pro A40 с 15-дюймовым LCD-дисплеем (физическое разрешение 1024×768). Роль видеоадаптера в ней исполняет интегрированная в чипсет AGP-карта от Intel — i852GM, без собственной видеопамяти (в качестве таковой может отъедаться до 64 Мбайт памяти системной — у меня под это дело отдано 16 Мбайт).

Как известно, за поведение консоли в DragonFlyBSD (как и во FreeBSD) отвечает консольный драйвер syscons, а управление ее параметрами осуществляется двумя программами — kbdcontrol, делающая все, что связано с клавиатурой, и vidcontrol, обеспечивающая характеристики экранного вывода. К последней мы и обратимся, поскольку именно вывод в данный момент нас и интересует.

Перво-наперво с помощью vidcontrol можно получить информацию о видеоподсистеме машины. Для этого она дается в следующей форме

$ vidcontrol -i adapter

В ответ выводит массу сведений об адресах памяти, размере видеобуфера и так далее. Что, впрочем, делу настройки видеорежима ни в малейшей степени не способствует.

Однако та же опция -i с другим значением позволяет ознакомиться и с поддерживаемыми видеорежимами:

$ vidcontrol -i mode

В ответ на это выводится (при умолчальном ядре GENERIC) достаточно длинный список доступных режимов с различной плотностью символов — от стандартной 80×25 и пониженной 40×25 до максимально возможной 80×60:

  mode#     flags   type    size       font      window      linear buffer
------------------------------------------------------------------------------
0 (0x000) 0x00000001 T 40x25           8x8   0xb8000 32k 32k 0x00000000 32k
1 (0x001) 0x00000001 T 40x25           8x8   0xb8000 32k 32k 0x00000000 32k
2 (0x002) 0x00000001 T 80x25           8x8   0xb8000 32k 32k 0x00000000 32k
...
24 (0x018) 0x00000001 T 80x25           8x16  0xb8000 32k 32k 0x00000000 32k
...
30 (0x01e) 0x00000001 T 80x50           8x8   0xb8000 32k 32k 0x00000000 32k
32 (0x020) 0x00000001 T 80x30           8x16  0xb8000 32k 32k 0x00000000 32k
34 (0x022) 0x00000001 T 80x60           8x8   0xb8000 32k 32k 0x00000000 32k

В этом списке под номером 24 мы видим тот самый стандартный режим, обеспечивающий плотность символов 80×25 и предназначенный для использования со шрифтами с матрицей 8×16.

После перекомпиляции ядра с описанными выше опциями список видеорежимов расширился почти вдвое. В нем появились графические разрешения от 640×480 до (!) 1920×1440 при глубине цвета от 8 до 32 бит — прямо как в Иксах:-). Осталось определить, как же можно подключить эту красоту.

Выручила, как всегда, тетя Маня — man (1) vidcontrol. Правда, с описанным в качестве основного способом — через опцию -g (-geomerty) ничего не получилось — она категорически отказывалась переключать экран в какие-либо графические режимы, только в нестандартные текстовые (да и то не во все из списка).

Однако внимательное чтение показало другой способ — через опцию MODE_#режима. И какова же была моя радость, когда после команды

$ vidcontrol MODE_277

я получил режим с разрешением 800×600 при 32-битном цвете.

Дальнейшие эксперименты показали, что рабочими являются все режимы в диапазоне разрешений от 640×480 до 1024×768 при любой глубине цвета. Более высокие режимы имели для меня чисто теоретическое значение. Попытка выставить разрешение больше физически возможного для матрицы, естественно, потерпела фиаско: терминал просто разваливался. Однако и полученного было достаточно. Тем более, что при моей близорукости комфортно выглядел только режим 800×600. Хотя для людей с хорошим зрением 1024×768 будет, вероятно, самое то.

Правда, для достижения идеального эффекта потребовалась подборка шрифтов. Использовавшийся мной до этого шрифт ter-k16b.fnt из пакета terminus-fonts выглядел в графическом режиме… не то что бы плохо, но, скажем так, не идеально. Однако решение было рядом: в том же пакете имелся шрифт ter-k16f.fnt, специально предназначенный для консоли в режиме Frame Buffer. С его установкой была достигнута совершенно невероятная четкость символов — не превзойденная даже в графической консоли Linux. Приведенные скриншоты, полученные специально предназначенной для того утилитой scr2png (рис. 1-2) дают лишь бледное впечатление о реальности (в которой, как известно, все не так, как на самом деле).

Рис. 1. Воспроизведение латинского текста в графической консоли

Рис. 2. Воспроизведение русского текста в графической консоли

К слову сказать: я использую шрифты в кодировке KOI8-R. И из рис. 3 можно видеть, что даже программы, использующие псевдографику, выглядят при этом вполне пристойно.

Рис. 3. Воспроизведение в графической консоли программы (Midnight Commander), использующей псевдографику

Оставалось увековечить полученный результат ныне и присно. Для этого в файл /etc/rc.conf вписывается строка

allscreens_flags="MODE_277"

И теперь после перезагрузки графический режим активизируется на всех виртуальных консолях.

В заключение замечу, что возможность работать в консоли с разрешениями выше 800×600 нынче обратно портирована и во FreeBSD. Правда, не в официальных ветках, а с помощью дополнительных патчей (и включена уже в бета-версию 6-й ветки).