Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лек СРВ от Анн.doc
Скачиваний:
11
Добавлен:
09.11.2019
Размер:
2.26 Mб
Скачать

14.2 Функции ос рв usix, не связанные с управлением процессами

В системе USIХ все функции ОС, не связанные с управлени­ем процессами, вынесены из ядра и реализованы в виде процес­сов-серверов. Относительно операционной системы сервер — обычный процесс, возможно более приоритетный, выполняемый в адресном пространстве пользователя и имеющий контролируе­мый доступ к ядру системы. Для повышения реактивности сервер может быть динамически погружен в ядро системы, т.е. отобра­жен в адресном пространстве ядра. Серверы относятся к классу системных процессов, однако особо быстродействующим про­цессам может быть назначен класс реального времени.

Пользователь, как правило, не взаимодействует с серверами непосредственно. Например, доступ к файловому серверу осуще­ствляется через стандартные системные вызовы 'оpen', 'сlоsе',

'writе' и т.д.

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

Лекция 15. Система ввода вывода USIX.

15.1 Программирование коммуникационных устройств.

Система ввода-вывода USIХ обладает рядом особенностей, среди которых следует прежде всего отметить:

  • поддержку стандартных механизмов доступа к внешним уст­ройствам;

  • независимость ядра USIХ от набора внешних устройств;

  • возможность загрузки и выгрузки драйверов во время работы

системы;

  • дополнительные возможности отладки драйверов без перестро­ения системы, что очень важно в системах, где необходима под­держка нестандартных устройств. Это является весьма харак­терным для систем реального времени;

  • в каталог /dev заносятся только те устройства, которые действи­тельно доступны к использованию.

Последняя особенность состоит в том, что в отличие от дру­гих UNIХ-систем в USIХ каталог /dev первоначально пустой. При загрузке драйвер создает в каталоге /dev свои специальные файлы. Это выполняется самим драйвером, так как только драй­вер может определить, какие устройства он будет обслуживать. Система USIХ поддерживает блок-ориентированные и байт-ори­ентированные устройства, а также прямой доступ к блочным уст ройствам. Связь ядра с драйвером осуществляется с помощью со­общений и портов.

После загрузки драйвера и создания имени специального файла в каталоге /dev пользовательская программа может от­крыть этот файл. Ядро распознает обращение к специальному файлу, формирует сообщение и посылает его в порт соответству­ющего драйвера. Если драйвер находился в состоянии приоста­новки в ожидании сообщения, он активизируется и начинает его обработку. Процесс пользователя при этом останавливается в ожидании ответного сообщения в свой порт, если запрос ввода-вывода был синхронным. Если запрос ввода-вывода асинхрон­ный, процесс пользователя может быть продолжен.

Передача данных между драйвером и процессом пользователя может осуществляться двумя способами: одновременно с сооб­щением; непосредственно, путем отображения региона пользо­вателя в адресное пространство драйвера. Вторая возможность используется в тех случаях, когда объем передаваемых данных до­статочно большой (например, в дисковых драйверах).

При разработке системы ввода-вывода USIХ были заложены следующие требования:

  • обеспечение унифицированного подхода для выполнения взаи­модействия между мультипроцессорным ядром USIХ и различ­ными устройствами ввода-вывода;

  • обеспечение возможности добавления, удаления и модифика­ции драйверов устройств;

  • обеспечение совместимости ввода-вывода со стандартами SVID.

Система ввода-вывода содержит несколько объектов:

  • набор драйверов ввода-вывода;

  • таблицы ядра;

  • объекты памяти;

  • интерфейс системы ввода-вывода с файловой системой.

Драйвер, являясь отдельным процессом, начинает выполне­ние как обычный процесс пользователя. Для выполнения специ­фических функций процесс-драйвер имеет следующие дополни­тельные возможности:

  • создавать порт или порты, которые будут точками взаимодейст­вия с другими процессами или ядром;

  • выполнять инициализацию программы обработки прерываний (ISR - Interrupt Service Routine) и подключать ее к вектору пре­рывания;

  • создавать специальный объект памяти (IСО — Interrupt Communication Оbject) для взаимодействия между процессом-драйвером и программой обработки прерываний;

  • выполнять инициализацию программы обработки по восста­новлению питания.

