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


Инициализация таблицы методов блочного устройства

Поле fops дескриптора gendisk инициализируется адресом специализированной таблицы методов блочного устройства. Вполне вероятно, что таблица foo ops драйвера устройства содержит функции, специфичные для этого драйвера. Например, если аппаратное устройство поддерживает съемные диски, то общий слой работы с блочными устройствами вполне может вызвать метод media changed для проверки, был ли вставлен новый диск с момента последней операции монтирования или открытия файла на этом устройстве. Проверка обычно производится путем отправки контроллеру нескольких низкоуровневых команд, и поэтому метод media changed всегда специфичен для драйвера.

Аналогичным образом, метод ioctl вызывается только тогда, когда общий слой работы с блочными устройствами не знает, как обрабатывать какую- либо команду ioctl. Например, этот метод обычно вызывается, когда системный вызов ioctl пытается определить геометрию диска, т. е. количество цилиндров, дорожек, секторов и головок. Реализация этого метода тоже специфична для драйвера.

Выделение и инициализация очереди запросов

В этот момент разработчик драйвера должен создать очередь запросов, которая будет хранить запросы, ожидающие обслуживания. Это легко сделать с помощью следующего кода:
foo.gd->rq = blk_init_queue(foo_strategy, &foo.lock); if (!foo.gd->rq) goto error_no_request_queue; blk_queue_hardsect_size(foo.gd->rd, foo_hard_sector_size); blk_queue_max_sectors(foo.gd->rd, foo_max_sectors); blk_queue_max_hw_segments(foo.gd->rd, foo_max_hw_segments); blk_queue_max_phys_segments(foo.gd->rd, foo_max_phys_segments);
Функция bik init queue выделяет дескриптор очереди запросов и инициализирует многие его поля значениями по умолчанию. Она принимает в качестве параметров адрес спин-блокировки дескриптора устройства (для поля foo. gd->rq->queue_iock) и адрес процедуры-стратега, входящей в состав драйвера (для поля foo.gd->rq->request_fn). Кроме того, функция bik init queue о инициализирует поле foo. gd->rq->eievator, заставляя драйвер использовать алгоритм по умолчанию для планирования ввода/вывода. Если драйверу понадобится другой лифт, он сможет впоследствии переопределить адрес в поле elevator.

Затем некоторые вспомогательные функции записывают в различные поля дескриптора очереди запросов значения, предложенные драйвером

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