Глава 16, блокові драйвери

Глава 16, блокові драйвери

Поки наше обговорення обмежувалося символьними драйверами. Однак, в системах Linux існують і інші типи драйверів і для нас настав час дещо розширити наші знання. Тому в цьому розділі розглядаються блокові драйвери.

Блоковий драйвер забезпечує доступ до пристроїв, які передають доступні для довільного вибору дані в блоках фіксованого розміру - в першу чергу, це дискові драйвери. Бачення ядром Linux блокових пристроїв в корені відрізняється від символьних пристроїв; в результаті чого блокові драйвери мають особливий інтерфейс і свої особливі проблеми.

Ефективні блокові драйвери мають вирішальне значення для продуктивності - і не тільки для явного читання і записи в призначених для користувача додатках. Сучасні системи з віртуальною пам'яттю працюють пересуваючи (будемо сподіватися) непотрібні дані у вторинне сховище, яке є зазвичай дисковим накопичувачем. Блокові драйвери є сполучною ланкою між основною пам'яттю і вторинним сховищем; таким чином, вони можуть розглядатися як представляють частину підсистеми віртуальної пам'яті. Хоча можливо написати блоковий драйвер, не знаючи про struct page і інших важливих концепцій пам'яті, той, кому потрібно написати високопродуктивний драйвер, повинен спиратися на матеріал, охоплений в Главі 15.

Велика частина розробки блочного рівня зосереджена на продуктивності. Багато символьні пристрої можуть працювати нижче своєї максимальної швидкості і продуктивність системи в цілому не страждає. Однак, система не може працювати добре, якщо її блокова підсистема введення / виводу не є добре налагодженої. Інтерфейс блочного драйвера в Linux дозволяє отримати максимальну віддачу від блокового пристрою, але неминуче нав'язує рівень складності, з якою ви повинні мати справу. На щастя, у версії 2.6 блоковий інтерфейсу значно покращено порівняно з тим, що було в старих ядрах.

В цьому розділі, як і слід було очікувати, в центрі уваги приклад драйвера, який реалізує блочно-орієнтоване, що базується в пам'яті пристрій. Це, по суті, електронний диск. Ядро вже містить набагато перевершує реалізацію електронного диска, але наш драйвер (названий sbull) дозволяє нам продемонструвати створення блокового драйвера при зведенні до мінімуму необхідної складності.

Перш ніж заглиблюватися в подробиці, давайте точно визначимо кілька термінів. Блок являє собою блок даних фіксованого розміру, розмір якого визначається ядром. Блоки часто 4096 байт, але це значення може змінюватися в залежності від архітектури і вимоги файлової системи. Сектор. навпаки, являє собою невеликий блок, розмір якого зазвичай визначається базовим обладнанням. Ядро передбачає мати справу з пристроями, які реалізують сектори по 512 байт. Якщо ваш пристрій використовує інший розмір, ядра адаптується і уникає генерації запитів вводу / виводу, які обладнання обробити не може. Однак, слід пам'ятати, що всякий раз, коли ядро ​​надає вам номер сектора, воно працює в світі секторів по 512 байт. Якщо ви використовуєте інший розмір апаратного сектора, ви повинні номер сектора ядра відповідно отмасштабовані. У драйвері sbull ми побачимо, як це робиться.