Инициализация специализированного дескриптора
Все поля дескриптора foo должны быть корректно проинициализированы прежде, чем драйвер станет к ним обращаться. Для инициализации полей, имеющих отношение к подсистеме блочного ввода/вывода, драйвер должен выполнить следующий код:
spin_lock_init(&foo.lock);
foo.gd = alloc_disk(16);
if (!foo.gd) goto error_no_gendisk;
Драйвер инициализирует спин-блокировку, затем выделяет дескриптор диска. структура gendisk является критичной для работы подсистемы блочного ввода/вывода, поскольку она ссылается на множество других структур с данными. Функция aiioc diskO выделяет также массив для хранения дескрипторов разделов диска. В качестве аргумента она принимает количество элементов hd struct в этом массиве. Если оно равно 16, драйвер может поддерживать диски, содержащие до 15 разделов (нулевой раздел не используется).
Инициализация дескриптора gendisk
Затем драйвер инициализирует некоторые поля дескриптора gendisk:
foo.gd->private_data = &foo; foo.gd->major = FOO_MAJOR; foo.gd->first_minor = 0; foo.gd->minors = 16;
set_capacity(foo.gd, foo_disk_capacity_in_sectors); strcpy(foo.gd->disk_name, "foo"); foo.gd->fops = &foo_ops;
Адрес дескриптора foo сохраняется В поле private_data структуры gendisk, чтобы низкоуровневые функции драйвера, вызванные подсистемой блочного ввода/вывода в качестве методов, могли быстро найти дескриптор драйвера; это повышает производительность, если драйвер управляет несколькими дисками одновременно. Функция set capacityO инициализирует поле capacity емкостью диска, измеряемой в количестве 512-байтовых секторов. Это значение, по всей вероятности, определяется зондированием аппаратной части и опросом параметров диска.
Предыдущая страница | 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 | Следующая страница