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

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.13. Несколько записей из файла оригинальной клавиатурной раскладки MINIX

Код опроса

Символ

Обычный

SHIFT

ALT2

ALT+SHIFT

CTRL

CACD

CACD

CACD

С CD

у

у

r

ACT)

АСГ)

CCA)

=

+

AC=-)

AC=)

AC+)

CC@-)

q

LCq)

ACQ)

ACq)

ACQ )

CCQ)

CR/LF

сем-)

CCM)

CACM-)

CACM)

CACM)

CCJ)

CTRL

CTRL

CTRL

CTRL

CTRL

CTRL

CTRL

ASF1

Значения, содержащиеся в ячейках таблицы, задаются при помощи макросов из файла include/minix/keymap.h:

#define С(с) ((c)) & OxlF)

#define А(с) ((c)) 0x80)

#def1ne СА(с) А(С(с))

#define L(c) ((с) 1 HASCAPS)

/* Преобразование в управляющий код */ /* Устанавливается восьмой бит (ALT) */ /* CTRL+ALT */

/* Добавляется атрибут Caps-Lock оказывает влияние */

Первые три макроса манипулируют битами переданного символа, вырабатывая нужный код. Последний устанавливает бит HASCAPS в старшем байте 16-разрядного кода. Этот флаг указывает на необходимость проверки, фиксируется ли верхний регистр букв (клавиша Caps Lock), и возможную модификацию кода. В табл. 3.13 записи для кодов опроса 2, 13 и 16 иллюстрируют, как обрабатываются типичные клавиши с цифровыми, алфавитными символами и знаками препинания. У кода 28 можно видеть одну особенность. Обычно клавиша ENTER порождает код CR (OxOD), который записывается здесь как С(М). Так как в UNIX символом новой строки является код LF (ОхОА) и иногда его необходимо вводить напрямую, комбинация CTRL-i-ENTER обрабатывается особым образом и производит код C(J).

Код опроса 29 - .это один из кодов модификаторов, который должен распознаваться всегда, поэтому, независимо от состояния прочих модификаторов, возвращается значение CTRL Функциональные клавиши не генерируют обычных ASCII-символов, и строка таблицы для кода опроса 59 содержит символьную запись значений, возвращаемых при нажатии клавиши F1 в комбинации с различными модификаторами. Это следующие коды: F1: 0x0110, SF1: 0x1010, AF1: 0x0810, ASF1: ОхОСЮ, CF1: 0x0210. Последняя запись в таблице соответствует коду опроса 127 - типичному для конца массива маркеру. У большинства клавиатур, используемых в Европе и Америке, недостаточно клавиш, чтобы генерировать такие коды, поэтому соответствующие записи в таблице заполняются нулями.



Загружаемые шрифты

в ранних персональных компьютерах шаблоны, по которым генерировались изображения символов на экране, хранились только в ПЗУ. Но у контроллеров, которыми оснашаются современные системы, образы символов можно загружать в оперативную память. В MINIX эта возможность поддерживается с помошью системного вызова ioctl следующего вида:

ioctl(0. TIOCFDN. font)

MINIX поддерживает видеорежим 80 столбцов на 25 строк, и файлы со шрифтами содержат 4096 байт. Каждый байт такого файла описывает значения восьми пикселов, при этом подсвеченному пикселу соответствует 1, погашенному - 0. Тем не менее контроллер дисплея для хранения изображения каждого символа отводит 32 байта, чтобы работать в более высоких разрешениях, не поддерживаемых сейчас MINIX. Для того чтобы преобразовать такой файл в 8192-байтовую структуру font, адрес которой передается в системный вызов ioctl, предназначена команда loadfont. Как и клавиатурные карты, шрифты могут загружаться при запуске системы или же позднее, в любой момент нормальной работы. Тем не менее загружать шрифт не обязательно, у каждого контроллера в ПЗУ имеется встроенный шрифт, доступный по умолчанию. Встраивать шрифт в саму систему нет необходимости, поэтому единственное, что присутствует в ядре для поддержки загружаемых шрифтов, - это код, выполняющий операцию TI0CSF0N системного вызова ioctl.

