Глава 16, Блочные драйверы |
Пока наше обсуждение ограничивалось символьными драйверами. Однако, в системах Linux существуют и другие типы драйверов и для нас настало время несколько расширить наши знания. Поэтому в этой главе рассматриваются блочные драйверы.
Блочный драйвер обеспечивает доступ к устройствам, которые передают доступные для произвольного выбора данные в блоках фиксированного размера - в первую очередь, это дисковые драйверы. Видение ядром Linux блочных устройств в корне отличается от символьных устройств; в результате чего блочные драйверы имеют особый интерфейс и свои особые проблемы.
Эффективные блочные драйверы имеют решающее значение для производительности - и не только для явного чтения и записи в пользовательских приложениях. Современные системы с виртуальной памятью работают передвигая (будем надеяться) ненужные данные во вторичное хранилище, которое является обычно дисковым накопителем. Блочные драйверы являются связующим звеном между основной памятью и вторичным хранилищем; таким образом, они могут рассматриваться как представляющие часть подсистемы виртуальной памяти. Хотя возможно написать блочный драйвер, не зная о struct page и других важных концепций памяти, тот, кому требуется написать высокопроизводительный драйвер, должен опираться на материал, охваченный в Главе 15.
Большая часть разработки блочного уровня сосредоточена на производительности. Многие символьные устройства могут работать ниже своей максимальной скорости и производительность системы в целом не страдает. Однако, система не может работать хорошо, если её блочная подсистема ввода/вывода не является хорошо отлаженной. Интерфейс блочного драйвера в Linux позволяет получить максимальную отдачу от блочного устройства, но неизбежно навязывает уровень сложности, с которой вы должны иметь дело. К счастью, в версии 2.6 блочный интерфейса значительно улучшен по сравнению с тем, что было в старых ядрах.
В этой главе, как и следовало ожидать, в центре внимания пример драйвера, который реализует блочно-ориентированное, базирующееся в памяти устройство. Это, по существу, электронный диск. Ядро уже содержит гораздо превосходящую реализацию электронного диска, но наш драйвер (названный sbull) позволяет нам продемонстрировать создание блочного драйвера при сведении к минимуму необходимой сложности.
Прежде чем углубляться в подробности, давайте точно определим несколько терминов. Блок представляет собой блок данных фиксированного размера, размер которого определяется ядром. Блоки часто 4096 байт, но это значение может изменяться в зависимости от архитектуры и требования используемой файловой системы. Сектор, напротив, представляет собой небольшой блок, размер которого обычно определяется базовым оборудованием. Ядро предполагает иметь дело с устройствами, которые реализуют секторы по 512 байт. Если ваше устройство использует другой размер, ядра адаптируется и избегает генерации запросов ввода/вывода, которые оборудование обработать не может. Однако, следует помнить, что всякий раз, когда ядро предоставляет вам номер сектора, оно работает в мире секторов по 512 байт. Если вы используете другой размер аппаратного сектора, вы должны номер сектора ядра соответственно отмасштабировать. В драйвере sbull мы увидим, как это делается.
Комментариев нет:
Отправить комментарий
Примечание. Отправлять комментарии могут только участники этого блога.