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


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

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

Определение специализированного дескриптора драйвера

Во-первых, драйверу устройства нужен специализированный дескриптор foo типа foo dev t, который содержит данные, необходимые для управления аппаратным устройством. Дескриптор любого устройства будет хранить информацию, такую как порты ввода/вывода, используемые для программиро
вания устройства, IRQ-линия для прерываний, возбуждаемых устройством, внутреннее состояние устройства и т. д. Дескриптор также должен включать в себя несколько полей, нужных подсистеме блочного ввода/вывода:
struct foo_dev_t {
[.]
spinlock_t lock; struct gendisk gd;
[.]
} foo;
Поле lock является спин-блокировкой, используемой для защиты полей дескриптора foo. Ее адрес часто передается вспомогательным функциям ядра, которые таким образом могут защитить структуры подсистемы блочного ввода/вывода, специфичные для данного драйвера. Поле gd является указателем на дескриптор gendisk, представляющий все блочное устройство (диск), управляемое этим драйвером.
Резервирование старшего номера
Драйвер устройства должен зарезервировать старший номер для своих целей. По традиции ЭТО делается С ПОМОЩЬЮ функции registerjolkdev :
err = register_blkdev(FOO_MAJOR, "foo"); if (err) goto error_major_is_busy;
Эта функция во многом похожа на функцию register chrdev : она резервирует старший номер foo major и ассоциирует с ним имя foo. Обратите внимание, что здесь нет способа выделить поддиапазон МЛадШИХ НОМерОВ, ПОСКОЛЬКУ Отсутствует анаЛОГ фунКЦИИ register_ chrdev region . Кроме того, между зарезервированным старшим номером и структурами данных драйвера не устанавливается никакой связи. Единственный видимый результат работы registerjolkdevо — это помещение нового элемента в список зарегистрированных старших номеров в специальном файле /proc/devices.

Предыдущая страница | 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. Этот дескриптор содержит всю информацию, необходимую ядру для работы с блоком, так что перед обработкой блока ядро обязательно проверяет голову...