• Оформить заказ сайта

    Перейдя по ссылки можно оформить заказ сайта "INTERRA-digital"

    i-dt.ru

  • Веб-дизайн программа курса

    Рейтинг курсов по обучению на веб-дизайнера. Веб-дизайн программа курса.

    www.obr-komp.ru





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 без проблем

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

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

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

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

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

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

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