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

Типичные точки входа в драйвер устройства.

У драйверов есть уникальная часть имени (приставка – здесь xx) и обязательная часть.

xxopen()

xxclose()

xxread()

xxwrite()

xxioctl()

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

xxpoll()

xxhalt()

xxstrategy()

xxxize() – используется дисковыми устройствами для определения размеров дисковых разделов.

xxgetmap() – отображает буферную память устройство в адресное пространство процесса. Используется символьными устройствами, отображаемыми в память при применении системного вызова mmap()

xxmmap() – применяется только если применяется getmap().

Файлы устройств.

Пара <major, minor> позволяет адресовать устройство ядром. Для пользователя это неудобно. Пришлось бы запоминать пары номеров для каждого устройства и указывать их в своих приложениях. Поэтому в ОС Юникс пространство имен устройств в виде файлов. Для чего вводится понятие device file. По соглашению Юникс все файлы устройств хранятся в каталоге /dev или его подкаталогах. Более того, при работе с устройством пользователь использует обычные команды для работы с файлами, но, как говорят, изнутри (inside) файл устройства существенно отличается от обычного файла. Прежде всего такой файл не имеет блоков данных, которые хранятся на диске, но имеет индексный дескриптор в той файловой системе, в которой он расположен (как правило, в корневой файловой системе).

В системе устройство идентифицируется индексным узлом.

di_mode – тип, блочное или символьное (IFBLK/IFCHR)

di_nlinks

di_uid

di_gid

di_size

di_addz

di_gen

.

. время

.

di_rdev – хранятся старшие и младшие номера представляемых устройств. В результате путь к файлу преобразуется в пару номеров.

Файлы устройств могут быть объявлены только суперпользователем с помощью следующего системного вызова

mknode(path, mode, dev);

dev - <major, minor>; path – полное имя специального файла

Унификация пространства имен имеет следующие преимущества:

  1. Для устройств ввода-вывода используются те же системные вызовы, что и для файлов.

  2. Расширение защиты файлов и устройств, поскольку для каждого файла устанавливаются права доступа, то и для устройств они могут быть установлены. Права доступа для устройств устанавливаются и изменяются аналогично правам доступа к файлу.

Буферизация ввода-вывода.

Предположим, что приложению надо считать из файла блок данных размером 512 байт. Это блок данных должен быть помещен в виртуальное адресное пространство процесса. Это непрерывная последовательность адресов размером 512 байт. Приложение выполняет команду fread(&block_adress, sizeof, blocks_number, file_desc).

Имеется три проблемы:

  1. В ожидании завершения ввода процесс будет блокирован.

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

  3. Возможность взаимоблокировки. Процесс выполнил команду read и заблокирован. Соответственно, страницы процесса выгружаются в область свопинга до начала операции ввода-вывода. Затем процесс находится в состоянии блокировки до завершения операции ввода-вывода. Драйвер, который управляет запрошенным устройством, так же ждет по завершении операции ввода-вывода, когда процесс будет загружен в основную память, чтобы загрузить данные в нужные ему адреса. Здесь возможна взаимоблокировка (тупик). Взаимодействующие процессы в системе, каждый из которых ждет событие, которое может произойти в контексте другого процесса. Избежать взаимоблокировки можно заблокировав необходимые для ввода данных страницы в оперативной памяти.

Возникают большие накладные расходы в системе. Уменьшить связанные с вводом-выводом накладные расходы можно за счет буферизации.

Например, в момент запроса ввода-вывода процессу назначается буфер в системной области памяти. В результате, при считывании блока данных из устройства, эти данные сначала помещаются в буфер. Затем считанный блок данных из буфера копируется или отображается (mapping) (знать, в чем разница между копированием и отображением) в адресное пространство процесса. Если процессу требуется считывать достаточно большое количество информации, то после инициализации копирования или мэппинга выполняется запрос нового блока, выполняется буферизация и так далее. Для сокращения времени данный процесс может быть реализован следующим образом: когда пользовательский процесс обрабатывает один блок данных, следующий блок данных может считываться, то есть можно совместить по времени обработку и считывание разных блоков. В этом случае необходима так называемая двойная буферизация.

Дисковое устройство работает с пулом буферов. В системе выполняется тотальная буферизация ввода-вывода.

Потом они меняются ролями. Это все называется управлением буферами.

Схемы простой буферизации.

Простая буферизация. Связана с временными задрежками. Метод применим, когда объем данных относительно небольшой.

Альтернативой простой буферизации является обменная буферизация.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]