Консоль FreeBSD. Введение в клавишную тему

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

Так что одна из задач драйвера syscons -- обеспечить ввод символов, из
которых слагаются команды и тексты. Для этого он преобразует коды нажатия
клавиш (т.н. скан-коды), генерируемые контроллером клавиатуры (то есть
"железной составляющей") в коды символов таблицы ASCII. Преобразование это
происходит в два этапа -- сначала "железный" скан-код нажатия клавиши,
именуемый также "сырым" (вообще говоря, отпускание клавиши тоже генерирует
"сырой" скан-код, но для нас это почти несущественно) превращается во
внутренний код syscons. Как, зачем, почему -- опять же неважно, эта процедура запрятана в недра драйвера и влиять на нее мы не можем. Далее же внутренний код (также называемый скан-кодом) преобразуется в ASCII-код по специальной таблице, именуемой таблицей раскладки клавиатуры keymap).

Доступные для syscons раскладки клавиатуры собраны в каталоге
/usr/share/syscons/keymaps. Это -- простые текстовые файлы вида
страна.тип.kbd (строго говоря, не совсем страна, но об этом позже), которые можно просмотреть, например, командой less имя_файла. Что мы и проделаем на
примере стандартной американской клавиатуры us.iso.kbd -- именно она используется по умолчанию, если не загружена тем или иным способом какая-либо другая раскладка. К чести создателей FreeBSD нужно заметить, что это одна из немногих американских по происхождению систем, которая догадывается о существовании разных языков и алфавитов, кроме американского.

Итак, в ответ на

less /usr/share/syscons/keymaps/us.iso.kbd

на экран выводится примерно следующая картина:

# $FreeBSD: src/share/syscons/keymaps/us.iso.kbd,v 1.14.2.1 2000/07/18 00:47:53 ache
Exp $
#                                                         alt
# scan                       cntrl          alt    alt   cntrl lock
# code  base   shift  cntrl  shift  alt    shift  cntrl  shift state
# ------------------------------------------------------------------
  000   nop    nop    nop    nop    nop    nop    nop    nop     O
  001   esc    esc    esc    esc    esc    esc    debug  esc     O
  002   '1'    '!'    nop    nop    '1'    '!'    nop    nop     O
  003   '2'    '@'    nul    nul    '2'    '@'    nul    nul     O
  004   '3'    '#'    nop    nop    '3'    '#'    nop    nop     O
  ...
  020   't'    'T'    dc4    dc4    't'    'T'    dc4    dc4     C
  021   'y'    'Y'    em     em     'y'    'Y'    em     em      C
  022   'u'    'U'    nak    nak    'u'    'U'    nak    nak     C
  023   'i'    'I'    ht     ht     'i'    'I'    ht     ht      C
  024   'o'    'O'    si     si     'o'    'O'    si     si      C
  025   'p'    'P'    dle    dle    'p'    'P'    dle    dle     C
  ...
  104   slock  saver  slock  saver  susp   nop    susp   nop     O
  105   fkey62 fkey62 fkey62 fkey62 fkey62 fkey62 fkey62 fkey62  O
  106   fkey63 fkey63 fkey63 fkey63 fkey63 fkey63 fkey63 fkey63  O
  107   fkey64 fkey64 fkey64 fkey64 fkey64 fkey64 fkey64 fkey64  O
  108   nop    nop    nop    nop    nop    nop    nop    nop     O

Первая колонка этой таблицы -- номера скан-кодов (разумеется, внутренних, а
не "железных"), вторая -- соответствующее этому коду базовое значение. Таковым
могут быть:

  • символ (цифра, буква),
  • функциональная клавиша (F1-F12),
  • клавиша специального назначения (переключения виртуальных консолей, включения отладочного режима, перезагрузки машины),
  • модификатор, фиксируемый (CapsLock и NumLock) или нефиксируемый (Shift, Control, Alt).

Номер скан-кода жестко привязан к своей физической клавише (например,
скан-код 001 -- это левая верхняя клавиша стандартной современной клавиатуры), а его символьное значение по умолчанию совпадает, как правило, с маркировкой этой клавиши (в данном примере -- Escape). Подчеркну, что здесь и далее (если явно не оговорено иное) речь обычно будет идти именно о символьных значениях скан-кодов по умолчанию, поскольку все они могут быть переопределены (почти) произвольным образом. Правда, сомнительно, что кому-нибудь доставит удовольствие вспоминать, к какому скан-коду он привязал цифру 1 и как маркирована соответствующая клавиша. Однако в ряде специальных случаев к такому переопределению прибегать целесообразно.

Следующие семь колонок -- значения тех же скан-кодов при нажатых нефиксируемых клавишах-модификаторах -- Shift, Control, Alt и их сочетаниях. Наконец, последняя колонка (lock state) отмечает, подвержено ли значение данного скан-кода действию фиксируемого модификатора (CapsLock).


Содержание

. .