Главная страница  Межпроцессное взаимодействие (состязание) 

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 [ 92 ] 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187

Таблица 3.12. Поля структуры console, связанные с текущей позицией на экране

Поле Значение

c start Начало видеопамяти для консоли

cjimit Предел видеопамяти для консоли

c column Номер текущего столбца (0-79), считая слева

c row Номер текущей строки (0-24), считая сверху

c cur Смещение курсора в видеопамяти

c org Область памяти, отводимая под экран. В чипе 6845 адресуется регистром базы

Драйвер терминала поддерживает ESC-последовательности, то есть габкие возможности управления экраном для редакторов и прочих интерактивных профамм. Поддерживаемые последовательности являются подмножеством стандарта ANSI и достаточны для простого переноса на MINIX большинства программ, написанных для другого аппаратного обеспечения и других операционных систем. Есть две категории ESC-последовательностей: те, которые никогда не имеют параметров, и те, которые могут содержать варьируемые данные. Единственный представитель первой категории, реализованный в MINIX, это ESC М - последовательность, выполняющая обратный перевод строки. При этом курсор поднимается на одну строку вверх, а если курсор уже находится на верхней строке, экран прокручивается на строку вниз. У последовательностей из второй категории могут быть один или два параметра. Все такие цепочки символов начинаются с BSC [. Символ [ является преамбулой ESC-последовательности. Список последовательностей, описываемых стандартом ANSI и поддерживаемых MINIX, приведен в табл. 3.11.

Разбор ESC-последовательностей не так прост. В MINIX корректные последовательности могут содержать от двух символов, как ESC М, до 8, как последовательности с двумя двухразрядными параметрами. Например, последовательность ESC [20;60Н перемещает курсор на 20-ю строку, в 60-й столбец. Если параметр один, его можно опускать, а при наличии двух параметров позволено опустить оба. Когда параметр не указывается или указывается значение, превышающее фаничное, используется значение по умолчанию, которое равно наименьшему допустимому значению.

Рассмотрим способы того, как при помощи ESC-последовательностей переместить курсор в верхний левый угол экрана.

1. Последовательность BSC [Н. Так как оба параметра пропущены, берутся наименьшие значения.

2. Последовательность ESC [1;1Н переместит курсор в строку 1, столбец 1 (в ANSI нумерация столбцов и строк начинается с единицы).

3. Опустив только один из параметров, можно сконструировать последовательности ESC [1;Н и BSC [;1Н. Отсутствующий параметр по умолчанию будет считаться равным 1.



4. К тому же результату приведет и ESC [0;0Н, так как в ней оба параметра меньше минимально допустимой величины. Они будут заменены значениями по умолчанию.

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

Для разбора ESC-последовательностей в MINIX реализован конечный автомат. Переменная состояния этого автомата c esc state в структуре console обычно имеет значение 0. Когда функция out char обнаруживает символ BSC, она устанавливает переменную состояния в 1, и последующие символы будут интерпретироваться функцией parse escape. Если следующий полученный символ является преамбулой ESC-последовательности, вьшолняется переход в состояние 2. В этом состоянии вычисляется значение числовых параметров, пока на вход поступают цифровые символы. А именно: предыдущее значение (которое изначально равно 0) умножается на 10, и к нему добавляется значение полученного числового символа. Значения параметров хранятся в массиве, и когда поступает символ точки с запятой, осуществляется переход к следующей ячейке массива. В MINIX этот массив содержит всего два элемента, но принцип тот же. Когда встречается нечисловой символ помимо точки с запятой, последовательность считается завершенной и снова вызывается do escape. Полученный символ используется для того, чтобы определить, какое именно действие необходимо выполнить и как интерпретировать параметры, будь то значения по умолчанию или считанные из потока символов данные. Это иллюстрируется рис. 3.28.

Подгружаемые раскладки клавиатуры

Клавиатура IBM PC не генерирует ASCII-коды напрямую. Клавиши идентифицируются по их номерам, начиная с клавиш в верхнем ряду оригинальной клавиатуры IBM PC. Соответственно, клавиша ESC имеет номер 1, 1 имеет номер 2 и т. д. Номера присвоены всем клавишам, включая клавиши-модификаторы, такие как левый и правый SHIFT, которые соответственно имеют номера 42 и 54. Когда нажимается клавиша, MINIX извлекает ее номер из кода опроса клавиатуры. Код опроса генерируется и в том случае, когда клавиша отпускается, но здесь устанавливается старший значащий бит кода (что эквивалентно добавлению числа 128 к номеру). Благодаря этому операционная система может различать, была клавиша нажата или отпущена. Поскольку система отслеживает состояние клавиш-модификаторов, возможно большое число комбинаций. Для большинства целей достаточно двухклавишных сочетаний, таких как SHIFT+A или CTRL-i-D, удобных для печатающих двумя руками, но в некоторых специальных случаях могут применяться комбинации из трех (и более) клавиш, например CTRL-t-SHIFT-t-A или CTRL+ALT+DEL, последняя на PC используется для сброса системы.

Сложность клавиатуры PC имеет следствием большую гибкость ее использования. В стандартном наборе присутствуют 47 клавиш с типовыми символами (26 алфавитных символов, 10 цифр и 11 знаков препинания). Если мы будем поддерживать комбинации из трех клавиш-модификаторов, таких как CTRL+ALT+SHIFT, получается набор из 376 (8 х 47) вариантов. Это - ни коим образом не предел



возможного, но сейчас мы не будем акцентировать различия между левыми и правыми клавишами-модификаторами, а также учитывать функциональные клавиши или клавиши цифровой клавиатуры. Конечно, никто не заставляет нас использовать в качестве модификаторов только клавиши CTRL, SHIFT и ALT. Мы вправе исключить какую-либо клавишу из стандартного набора и использовать ее в качестве модификатора, для чего нужно написать драйвер, который будет поддерживать такую систему.

Чтобы определить, какой код передать программе при нажатии определенной клавиши, операционные системы, работающие с подобными клавиатурами, применяют клавиатурные раскладки, иначе карты клавиш. В MINIX типичная карта клавиш логически является массивом, имеющим 128 строк для каждого кода опроса (такой размер был выбран ради соответствия японским клавиатурам, у европейских и американских панелей нет такого числа клавиш) и 6 столбцов. Столбцы сопоставлены следующим состояниям: нет модификаторов, нажата клавиша SHIFT, нажата клавиша CTRL, нажата левая клавиша ALT, нажата правая клавиша ALT, нажата комбинация ALT-i-SHIFT. Такая схема при соответствующей клавиатуре, позволяет генерировать (128 - 6) х 6 = 720 различных кодов символов. Конечно, каждая запись в таблице должна содержать 16-битное значение. У американских клавиатур столбцы ALT и ALT2 идентичны. Для других языков клавиша ALT2 названа ALTGR, и на многих из подобных клавиатур нарисован третий символ на клавише, для ввода которого и используется этот модификатор.

Стандартная карта клавиш встроена в ядро MINIX и определяется строкой #1nclude keymaps/us-std.src

в файле keyboard.с. Для загрузки альтернативной раскладки по адресу keymap используется системный вызов ioctl следующего вида:

1oct1(0, KIDCSMAP. keymap)

Полная раскладка занимает 1536 байт (128 х 6 х 2). Дополнительные раскладки хранятся в сжатой форме. Чтобы создать новую сжатую карту, запускается программа genmap. При компиляции в genmap включается код keymap.src для определенной раскладки. Обычно genmap запускается сразу же после того, как скомпилирована, и записывает уплотненную версию в файл, после чего исполняемый файл программы удаляется. Команда loadkeys загружает указанную карту клавиш, выполняет декомпрессию и делает системный вызов ioctl, передавая раскладку в память ядра. MINIX может автоматически вызывать loadkeys при старте. Кроме того, пользователь может в любой момент вызвать эту команду.

Исходный код раскладки описывает большой инициализированный массив. В табл. 3.13 показано содержимое нескольких строк файла src/kernel/keymaps/ us-std.src. На клавиатурах IBM PC нет клавиши, генерирующей код опроса 0. Коду 1 соответствует клавиша ESC. Из первой записи в таблице видно, что возвращаемый код для этой клавиши не зависит от состояния модификаторов SHIFT или CTRL, но если удерживается клавиша ALT, при нажатии ESC генерируется другой код.



1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 [ 92 ] 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187

© 2000 - 2018 ULTRASONEX-AMFODENT.RU.
Копирование материалов разрешено исключительно при условии цититирования.