• Топас

    топас

    www.topas-eko.ru





Linux Kernel (Ядро линукса) (часть 2)


Драйверы устройств

Драйвер устройства — это набор процедур ядра, который заставляет аппаратное устройство реагировать на программный интерфейс, определяемый каноническим набором функций VFS (open, read, lseek, iocti и т. д.), которые используются для управления устройством. Фактическая реализация возлагается на драйвер. Поскольку разные устройства имеют разные контроллеры ввода/вывода и, следовательно, разные наборы команд и разную информацию о состоянии, у большинства устройств ввода/вывода есть собственные драйверы.

Существует много типов драйверов устройств. В основном, они различаются уровнем поддержки, предлагаемой приложениям в режиме пользователя, а
также стратегиями буферизации данных, собираемых с аппаратных устройств. Поскольку эти особенности драйверов сильно зависят от их внутренней структуры, мы обсудим их в разд. ”Прямой доступ к памяти (DMA)" и "Стратегии буферизации для символьных устройств”.

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

Регистрация драйвера устройства

Нам известно, что каждый системный вызов для файла устройства транслируется ядром в вызов подходящей функции соответствующего драйвера. Чтобы это произошло, драйвер устройства должен зарегистрировать себя. Другими словами, регистрация драйвера означает выделение нового дескриптора device driver, занесение его в структуры модели драйвера устройства и связывание его с соответствующим файлом (или файлами) устройства. Обращения к файлам устройств, чьи драйверы не были предварительно зарегистрированы, завершаются с кодом ошибки -enodev.

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

Рассмотрим в качестве примера типичное PCI-устройство. Чтобы правильно управлять им, его драйвер должен выделить дескриптор типа pci driver, который используется PCI-слоем ядра для управления устройством. После инициализации некоторых полей этого дескриптора драйвер вызывает функцию pci register driver о. Фактически, дескриптор pci driver включает в себя встроенный дескриптор device driver, а фуНКЦИЯ pci register function просто инициализирует поля встроенного дескриптора драйвера и вызывает функцию driver register , чтобы занести драйвер в структуры модели драйвера устройства.

Когда драйвер устройства проходит регистрацию, ядро ищет не поддерживаемые аппаратные устройства, которыми, вероятно, мог бы управлять этот драйвер. Для этого оно использует метод match соответствующего дескриптора типа ШИНЫ bus type И метод probe объекта device driver. ЕСЛИ устройство, которым может управлять драйвер, обнаружено, ядро выделяет объект device И вызывает фуНКЦИЮ device register , Чтобы занести ЭТО устройство в модель драйвера устройства.

Предыдущая страница | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 | Следующая страница




Возможно, Вас также заинтересует:

ОС Knoppix - это Linux без проблем

ВведениеЕсли вы цените свое время, умеете считать деньги и знаете стоимость информации, то эта книга для вас. А так как к книге прилагается компакт- диск с готовой к работе операционной системой Knoppix Live CD, то лишь достаточно вставить его в привод и перегрузить компьютер,...

Linux Kernel (Ядро линукса) (часть 1)

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

Linux Kernel (Ядро линукса) (часть 2)

Копирование при записи В системах Unix первых поколений создание процесса было реализовано довольно неуклюже: получив системный вызов fork о, ядро в буквальном смысле дублировало все адресное пространство родителя и присваивало копию процессу-потомку. Такая операция...

Linux Kernel (Ядро линукса) (часть 3)

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