
- •Лекция 1. 7.02.2014
- •Монтирование файловой системы.
- •Лекция 2. 10.02.2014
- •Лекция 3. 17.02.2014
- •Открытые файлы.
- •Лекция 4. 24.02.2014
- •Лекция 5. 3.03.2014 Файлы.
- •Лекция 6. 17.03.2014
- •Организация виртуальной файловой системы (vfs)
- •Регистрация и дерегистрация фс
- •Функции для работы с элементами фс proc.
- •Лекция 7. 24.03.2014
- •Файловая система specfs.
- •Терминалы.
- •Терминальный ввод-вывод.
- •Лекция 8. 31.03.2014
- •Типы флагов структуры termios.
- •Принятые соглашения и стандарты.
- •Простые способы открытия псевдотерминалов.
- •Лекция 9. 7.04.2014
- •Лекция 10. 14.04.2014
- •Реализация доступа к устройствам.
- •Структура контроллера внешнего устройства.
- •Южный и северный мосты.
- •Последовательные и параллельные интерфейсы.
- •Лекция 11. 21.04.2014
- •Управление вводом-выводом.
- •Прерывания.
- •Лекция 12. 28.04.2014 Контроллер прерывания.
- •Лекции 13-14. 5.05.2014, 12.05.2014
- •Проблемы прямого доступа к памяти.
- •Управление устройствами.
- •Многослойная модель системы ввода-вывода.
- •Пространство имен устройств.
- •Доступ к драйверу символьного устройства.
- •Доступ к драйверу блочного устройства.
- •Дополнительная информация о драйверах.
- •Лекция 15. 19.05.2014
- •Типичные точки входа в драйвер устройства.
- •Файлы устройств.
- •Буферизация ввода-вывода.
- •Схемы обменной буферизации
- •Обслуживание прерываний.
- •Лекция 16. 26.05.14
- •Лекция 17. 02.06.14
Типичные точки входа в драйвер устройства.
У драйверов есть уникальная часть имени (приставка – здесь 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 – полное имя специального файла
Унификация пространства имен имеет следующие преимущества:
Для устройств ввода-вывода используются те же системные вызовы, что и для файлов.
Расширение защиты файлов и устройств, поскольку для каждого файла устанавливаются права доступа, то и для устройств они могут быть установлены. Права доступа для устройств устанавливаются и изменяются аналогично правам доступа к файлу.
Буферизация ввода-вывода.
Предположим, что приложению надо считать из файла блок данных размером 512 байт. Это блок данных должен быть помещен в виртуальное адресное пространство процесса. Это непрерывная последовательность адресов размером 512 байт. Приложение выполняет команду fread(&block_adress, sizeof, blocks_number, file_desc).
Имеется три проблемы:
В ожидании завершения ввода процесс будет блокирован.
Очевидно, что для того, чтобы поместить данные с диска в виртуальное адресное пространство, должна быть задействована физическая память. Чтобы записать данные с диска по выделенным адресам, соответствующие страницы адресного пространства процесса должны находиться в физической памяти. Но процесс блокирован, значит система должна помечать эти страницы, как невыгружаемые. Проблема свопинга, то есть свопинг процесса оказывается невозможным.
Возможность взаимоблокировки. Процесс выполнил команду read и заблокирован. Соответственно, страницы процесса выгружаются в область свопинга до начала операции ввода-вывода. Затем процесс находится в состоянии блокировки до завершения операции ввода-вывода. Драйвер, который управляет запрошенным устройством, так же ждет по завершении операции ввода-вывода, когда процесс будет загружен в основную память, чтобы загрузить данные в нужные ему адреса. Здесь возможна взаимоблокировка (тупик). Взаимодействующие процессы в системе, каждый из которых ждет событие, которое может произойти в контексте другого процесса. Избежать взаимоблокировки можно заблокировав необходимые для ввода данных страницы в оперативной памяти.
Возникают большие накладные расходы в системе. Уменьшить связанные с вводом-выводом накладные расходы можно за счет буферизации.
Например, в момент запроса ввода-вывода процессу назначается буфер в системной области памяти. В результате, при считывании блока данных из устройства, эти данные сначала помещаются в буфер. Затем считанный блок данных из буфера копируется или отображается (mapping) (знать, в чем разница между копированием и отображением) в адресное пространство процесса. Если процессу требуется считывать достаточно большое количество информации, то после инициализации копирования или мэппинга выполняется запрос нового блока, выполняется буферизация и так далее. Для сокращения времени данный процесс может быть реализован следующим образом: когда пользовательский процесс обрабатывает один блок данных, следующий блок данных может считываться, то есть можно совместить по времени обработку и считывание разных блоков. В этом случае необходима так называемая двойная буферизация.
Дисковое устройство работает с пулом буферов. В системе выполняется тотальная буферизация ввода-вывода.
Потом они меняются ролями. Это все называется управлением буферами.
Схемы простой буферизации.
Простая буферизация. Связана с временными задрежками. Метод применим, когда объем данных относительно небольшой.
Альтернативой простой буферизации является обменная буферизация.