Объект IСО является областью памяти, выделяемой для об­мена данными (содержимое аппаратных регистров и др.) между программой обработки прерываний и драйвером. Размещение данных внутри IСО полностью зависит от драйвера и не интер­претируется ядром никаким другим способом.

Синхронизация драйвера и ISR выполняется посредством пе­редачи сообщений. Если ISR ждет реакции от драйвера, то необ­ходимо послать в порт драйвера сообщение с высоким приорите­том. В соответствующий момент этот запрос будет обнаружен драйвером.

Программа обработки прерываний выполняется в ограничен­ном контексте режима ядра и имеет доступ только к данным, рас­положенным в 1СО. На входе программа обработки прерываний получает в качестве параметров информацию об идентификации устройства и параметры IСО. После инициализации драйвера программа обработки прерываний отображается в адресное про­странство ядра. Область IСО должна находиться в пределах стра­ницы, что является требованием системы распределения памяти.

Стандартный драйвер содержит четыре секции (подпро­граммы):

  • секцию инициализации;

  • секцию обработки запросов на ввод-вывод;

  • секцию обработки прерываний;

  • секцию завершения работы драйвера.

При инициализации драйвер выполняет следующие функции:

  • создает записи в таблицах сdevsw и/или bdevsw. Эта функция обеспечивает совместимость со стандартами SVID;

  • создает порты для взаимодействия драйвера с ядром;

  • подсоединяет векторы аппаратных прерываний к подпрограм­ме обработки прерываний;

  • создает секцию IСО и объявляет о ней ядру;

  • создает записи в каталоге /dev для каждого обслуживаемого устройства, которые являются входами в таблицы сdevsw и bdevs;

  • инициализирует устройство ввода-вывода и сообщает системе о готовности драйвера к работе.

Секция обработки запросов на ввод-вывод получает за­просы с помощью системного вызова «getwork» из порта, создан­ного для взаимодействия с ядром.

Вызов «getwork» приостанавливает выполнение драйвера, по­ка в порт не придет некоторое сообщение. Сообщения могут быть посланы ядром, другими серверами (например, файловым серве­ром) или программой обработки прерываний драйвера. Драйвер получает всю необходимую информацию о запросе в принятом сообщении-запросе. После обработки запроса необходимо с по­мощью системного вызова «putwork» послать сообщение-ответ. Сообщения-запросы и сообщения-ответы имеют стандартные заголовки, но структура их тел зависит от типа запросов. Если к драйверу приходит запрос неизвестного типа, то сообщение об ошибке обычно выдается на консоль и посылается ответ как на ошибочный запрос ОРЕN.

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

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

Программа (секция) обработки прерываний (ISR.) после подключения к вектору прерывания отображается в адресное пространство ядра и при получении уп­равления имеет все права и привилегии ядра. В то же время, по­скольку программа обработки прерываний как часть драйвера и ядро компонуются раздельно, для ISR не известны другие адреса ядра, кроме передаваемых в качестве аргументов. Взаимодейст­вие ISR с драйвером может выполняться через специальный объ­ект памяти (IСО) и/или с помощью передачи сообщений через заранее созданный порт драйвера. Программа обработки преры­ваний может использовать набор системных подпрограмм в ядре, адрес которых передается с помощью аргументов.

Если драйвер обслуживает устройство с прямым доступом к памяти DМА — Direct Memory Access), то объект памяти в запро­сах чтения/записи указывает на список физических адресов стра­ниц. Для обращения к этим страницам непосредственно про­грамме обработки прерываний необходимо отобразить их в вир­туальное пространство ядра с помощью специального вызова.

При завершении работы драйвер должен с помощью специальных системных вызовов (usixса11) выполнить следующие действия:

  • удалить записи в каталоге /dev и в таблицах bdevsw и сdevsw;

  • отсоединиться от векторов прерываний;

  • уничтожить созданные порты;

  • выполнить «ехit».

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

Недостатки, главным образом, относятся к управлению сис­темой: требуется перестройка ядра при добавлении или удалении

драйверов в системе.

Концепция USIХ основана на загружаемых драйверах, реали­зованных в виде процессов-серверов. Это ведет к гибкости кон­фигурации системы и дает возможность модифицировать и отла­живать драйверы на уровне пользователя.