3.9.4. Реализация аппаратно-независимого драйвера терминала

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

Структуры данных задачи терминала

в файле tty.h содержатся определения, используемые в коде драйверов терминала. Большая часть объявленных в этом файле переменных можно идентифицировать по префиксу tty . Кроме того, еще одна такая переменная объявлена в файле glo.h как EXTERN. Это переменная tty timeout, она используется в обработчиках прерываний как терминала, так и часов.

Определения макросов 0 N0CTTY и 0 N0NBL0CK (значения необязательных флагов для системного вызова open) повторяют определения, имеющиеся в файле include/fcntLh. Это сделано с той целью, чтобы не присоединять другие заголовочные файлы. Типы devfun t и devfunarg t применяются для передачи указа-



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

Самое главное описание в файле tty.h - это структура tty. Для каждого терминального устройства, рассматриваемого в целом (консольный дисплей и клавиатура образуют один терминал), существует одна такая структура. Первое ее поле, tty events, это флаг, который устанавливается в результате прерывания по факту изменений, требующих от задачи терминала уделить внимание устройству. Когда устанавливается этот флаг, также изменяется значение глобальной переменной tty timeaut с целью скомандовать задаче часов пробудить задачу терминала при следующем сигнале часов.

Остальные поля структуры tty объединены в фуппы, связанные с операциями ввода и вывода, состоянием устройства и информацией о незаверщенных операциях. В секции операций ввода первая пара переменных, ttyjnhead и ttyjntail, задают очередь, в которой буферизуются принимаемые символы. Поле ttyjncount является счетчиком количества символов в этой очереди, а в tty eotct подсчи-тываются строки символов, как будет описано ниже. Все вызовы, зависящие от конкретного устройства, являются косвенными, за исключением процедур инициализации терминала, которые и устанавливают указатели для косвенных вызовов. Указатели на специфичный для данного терминала код хранятся в полях tty devread и ttyjcancel. Это соответственно указатели на функцию чтения данных и функцию отмены чтения. Значение поля tty min сравнивается с tty eotct. Когда значение tty eotct становится больше или равно значению tty min, операция чтения считается завершенной. При каноническом вводе tty min равно 1, и tty eotct подсчитывает введенные строки. При неканоническом вводе tty eotct подсчитывает символы, а tty min присваивается значение из поля MIN структуры termios. Таким образом, сравнение этих двух полей позволяет определить, когда завершен ввод строки или получено минимальное необходимое количество символов (в зависимости от режима).

В поле tty time хранится значение времени, когда обработчик прерываний таймера должен пробудить задачу часов, а поле tty timenext используется для того, чтобы объединить в список активные поля tty time. Каждый раз, когда устанавливается таймер, этот список сортируется по времени, чтобы обработчик прерываний часов мог проверять только первую запись. MINIX поддерживает большое количество удаленных терминалов, из них в любой момент времени только несколько терминалов устанавливают таймер. Поэтому использование списка активных таймеров значительно упрощает работу обработчика прерываний таймера по сравнению с тем, как если бы ему приходилось проверять каждую запись в tty table.

Поскольку постановка данных в очередь вывода выполняется по-разному для разных устройств, секция вывода структуры tty не содержит переменных, а состоит исключительно из указателей на специфичные для данного устройства функции, служащие для вывода, эхо-отображения, отправки сигнала прерывания и отмены вывода. В секции состояния поля tty reprint, tty escaped и ttyjnhibited служат флагами, индицирующими, что последний полученный символ несет специальную нагрузку. Так, когда получен символ CTRL+V (LNEXT),



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.
Копирование материалов разрешено исключительно при условии цититирования.