Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Олифер. Сетевые операционные системы.docx
Скачиваний:
3
Добавлен:
01.07.2025
Размер:
16.5 Mб
Скачать

Байт-ориентированные драйверы

Драйвер байт-ориентированного устройства состоит из следующих стандартных функций:

  • open — открывает устройство;

  • close — закрывает устройство;

  • read — читает данные из устройства;

  • write — записывает данные в устройство;

  • ioctl — управляет вводом-выводом;

  • poll — опрашивает устройство для выяснения, не произошло ли некоторое событие;

  • mmap, segmap — используются при отображении файла-устройства на виртуальную память.

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

Функция управления iосtl обеспечивает интерфейс к драйверу устройства, который выходит за рамки возможностей функций read и write. С помощью функции ioctl обычно устанавливается режим работы устройства, например задаются параметры COM-порта, такие как разрядность символов, количество стоповых битов, режим проверки четности и т. п.

Функции, используемые для отображения специального файла на виртуальную память, рассматриваются далее в разделе «Отображаемые на память файлы».

Если драйвер не поддерживает какую-либо из стандартных функций, то в таблицу bdevsw помещается указатель на специальную функцию nodev ядра. Например, драйвер принтера может не поддерживать функцию read. Функция nodev при вызове просто возвращает код ошибки ENODEV и на этом завершает свою работу. Для тех случаев, когда функция должна обязательно поддерживаться (примерами таких функций являются функции open и close), но она не выполняет никакой полезной работы, в операционной системе имеется функция nulldev, которая похожа на функцию nodev, но в отличие от нее возвращает значение 0, во всех системных вызовах означающее успешное завершение.

Рисунок 8.5 иллюстрирует взаимодействие функции записи драйвера байт-ориентированного устройства с обработчиком прерываний.

Функция записи осуществляет передачу данных из пользовательского буфера процесса, выдавшего запрос на обмен, в системный буфер, организованный в виде очереди байтов. Передача байтов идет до тех пор, пока системный буфер не заполнится до некоторого заранее определенного в драйвере уровня. Затем функция записи драйвера приостанавливается, выполнив системную функцию sleep, переводящую процесс, в рамках которого работает функция записи write, в состояние ожидания.

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

Рис. 8.5. Взаимодействие секции записи драйвера с модулем обработки прерывания.

Отображаемые на память файлы

Отображение файла на виртуальное адресное пространство процесса позволяет упростить программирование. Благодаря такому отображению с данными файла можно работать с помощью адресных указателей как с обычными переменными программы без использования громоздких файловых функций read, write и lseek. При отображении файлов на память широко используются механизмы подсистемы виртуальной памяти.

Действительно, подсистема виртуальной памяти связывает некоторый сегмент виртуального адресного пространства процесса с некоторым файлом или частью файла. Так, кодовый сегмент и сегмент инициализированных данных всегда связаны с файлом, в котором находится исполняемый модуль приложения. Сегменты стека и неинициализированных данных связаны с выделенными им областями системного страничного файла. При обращении кода приложения к некоторой переменной сегмента данных подсистема виртуальной памяти читает с диска данные из блоков, соответствующих странице виртуального ад­ресного пространства, содержащей эту переменную, и переносит данные в опе­ративную память, если на момент обращения эта страница там отсутствовала. В сущности, подсистема виртуальной памяти выполняет обмен данными с файлом по запросу, только этот запрос формулируется косвенно, а не путем явного описания области файла, с которой нужно выполнить обмен данными, как это происходит при выполнении операции read или write.

Механизм отображения файлов на память использует возможности системы виртуальной памяти для файлов, содержащих произвольные данные (а не только данные исполняемого модуля программы).

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

В Unix SystemV Release 4 отображение файла на память выполняется с помощью системного вызова mmap. Этот вызов имеет следующие аргументы:

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

  • len — размер сегмента;

  • prot — атрибуты защиты сегмента (только чтение, только запись и т. п.);

  • flags — флаги, определяющие режим использования сегмента: разделяемый (shared) или закрытый (private);

  • fd дескриптор открытого файла, данные которого отображаются;

  • offset смещение в файле, с которого начинаются отображаемые данные.

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

Пусть файл /data/basel.dat состоит из записей фиксированной длины, каждая из которых включает переменную, отражающую значение баланса предприятия (переменная balance) и признак типа баланса (переменная mode):

В некоторых операционных системах, например в версиях Unix, основанных на коде System V Release 4, можно отобразить на память не только обычные файлы, но и некоторые другие типы файлов, например специальные файлы. Отображение на память блок-ориентированного специального файла, то есть раздела или части раздела диска, позволяет легко получить доступ к любой об­ласти диска, рассматриваемого как последовательность байтов. При отображе­нии байт-ориентированных устройств на оперативную память отображается внутренняя память контроллера устройства, например память сетевого адаптера Ethernet.

В общем случае не все типы файлов можно отобразить на память, например, в Unix SVR4 нельзя отображать каталоги и символьные связи.

Отображение файла эффективней непосредственного использования файловых операций в нескольких отношениях.

  • Исключаются операции копирования данных из системной памяти в пользовательскую. При выполнении файловых операций read и write данные сначала попадают в системный буфер, а затем копируются в пользователь­скую память, а при отображении они сразу копируются в страницы пользовательской памяти.

  • Программист применяет более удобный интерфейс с адресными указателями.

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

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

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

Механизм отображения файлов на память используется большинством современных операционных систем.