А. Робачевский - Операционная система UNIX (1114671), страница 63
Текст из файла (страница 63)
Если драйвер не поддерживает каких!либо функций стан!дартного интерфейса, он заменяет соответствующие точки входа специ!альными заглушками, предоставляемыми ядром. Когда ядру требуется за!просить какую!либо операцию у драйвера устройства, оно определяет эле!мент коммутатора, соответствующий данному драйверу (используя егостарший номер), и вызывает требуемую функцию.В названиях точек входа драйвера используются определенные соглаше!ния. Поскольку в ядре системы одновременно присутствует большое ко!www.books-shop.com327личество различных драйверов, каждый их них должен иметь уникальноеимя во избежание проблем при компиляции (точнее, при редактированиисвязей) ядра. Каждый драйвер имеет уникальноеобозна!чение, используемое в качестве префикса названий функций.
Например,драйвер виртуальной памяти ядраимеет префикс mm, такимобразом функции этого драйвера будут иметь названия,И.В табл. 5.1 приведены некоторые точки входа, общие для различных типовдрайверов, а символами хх, с которых начинается имя каждой функции,обозначен уникальный префикс драйвера. Стандартные точки входа драй!вера отличаются для разных версий UNIX. Например, некоторые версииимеют расширенный коммутатор блочных устройств, включающий такиефункции, каки xxwriteВ некоторых версияхвключены точки входа для инициализации и сброса шины данных.Таблица 5.1.
Типичные точки входа в драйвер устройстваТочка входаСим[воль[ный+Блочный+Низкогоуровня+НазначениеВызывается при каждой опера%ции открытии устройства. Обес%печивает необходимую реини%физического уст%ройства и внутренних данныхдрайвера. Например, для каждо%го последующего открытия драй%вера могут размещаться допол%нительные буферы, обеспечи%вающие возможность независи%мой работы с устройством не%скольким процессам.+++—+Производитустройства.чтениеданныхот+—+Производит записьустройство.данныхнаВызывается, когда число ссылокна данный драйвер становитсяравным нулю, т.
е. ни один изпроцессов системы не работает сустройством (не имеет открытымсоответствующий файл устрой%ства). Может вызывать отключе%ние физического устройства.Например, драйвер накопителяна магнитной ленте может пере%мотать ленту в начало.www.books-shop.com328Глава 5,ввода/выводаТаблица 5.1 (продолжение)Точка входаСим[воль[ный++Блоч[Назначение+Является общим интерфейсомуправления устройством. Драй%вер может определить наборкоманд, которые могут быть пе%реданы ему, например с помо%щью системного вызова ioctl(2).+Вызывается при поступлениипрерывания, связанного с дан%ным устройством. Может выпол%нить копирование данных от уст%ройства в промежуточные буфе%ры, которые затем считываютсяфункцией xxreadпо запросуприкладного процесса.+Производит опрос устройства.Обычно используется для уст%ройств,неподдерживающихпрерывания, например, для оп%ределения поступления данныхдля чтения.++Вызывается для останова драй%вера при останове системы илипри выгрузке драйвера.++Общая точка входа для операцийблочногоНазва%ние функции говорит о том, чтоустройство может обеспечиватьсобственную стратегию обработ%ки поступающих запросов, на%пример, изменять их порядокдля повышения производитель%ностиЕсли уст%ройство занято, функция поме%щает запросы в очередь.
В этомслучае фактическийинициирует функция обработкипрерывания, которая вызывает%ся, когда устройство закончитпредыдущую операцию ввода/вы%вода.++Выводит сообщение драйвера наконсоль, обычно при запускесистемы.+++Низкогоуровняwww.books-shop.comДрайверы устройствЯдро вызывает те или иные функции драйвера в зависимости от запроса.Например, если процесс выполняет системный вызовдля специ!ального файла символьного устройства, ядро вызовет функциюдля соответствующего символьного драйвера. Если же процесс запрашива!ет ту же операцию для обычного дискового файла, ядро вызовет процедурудля блочного драйвера, обслуживающего данную файловуюсистему.Вообще говоря, можно выделить пять основных случаев, в которых ядрообращается к функциям драйвера:Автоконфигурация.
Обычно происходит в процессе инициализацииUNIX, когда ядро определяет, какие устройства доступны в системе.Ввод/вывод. Запрос на операцию ввода/вывода может быть и н и ц и и !рован как прикладным процессом, так и некоторыми подсистемамиядра, например, подсистемой управления памятью.О Обработка прерываний. Ядро вызывает соответствующую функциюдрайвера для обработки прерывания, поступившего от устройства(если устройство способно генерировать прерывания).Специальные запросы.
Ядро вызывает соответствующую функциюдрайвера для обработки специальных команд, полученных с помо!щью системного вызова ioctl(2).ПНекоторые типы аппаратных архитектурмогут требовать сброса иустройства. Определен!ные функции драйвера также вызываются при останове операцион!ной системы.На рис. 5.2 и 5.3 приведены схемы доступа к драйверам символьного иблочного устройств.Как видно из рисунков, схема обработки запроса ядром UNIX различнадля символьных и блочных устройств.При обсуждении точек входа драйверов устройств следует иметь в виду,что большинство функций драйвера, отвечающих за передачу данных,осуществляют копирование информации из адресного пространства ядра,в котором находится сам драйвер, в адресное пространство задачи. Когдаядро вызывает функцию драйвера, все действия выполняются в системномконтексте процесса.
Однако схема вызова функций может быть различной:П Функция может быть вызвана по запросу процесса. Например, еслипроцесс выполняет системный вызов read(2), ядро вызывает соответст!вующую точку входа драйвера x x r e a d ( ) , обеспечивающего работу сфайлом. В этом случае говорят, что функция имеет контекст задачи.П Функция может быть вызвана другой подсистемой ядра операцион!ной системы. Например, для блочного драйвера функцияможет быть вызвана страничным демоном, для со!Ⱦɚɧɧɚɹɜɟɪɫɢɹɤɧɢɝɢɜɵɩɭɳɟɧɚɷɥɟɤɬɪɨɧɧɵɦɢɡɞɚɬɟɥɶɫɬɜɨɦ%RRNVVKRSɊɚɫɩɪɨɫɬɪɚɧɟɧɢɟɩɪɨɞɚɠɚɩɟɪɟɡɚɩɢɫɶɞɚɧɧɨɣɤɧɢɝɢɢɥɢɟɟɱɚɫɬɟɣɁȺɉɊȿɓȿɇɕɈɜɫɟɯɧɚɪɭɲɟɧɢɹɯɩɪɨɫɶɛɚɫɨɨɛɳɚɬɶɩɨɚɞɪɟɫɭpiracy@books-shop.com330Глава 5.хранения страниц во вторичной памяти (как правило, на жесткомдиске). Поскольку страничный демон представляет собой системныйпроцесс, выполняющийся только в контексте ядра, функцияxxstrategyв этом случае имеет системный контекст.Рис.
5.2. Доступ к драйверу символьного устройстваЕсли функция вызывается в процессе обработки прерывания, то онаимеет контекст прерывания — специальный вид системного контек!ста. Функции драйвера, отвечающие за обработку прерывания, на!примеримеют этот тип контекста.www.books-shop.comустройствРис.
5.3. Доступ к драйверу блочного устройстваРазличия в контексте и причинах вызова тех или иных функций драйверапозволяют представить драйвер устройства состоящим из двух частей:верхней части (top half) и нижней(bottom half). Функции верхнейwww.books-shop.com332Глава 5.части драйвера имеют синхронный характер, т. е. вызываются по опреде!ленным запросам прикладного процесса и выполняются вконтексте.Таким образом, для этих функций доступно адресное пространство ипроцесса, и при необходимости эти функции могут перевести про!цесс в состояние сна (вызовом функции(} ядра).
Функции вво!да/вывода и управления принадлежат верхней части драйвера.Вызов функций нижней части носит асинхронный характер. Например,момент вызова функции обработки прерываний нельзя предугадать, и ядроне может контролировать, когда эта функция будет вызвана. Выполнениетаких функций происходит в контексте ядра и обычно не имеет никакогоотношения к контексту текущего процесса. Таким образом, функции сис!темного контекста не имеют права адресовать структуры данных текущегопроцесса, например его u!area, а также не могут перевести процесс в со!стояние сна, поскольку это заблокирует процесс, не имеющий непосредст!венного отношения к работе драйвера.Две части драйвера требуют синхронизации. Например, в случае, когдафункции обеих частей используют одну и ту же структуру данных, функ!ция верхней части при выполнении должна заблокировать прерывания напериод работы с "разделяемой" областью памяти.
В противном случае,прерывание может поступить в тот момент, когда целостность структурыданных нарушена, что приведет к непредсказуемым результатам.Все представленные выше функции, за исключением xxhaltxxpollи xxintrпринадлежат верхней части драйвера. Функция xxhaltвы!зывается ядром при останове системы и, таким образом, имеет системныйконтекст, не связанный с контекстом прикладного процесса.Функцияобычно вызывается при обработке ядром прерываниятаймера для всех устройств, указанных как опрашиваемые.
Это необходи!мо, в частности, для устройств, которые не могут или "не хотят" использо!вать аппаратные прерывания. Вместо этого xxpollможет использовать!ся для эмуляции прерываний, например вызывая функцию xxintrнакаждыйтик системного таймера. Поэтому и функция() ифункция обработки прерывания() не могут рассчитывать на кон!текст прикладного процесса.
В большинстве версий UNIX функции опро!са и обработки прерываний вызываются не через коммутатор устройств, ачерез специальные таблицы ядра.В UNIX SVR4 определены две дополнительные точки входа — i n i tиstartДрайвер регистрирует эти функции в таблицах ядраиКод начальной загрузки системы запускает функцииперед инициализацией ядра, а функциисразу жепосле инициализации.www.books-shop.com333Файловый интерфейсВ главе 4 мы рассмотрели интерфейс т. н. независимой или виртуальнойфайловой системы, обеспечивающей унифицированный интерфейс работыс различными типами физических файловых систем (например,илиs5fs), имеющих разные внутренние структуры и возможности. При этомподходе используется унифицированный формат метаданных активныхфайлов, которые хранятся в памяти (в in!core — таблице индексных деск!рипторов) и не зависят от конкретной реализации файловой системы.
Этиобъекты получили название виртуальных индексных дескрипторов илиvnode. Для каждого vnode определен набор абстрактных операций, кото!рые реализованы функциями реальных файловых систем. Например, vnodeфайла, расположенного в файловой системе s5fs, адресует вектор операций(или коммутатор файловых систем, FSS)содержащий конкрет!ные функции этой файловой системы —s5f s_openили.Этот подход, используемый в большинстве современных версий U N I X ,требует соответствующей архитектуры файлового интерфейса к драйверамустройств.