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

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

указатель на текущий параметр перемещается к следующему параметру, чтобы начать считывание его значения. Благодаря такому подходу, если изменить константу MAX ESC PARAMS в сторону массива большего объема, код менять не придется. Наконец, в третьем случае, когда получен символ, не являющийся ни числом, ни точкой с запятой, вызывается do escape.

Функция do escape весьма объемна, несмотря на относительно скромную поддержку ESC-последовательностей в MINIX. Но какая бы длина ни была, код должен быть достаточно прост. После того как делается вызов flush, нужно убедиться, что содержимое экрана полностью обновлено. Оператор if выполняет простую проверку, является ли следующий за BSC символ преамбулой ESC-последовательности или нет. Если нет, возможно только одно действие, перемещение курсора на строку вверх, этому соответствует ESC-последовательность ESC М. Обратите внимание, что проверка значения осуществляется оператором switch, это сделано в предчувствии появления новых вариантов, то есть последовательностей, не соответствующих формату ESC [. Потому обрабатывается вариант без преамбулы типичным для многих последовательностей образом: по значению переменной cons->c row определяется, необходима ли прокрутка. Если курсор находится в нулевой строке, делается вызов scrolLscreen с параметром SCROLL DOWN. Если нет, курсор просто сдвигается на одну строку вверх, для чего переменная cons->c row уменьшается на 1 и вызывается flush. Если обнаружена преамбула ESC-последовательности, срабатывает другая ветвь верхнего оператора if. Сначала проверяется, не [ ли это, то есть единственная возможная преамбула, обрабатываемая в текущий момент в MINIX. Если символ корректен, в переменную value записывается значение первого полученного параметра, или ноль, если параметров нет. Если последовательность некорректна, ничего не происходит, за исключением того, что switch с большим телом пропускается, а состояние автомата сбрасывается в О перед вызовом do escape. В более интересном случае, когда последовательность правильна, выполняется оператор switch. Все возможные варианты мы рассматривать не будем. Вместо этого мы обсудим только наиболее представительные типы действий, управляемых ESC-последовательностями.

Первые пять последовательностей без числовых аргументов генерируются клавишами-стрелками и клавишей Ноте на клавиатурах IBM PC. Две последовательности, BSC [А и BSC [В, сходны с BSC М, с той разницей, что числовой параметр позволяет перемещаться более чем на одну строку, а при достижении фаниц экрана содержимое не прокручивается. Функция flush в этом случае обнаруживает попытки передвинуть курсор за фаницы экрана и офаничивает его перемещение. Две другие последовательности, BSC [С и BSC [D, перемещающие курсор вправо и влево, аналогичным образом ограничены flush. Когда они генерируются клавишами управления курсором, числовой аргумент не передается, поэтому происходит перемещение на одну строку или столбец.

Далее, последовательность BSC [Н может иметь два числовых параметра, например BSC [20;60Н. Эти параметры задают положение курсора в абсолютных координатах, а не относительно предыдущего места расположения, и для правильной интерпретации преобразуются из координат, отсчитываемых с 1, в координаты



с началом в 0. Клавиша Ноте на клавиатуре генерирует последовательность без параметров (с параметрами по умолчанию), которая перемешает курсор в положение (1;1).

Две следующие последовательности, ESC [sJ и BSC [sK, очищают либо часть строки, либо часть всего экрана, в зависимости от переданного параметра. В обоих случаях подсчитывается количество символов. Например, для последовательности BSC [1J в count заносится количество символов с начала экрана до текущего положения курсора, и это количество и параметр положения, dst, который может быть равен началу экрана, cons->c org, используются как аргументы для вызова mem vid copy. Аргументы процедуры таковы, что она заполняет указанную область экрана текущим цветом фона.

Четыре следующие последовательности вставляют новые строки и удаляют строки и пробелы в текущем местоположении курсора, и их работа не нуждается в детальном рассмотрении. Последний вариант, последовательность BSC [ит (обратите внимание, что п - числовой аргумент, а т - литера, часть последовательности), оказывает влияние на параметр cons->c attrib. Это байт атрибутов, который при записи символов в видеопамять чередуется с кодами символов.

Функция set 6845 вызывается тогда, когда необходимо обновить информацию чипа видеоконтроллера. У контроллера 6845 есть внутренние 16-разрядные регистры, которые программируются по 8 бит за раз. Поэтому для записи одного регистра требуются четыре операции с портами ввода/вывода. Так как прерывания могут нарушить последовательность действий, делаются вызовы lock и unlock, запрещающие прерывания на время обмена информацией. Некоторые из регистров чипа контроллера 6845 перечислены в табл. 3.19.

Таблица 3.19. Некоторые из регистров чипа 6845

Регистры Назначение

10-11 Размер курсора

12-13 Начальный адрес видимой части экрана

14-15 Положение курсора

Функция beep вызывается при выводе символа CTRL+G. Она подает на внутренний динамик прямоугольный сигнал, опираясь на встроенные аппаратные возможности PC. Звук появляется путем некоторых магических манипуляций с портами ввода/вывода, которые интересны только программистам на ассемблере. Более интересно то, как при помощи задачи часов устанавливается сигнальный таймер, который используется для инициации функции. Адрес следующей подпрограммы, stop beep, передается в сообщении задаче часов. Она прекращает звуковой сигнал после того, как истечет заданное время, и сбрасывает флаг beeping, используемый для того, чтобы избыточные вызовы звукового сигнала не превращались в сам звук.

Подпрограмма scrjnit вызывается из ttyjnit столько раз, сколько указано в NR CONS. При каждом вызове аргументом подпрограммы является указатель на структуру, один из элементов массива tty table. В подпрограмме вычисляется значение line, будущий индекс в массиве cons table, это значение проверяется на



корректность, и, если все правильно, оно используется для инициализации указателя cons, ссылающегося на текущую запись в массиве cons table. К этому моменту поле cons->c tty может быть инициализировано указателем на главную структуру tty для устройства, а в tp->tty priv, в свою очередь, может быть записан указатель на структуру cons t устройства. Затем для инициализации клавиатуры вызывается подпрофамма kbjnit и устанавливаются указатели на специфичные для данного устройства подпрограммы. После этого tp->tty devwrite ссылается на cons write, а tp->tty echo содержит указатель на cons echo. Далее определяется адрес ввода/вывода регистра базы видеоконтроллера и, в соответствии с типом видеоконтроллера, устанавливается флаг wrap (этот флаг определяет способ прокрутки). Затем в глобальной таблице дескрипторов запоминается дескриптор области видеопамяти.

В дальнейщем происходит инициализация виртуальных консолей. При инициализации каждой консоли с разным значением tp вызывается scrjnit, и, таким образом, для каждой консоли в scrjnit используются собственные значения line и cons, и каждая консоль арендует собственный участок видеопамяти. Затем каждый экран очищается, и, наконец, консоль с нулевым номером становится активной.

Оставщиеся подпрофаммы из файла console.c устроены просто, имеют небольшой размер и заслуживают столько же слов. Функция putk уже упоминалась ранее. Она печатает на экран символ от лица подпрограмм ядра, не прося о помощи файловую систему. Функция toggle scroll делает именно то, что означает ее название, она изменяет значение флага типа прокрутки: аппаратная или профаммная. Помимо этого, она выводит текст в текущей позиции курсора, сообщая, какой режим выбран. Функция cons stop инициализирует консоль, переводя ее в состояние, которое ожидает монитор начальной загрузки. Это делается перед выходом из системы или перезагрузкой. Функция cons orgO используется только тогда, когда по клавише F3 изменяется режим прокрутки или когда идет подготовка к выходу из системы. Функция select console выбирает (активизирует) виртуальную консоль. При вызове ей передается индекс новой консоли, и она дважды вызывает set 6845, чтобы показать на экране данные из соответствующей части видеопамяти.

Две последние подпрограммы сильно зависят от особенностей программного обеспечения. Функция conjoadfont зафужает в видеоконтроллер шрифт, обеспечивая выполнение операции TIOCSFON вызова ioctl. Эта функция при помощи серии вызовов ga program делает так, что становится видимой память шрифтов контроллера, которая в обычной ситуации не адресуема. Затем, чтобы скопировать шрифт в ставшую доступной область памяти, вызывается phys copy, а после этого другая последовательность команд возвращает устройство в нормальный режим работы.

Отладочный вывод

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



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