А. Робачевский - Операционная система UNIX (1114671), страница 62
Текст из файла (страница 62)
Неправильное число ссылок в inode (недостаток или избыток ссы!лающихся записей в каталогах).5. Несовпадение между размером файла и суммарным размером адресуе!мых inode блоков.6. Недопустимые адресуемые блоки (например, расположенные за преде!лами файловой системы).7. "Потерянные" файлы (правильные inode, на которые не ссылаются за!писи каталогов).8.
Недопустимые или неразмещенные номера inode в записях каталогов.Эти ошибки схематически показаны на рис.Рис. 4.16. Возможные ошибки файловой системыwww.books-shop.comЗаключениеЕсли нарушение все же произошло, на помощь может прийти утилитапроизводящая исправление файловой системы.
Запуск этой ути!литы может производиться автоматически каждый раз при запуске систе!мы, или администратором, с помощью команды:fsck [options]где filesystem — специальный файл устройства, на котором находитсяфайловая система.Проверка и исправление должны производиться только на размонтиро!ванной файловой системе. Это связано с необходимостью исключениясинхронизации таблиц в памяти (ошибочных) с их дисковыми эквивален!тами (исправленными).
Исключение составляет корневая файловая систе!ма, которая не может быть размонтирована. Для ее исправления необхо!димо использовать опциюобеспечивающую немедленный перезапусксистемы после проведения проверки.ЗаключениеВ этой главе описана организация файловой подсистемы U N I X . Начавразговор с обсуждения архитектуры традиционных файловых системUNIX, мы остановились на анализе т. н. виртуальной файловой системы,обеспечивающей единый интерфейс доступа к различным типам физиче!ских файловых систем.Мы также рассмотрели, каким образом происходит доступ процесса кданным, хранящимся в файлах, вплотную подошли к разговору о подсис!ввода/вывода, который и продолжим вглаве.www.books-shop.comФактическая архитектура ввода/вывода скрыта от прикладного процессанесколькими интерфейсами.
Один из них — интерфейс файловой системыбыл рассмотрен в предыдущей главе. Взаимодействие с удаленными ресур!сами обеспечивается сетевыми интерфейсами сокетов или ТЫ (TransportLayer Interface), которые описываются в главе 6. Однако возможны ситуа!ции, когда прикладному процессу требуется взаимодействие с периферий!ными устройствами на более низком уровне. Хотя в этом случае роль фай!ловой подсистемы не столь велика, как при работе с обычными файлами,все равно ядро предоставляет процессу унифицированную схему, скры!вающую истинную архитектуру того или иного устройства.В конечном итоге работа всех этих интерфейсов, как высокого уровня,(файловая система), так и более низкого (взаимодействие с физическимустройством), обеспечивается подсистемой ввода/вывода ядра операцион!ной системы.В данной главе мы ознакомимся с архитектурой этой подсистемы, основ!ным компонентом которой являются драйверы — модули ядра, обеспечи!вающие непосредственную работу с периферийными устройствами.
По!скольку характеристики периферийных устройств значительно различают!ся, то UNIX использует два основных типа драйверов — символьные иблочные. Как следует из названия, драйверы первого типа обеспечиваютобмен сравнительно небольшими объемами данных с устройством, чтоимеет место при работе, например, с терминалами или принтерами. Драй!веры второго типа производят передачу данных блоками, что характернодля дисковых носителей данных.
Эти типы драйверов входят в традицион!ную подсистему ввода/вывода и присутствуют во всех версиях UNIX.Во второй части главы мы подробно остановимся на архитектуре драйверовподсистемы STREAMS, которая является неотъемлемой частью ядра в вер!сиях UNIX System V. Эти драйверы представляют собой отдельный тип, об!ладающий такими ценными возможностями, как буферизация и управлениепотоком данных.
К подсистеме STREAMS мы также вернемся в следующейглаве при обсуждении архитектуры сетевого доступа в UNIX System V.www.books-shop.comустройств323Драйверы устройствДрайверы устройств обеспечивают интерфейс между ядром U N I X и аппа!ратной частью компьютера.
Благодаря этому от остальной части ядра скры!ты архитектурные особенности компьютера, что значительно упрощает пе!ренос системы и поддержку работы различных периферийных устройств.В UNIX существует большое количество драйверов. Часть из них обеспечи!вает доступ к физическим устройствам, например, жесткому диску, принте!ру или терминалу, другие предоставляютуслуги.Примером последних могут служить драйверыдля работы с вир!туальной памятью ядрапредставляющий "нулевое" устройство.В процессе запуска системы ядро вызывает соответствующие процедуры ини!циализации установленных драйверов.
Во многих версиях UNIX эти про!цедуры выводят на консоль сообщение о том, что драйвер найден, и инициа!лизация прошла успешно, а также параметры драйвера и устройства.Типы драйверовДрайверы различаются по возможностям, которые они предоставляют, атакже по тому, каким образом обеспечивается к ним доступ иМожно рассматривать три основные типа драйверов:СимвольныедрайверыЭтот тип драйверов обеспечивает работу с устройствами спобайтовым доступом и обменом данными. К таким уст!ройствам можно отнести модемы, терминалы, принтеры,манипуляторы мышь и т.
д.Доступ к таким драйверам не включает использование бу!ферного кэша, таким образом ввод и вывод как правило небуферизуется. При необходимости буферизации для сим!вольных драйверов обычно используется подход, основан!ный на структурах данных, называемыхБлочныедрайверыЭтот тип драйверов позволяет производить обмен даннымис устройством фиксированными порциями (блоками).
На!пример, для жесткого диска данные можно адресовать и,соответственно, читать только секторами, размер которыхсоставляет несколько сотен байтов. Для блочных драйверовобычно используется буферный кэш, который и являетсяинтерфейсом между файловой системой и устройством.Хотя операции чтения и записи для процесса допускаютобмен данными, размер которых меньше размера блока, насистемном уровне это все равно приводит к считываниювсего блока, изменению части его данных и записи изме!ненного блока обратно на диск.www.books-shop.comГлава 5.324Драйверы низкогоуровня (raw drivers)Этот тип интерфейса блочных драйверов позволяетпроизводить обмен данными с блочными устройст!вами, минуя буферный кэш.
Это, в частности, озна!чает, что устройство может быть адресовано элемен!тами, размер которых не совпадает с размером блока.Обмен данными происходит независимо от файловойподсистемы и буферного кэша, что позволяет ядрупроизводить передачу непосредственно между поль!зовательским процессом и устройством, без допол!нительного копирования.На рис. 5.1 приведена упрощенная схема взаимодействия драйверов уст!ройств с другими подсистемами операционной системы UNIX.Рис.Драйверы устройств UNIXНе все драйверы служат для работы с физическими устройствами, такимикак сетевой адаптер, последовательный порт или монитор.
Часть драйве!www.books-shop.comДрайверы устройств326ров служат для предоставления различных услуг ядра прикладным процес!сам и не имеют непосредственного отношения к аппаратной части ком!пьютера. Такие драйверы называются программными или драйверами псев!доустройств. Можно привести несколько примеров псевдоустройств и со!ответствующих им программных драйверов:/dev/zeroОбеспечивает доступ к виртуальной памяти ядра. Зная виртуальныеадреса внутренних структур ядра, процесс может считывать храня%щуюся в них информацию. С помощью этого драйвера может, на%пример, быть реализована версия утилиты ps(1), выводящей ин%формацию о состоянии процессов в системе.Обеспечивает доступ к разделу исполняемого файла ядра, содержа%щего таблицу символов.
Совместно с драйвером /dev/kmem обеспе%чивает удобный интерфейс для анализа внутренних структур ядра.Обеспечивает доступ к физической памяти компьютера.Является "нулевым" устройством. При записи в это устройство дан%ные просто удаляются, а при чтении процессу возвращается 0 бай%тов. Примеры использования этого устройства рассматривались вглаве когда с помощью /dev/null мы подавляли вывод сообщенийоб ошибках.Обеспечивает заполнение нулями указанного буфера. Этот драйверчасто используется для инициализации области памяти.Базовая архитектура драйверовДрайвер устройства адресуется старшим номером (major number) устройства.Напомним, что среди атрибутов специальных файлов устройств, которыеобеспечивают пользовательский интерфейс доступа к периферии компьюте!ра, это число присутствует наряду с другим, также имеющим отношение кдрайверу, — младшим номером (minor number).
Младший номер интерпрети!руется самим драйвером (например, для клонов, оно задает старшее числоустройства, которое требуется "размножить"). Другим примером использова!ния младших номеров может служить драйвер диска. В то время как доступк любому из разделов диска осуществляется одним и тем же драйвером и,соответственно, через один и тот же старший номер, младший номер указы!вает, к какому именно разделу требуется обеспечить доступ.Доступ к драйверу осуществляется ядром через специальную структуруданных (коммутаторкаждый элемент которой содержит ука!затели на соответствующие функции драйвера — точки входа. Старшеечисло, по существу, является указателем на элемент коммутатора уст!ройств, обеспечивая, тем самым, ядру возможность вызова необходимойфункции указанного драйвера.
Таким образом, коммутатор устройств оп!ределяет базовый интерфейс драйвера устройств.www.books-shop.com326Глава 5.Этот интерфейс различен для блочных и символьных устройств. Ядро со!держит коммутаторы устройств двух типов:для блочных идля символьных устройств. Ядро размещает отдельный массив для каждоготипа коммутатора, и любой драйвер устройства имеет запись в соответст!вующем массиве. Если драйвер обеспечивает как блочный, так и символь!ный интерфейсы, его точки входа будут представлены в обоих массивах.Типичное описание этих двух массивов имеет следующий вид (назначениеразличных точек входа мы рассмотрим далее в этом разделе):structintint (*d_close)intintint{}structintintintintintintintstruct{()}Ядро вызывает функцию openтребуемого драйвера следующим образом:передавая ей в качестве одногосодержащую старший ислужит для извлечения старшегоэтому драйвер имеет возможностьбыла вызвана функция openииз параметров переменную dev (типамладший номера.
Макросномера из переменной dev. Благодаряопределить, с каким младшим номеромвыполнить соответствующие действия.Коммутатор определяет абстрактный интерфейс драйвера устройства. Каж!дый драйвер обеспечивает соответствующую реализацию функций этогоинтерфейса.