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

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

завершить квант. Если это произошло, следует сохранить информацию о том, что текущий процесс был активен в прошедшем кванте. Для чего в переменную prev ptr копируется текущее значение bilLptr.

Утилиты для работы со временем

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

Функция init clock вызывается в начале работы задачи часов clock task. Она устанавливает режим работы и период программируемых часов так, чтобы они тикали 60 раз в секунду. Несмотря на то что скорость процессора увеличилась с 4,77 МГц у оригинальных IBM PC до сотен мегагерц на современных системах, для программирования таймера используется одно и то же значение константы TIMER C0UNT, вне зависимости от модели компьютера, на котором работает MINIX. У каждого IBM-совместимого компьютера, каким бы быстрым ни был его процессор, для управления различными устройствами, оперирующими временем, имеется сигнал с частотой 14,3 МГц. Примерами устройств, которым необходим таймер, являются последовательный интерфейс и экран.

Функция clock stop дополняет init clock. Эта функция не очень нужна, она используется потому, что пользователям MINIX иногда может потребоваться запускать другие операционные системы. Эта функция просто сбрасывает параметр микросхемы таймера, переводя ее в режим работы по умолчанию, как этого могут ожидать MS-DOS и некоторые другие операционные системы.

Функция milli delay необходима для задач, которым требуются задержки мил-лисекундной величины. Она написана на языке С и не содержит аппаратно-спе-цифичного кода, но в ее коде вы увидите технику, которую могли бы ожидать только в низкоуровневых ассемблерных процедурах. Функция инициализирует переменную-счетчик нулем, после чего быстро, в непрерывном цикле, проверяет эту переменную до тех пор, пока она не достигнет нужного значения. Во второй главе мы говорили о том, что такая методика, называемая активным ожиданием, по возможности должна избегаться, но правила не бывают без исключений, это жизнь. За инициализацию счетчика отвечает следующая функция, milli start, которая просто обнуляет значения двух переменных. Опрос значения счетчика производится при помощи последней функции в файле, mUli elapsed. Она обращается к аппаратному обеспечению часов. Проверяется значение того же самого счетчика, который используется для обратного отсчета тиков таймера, то есть тот, что может дойти до нуля или принять максимальное значение до того, как закончится требуемый временной интервал. Функция milli elapsed корректирует это поведение.

3.9. Терминалы

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



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

3.9.1. Аппаратное обеспечение терминала

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

Отображаемые в память терминалы

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


Отображаемый в памяти интерфейс

Интерфейс RS-232


Сетевой интерфейс

X-терминал

Рис. 3.18. Типы терминалов

На видеокарте имеется также микросхема, называемая видеоконтроллером. На ее вход подаются коды символов, а на выходе она генерирует видеосигнал, который воспринимается монитором. Электронно-лучевая трубка монитора генерирует электронный пуч, который горизонтально сканирует экран, рисуя на нем линии. Обычно экран имеет разрешение от 480 до 1024 линий по вертикали



и от 640 до 1200 точек в линии. Эти точки называют пикселами. Сигнал от видеоконтроллера модулирует электронный луч и определяет, будет ли пиксел светлым или темным. У цветных мониторов есть три независимо модулируемых луча, отдельно для красного, зеленого и синего цветов.

Центральный процессор Память

Графический адаптер

Монитор

Шина

Видеоконтроллер


Параллельный Клавиатура порт

Аналоговый видеосигнал (то естЫб МГц)

Рис. 3.19. Отображаемые в память терминалы, доступ через видеопамять

У простого монохромного монитора каждый символ (включая межсимвольный промежуток) помещается в прямоугольник 9 пикселов в ширину и 14 в высоту, всего на экране получается 25 строк по 80 символов в каждой. При этом дисплей должен иметь разрешение 350 растровых строк по 720 пикселов в каждой. Каждый кадр обновляется от 45 до 70 раз в секунду. Видеоконтроллер при этом мог бы считывать из видеопамяти первые 80 символов, генерировать для них 14 строк растра, затем считывать следующую строку символов, генерировать растр для них и т. д. Фактически же, большинство контроллеров считывают символ из видеопамяти один раз на строку растра, чтобы не было необходимости в буферизации. Рисунки символов 9 х 14 хранятся в ПЗУ видеоконтроллера (или ОЗУ, чтобы отображать пользовательские шрифты). Эта область памяти адресуется 12-битным адресом, в котором 8 бит определяют код символа, а четыре бита задают номер строки. Восемь битов каждого байта памяти определяют 8 пикселов, а 9-й пиксел всегда пустой. Таким образом, для отображения на экране одной строки текста требуется 14 х 8 = 1120 обращений к видеопамяти. То же количество обращений делается к ПЗУ генератора символов.

У IBM PC есть несколько режимов работы экрана. Простейший из них представляет собой символьный дисплей для консоли. На рис. 3.20, а мы видим участок видеопамяти. Каждый символ на рис. 3.20, б представлен в видеопамяти двумя байтами. Младший байт - это ASCII-код символа, а старший - байт атрибутов, который может задавать цвет, инверсию, мигание и прочие атрибуты символа. В этом режиме весь экран 25 х 80 символов занимает 4000 байт видеопамяти.

Графические терминалы основаны на том же принципе, за исключением того, что позволяют управлять цветом каждого пиксела на экране по отдельности. В простейшем варианте, для монохромного дисплея, каждому пикселу соответствует один бит видеопамяти. В другом предельном случае цвет пиксела описывается 24-разрядным словом, в котором по 8 бит выделяется на красный, зеленый



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