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

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

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

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

Очевидно, что больщинство проблем, с которыми сталкиваются драйверы отображаемых в память терминалов, переносятся и на микропроцессоры внутри терминалов RS-232. С точки зрения самого микропроцессора он является центральным, в системе с отображаемым в память терминалом.

Экранным редакторам и другим сложным программам бывает нужно перерисовать экран, заменив определенные его участки, не затрагивая остального текста. Для этого многие терминалы поддерживают наборы управляющих команд, позволяющие перемещать курсор, удалять строки и т. д. Эти команды часто реализуются в виде ESC-последовательностей, то есть последовательностей символов, начинающихся с символа ESC (0x1В). Во времена расцвета терминалов с интерфейсом RS-232 существовали сотни разновидностей терминалов, у каждого из которых был свой набор ESC-последовательностей. В результате было довольно сложно написать программное обеспечение, работающее более чем на одном типе устройств.

В конце концов производители компьютеров и программного обеспечения осознали необходимость стандартизации ESC-последовательностей, в результате чего был разработан стандарт ANSI. Некоторые примеры ESC-последовательностей этого стандарта приведены в табл. 3.11.

Таблица 3.11. Некоторые ESC-последовательности стандарта ANSI

ESC-послвдоватвльность

Значение

ESC [пА

Переместить курсор вверх на п строк

ESC [пВ

Переместить курсор вниз на п строк

ESC [пС

Переместить курсор вправо на п позиций

ESC [nD

Переместить курсор влево на п позиций

ESC [т;пН

Переместить курсор в позицию (т, п)

ESC [sJ

Очистить экран от позиции курсора (0 - до конца, 1 - до

начала, 2 - весь)

ESC [sK

Очистить строку от позиции курсора (0 - до конца, 1 - до

начала, 2 - всю)

ESC [nL

Вставить п строк у курсора

ESC [nM

Удалить п строк у курсора

ESC [nP

Удалить п символов у курсора

ESC [n@

Вставить п символов у курсора



ESC-последовательность Значение

ESC [nm Разрешить выделение текста (О - нормальный,

4 - полужирный, 5 - мерцающий, 7 - инверсный)

ESC М Прокрутка экрана в обратную сторону, если курсор находится

в верхней строке

3.9.3. Обзор драйвера терминала в MINIX

Код драйвера терминала в MINIX находится в четырех С-файлах (если включена поддержка псевдотерминалов RS-232, то в шести). Вместе они образуют самый большой и сложный драйвер в MINIX. Сложность частично объясняется тем, что драйвер должен обслуживать одновременно клавиатуру и экран, которые сами по себе являются сложными устройствами, а также два других опциональных типа терминалов. Но многих все равно удивляет, что обслуживание терминального ввода/вывода требует в тридцать раз больше кода, чем занимает планировщик. (Это удивление подкрепляется многочисленными книгами, в которых обсуждению работы планировщика отводится в тридцать раз больше места, чем обсуждению ввода/вывода.)

Задача терминала принимает следующие семь типов сообщений.

1. Чтение с терминала (от файловой системы по поручению пользовательского процесса).

2. Вывод на терминал (от файловой системы по поручению пользовательского процесса).

3. Установка параметров терминала для ioctl (от файловой системы по поручению пользовательского процесса).

4. Ввод/вывод, произошедший за последний тик таймера (от прерывания часов).

5. Отмена предыдущего запроса (от файловой системы, когда возникает сигнал).

6. Открыть устройство.

7. Закрыть устройство.

Сообщения с командами на запись и чтение имеют тот же формат, что и сообщения, показанные в табл. 3.4, за тем небольшим исключением, что не требуется поле POSITION. Работая с диском, программа должна указывать, какой блок необходимо считать. При работе с терминалом такого выбора нет: всегда считывается следующий введенный пользователем символ. Терминалы не поддерживают переход на произвольную запись (позиционирование).

Функции стандарта POSIX, tcsetattr и tcgetattr, необходимые для определения и изменения параметров (атрибутов) терминала, поддерживаются при помощи системного вызова ioctl. Хороший стиль программирования требует, чтобы для управления терминалом использовались эти и другие функции из файла include/termios.h, а преобразование этих вызовов в системный вызов ioctl было бы оставлено на стандартную библиотеку языка С. Тем не менее существуют не-



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

Сообщение, которое ioctl отправляет драйверу терминала, содержит код запрашиваемой функции и указатель. Библиотечной функции tcsetattr соответствуют коды функций TCSETS, TCSETSW и TCSETSF, а указатель должен ссылаться на структуру termios (см. листинг 3.3). Б данном случае вызов замещает текущие значения атрибутов новыми, различие между тремя функциями в том, что запрос TGETS приводит к немедленному изменению атрибутов, TCSETW выполняется только после того, как завершается вывод, а TCSETSF сначала дожидается окончания вывода, а затем очищает все еще не считанные входные данные. Функция tcgetattr транслируется в вызов ioctl с кодом операции TCGETS и возвращает сделавшей вызов программе заполненную атрибутами структуру termios, позволяя определить параметры устройства. Те вызовы ioctl, у которых нет аналогов в стандарте POSIX, могут требовать ссылки на другие структуры. Например, для операции KIOCSMAP, загружающей новую раскладку клавиатуры, требуется ссылка на 1536- байтовую структуру keymap t (16-битные коды для 128 клавиш х 6 модификаторов). Таблица 3.15 резюмирует, как вызовы стандарта POSIX преобразуются в системные вызовы ioctl.

У драйвера терминала имеется одна центральная структура данных, tty table, представляющая собой массив структур tty, по одной на терминал. У стандартного персонального компьютера есть только одна клавиатура и экран, но MINIX поддерживает до восьми виртуальных терминалов, в зависимости от объема памяти у контроллера. Это позволяет с одной консоли входить в систему несколько раз, переключая клавиатуру между разными пользователями . Если есть две виртуальные консоли, то, нажав ALT+F2, можно переключиться на вторую, а нажатие ALT+F1 активизирует первую консоль. Для переключения можно также использовать комбинацию ALT и клавиши управления курсором. Кроме того, последовательные линии обеспечивают поддержку двух удаленных пользователей, подключающихся через модем или кабель RS-232, а псевдотерминалы позволяют пользователям подключаться через сеть. Драйвер написан так, чтобы можно было легко добавлять новые терминалы.

Каждая из структур tty в массиве tty table отслеживает как ввод, так и вывод. При вводе она поддерживает очередь символов, которые были введены пользователем и еще не были считаны, информацию о запросе на чтение символов и об интервалах таймера, чтобы задача не блокировалась, если не нажато ни одного символа. При выводе она хранит параметры запросов на вывод, которые еще не были выполнены. Также есть другие поля с различной общей информацией, например с описанной выше структурой termios, которая оказывает влияние на многие особенности ввода и вывода. Кроме того, в структуре tty есть указатель, который ссылается на информацию, необходимую для конкретного класса устройств, но не требуемую для всех терминалов. Так, завязанной на аппаратное обеспечение части кода драйвера терминала требуется информация о текущем положении вывода в видеопамяти, но при работе с линией RS-232 эта информация не нужна. Дополнительно для каждого типа устройств имеются собственные



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