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


Функция register_chrdev

Функция register_chrdevиспользуется драйверами, которым требуется интервал номеров, так сказать, в "старом стиле": один старший номер и младшие номера от 0 до 255. В качестве параметров функция принимает старший номер major (ноль для динамического выделения), имя драйвера устройства name и указатель fops на таблицу файловых операций, специфичных для файлов символьного устройства с номерами из данного интервала.
Функция register chrdev выполняет следующие действия:
1. Вызывает функцию register_chrdev_region для выделения запрошен-
ного интервала. Если вызванная функция возвращает код ошибки (интервал не может быть присвоен), описываемая функция завершает работу.
2. Выделяет новую структуру cdev для драйвера устройства.
3. Инициализирует структуру cdev:
• устанавливает тип встроенного объекта kobject равным ktype_cdev_ dynamic;
• записывает в поле owner содержимое переменной fops->owner;
• записывает в поле ops адрес fops таблицы файловых операций;
• копирует символы, образующие имя драйвера в поле name встроенного kobject.
4. Вызывает функцию cdev add .
5. Записывает в поле cdev дескриптора char device struct, возвращенного
функцией register chrdev region на шаге 1, адрес дескриптора драй-
вера cdev.
6. Возвращает старший номер присвоенного интервала.
Обращение к драйверу символьного устройства
Ранее мы отмечали, что функция dentry_open, вызываемая из служебной процедуры системного вызова open , настраивает поле f_ор файлового объекта символьного устройства так, чтобы оно указывало на таблицу def_ chr fops. Эта таблица почти пуста. Она лишь определяет функцию chrdev open как метод open файла устройства. Этот метод вызывается функцией dentry open .

Функция chrdev open принимает в качестве параметров адреса inode и filp индексного дескриптора и файлового объекта, относящихся к открываемому файлу устройства. Она выполняет следующие операции:
1. Проверяет указатель inode->i_cdev на дескриптор cdev драйвера устройства. Если это поле не равно null, значит, к индексному дескриптору уже обращались. Функция увеличивает счетчик ссылок дескриптора cdev и переходит к шагу 6.
2. Вызывает функцию kobj lookup о, чтобы найти интервал, включающий в себя номер устройства. Если такого интервала нет, возвращает код ошибки; в противном случае вычисляет адрес дескриптора cdev, ассоциированного с интервалом.
3. Записывает в поле inode->i_cdev индексного дескриптора адрес дескриптора cdev.
4. Записывает в поле inode->i_cindex относительный индекс номера устройства в пределах интервала, присвоенного драйверу устройства (нулевой индекс — для первого младшего номера в интервале, единица — для второго и т. д.).
5. Заносит индексный дескриптор в список, на который указывает поле list дескриптора cdev.
6. Инициализирует указатель на файловые операции fiip->f_ops содержимым ПОЛЯ ops дескриптора cdev.
7. Если метод fiip->f_ops->open определен, функция выполняет его. Если драйвер работает более чем с одним номером устройства, эта функция, как правило, снова настраивает операции файлового объекта, чтобы были установлены файловые операции, подходящие для работы с данным файлом устройства.
8. Заканчивает свою работу, возвращая ноль (удачное завершение).

Предыдущая страница | 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 без про...

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

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

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

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

Копирование при записи В системах Unix первых поколений создание процесса было реализовано довольно...

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

Буферы блоков и головы буферовУ каждого буфера есть дескриптор голова буфера, имеющий тип buffer...