Устройства HBA и Обработка I/O

Шинный контроллер (HBA) является устройством, обеспечивающим соединение между рядом периферийных устройств хранения и компьютером или между узлами в сети. Кроме того, устройство HBA может обеспечить некоторую обработку I/O — такую как сегментация и повторная сборка, управление потоком, обнаружение ошибок и обработка прерываний — который улучшает пропускную способность I/O.

В этой главе описываются, как устройства HBA представляются и управляются в OS X, и это представляет семью SCSI Parallel, предоставляющую поддержку для драйверов HBA. Эта глава также описывает путь запроса I/O и как драйвер устройства HBA участвует в той поездке.

Если необходимо разработать пользовательский драйвер для устройства HBA, необходимо считать эту главу, чтобы изучить, как драйвер вписывается в систему и как использовать в своих интересах услуги, предоставленные семьей SCSI Parallel. Когда Вы готовы начать разработку, считайте Разработку Драйвера HBA для определенных инструкций по тому, как реализовать Ваш драйвер и Улучшение Производительности для способов улучшить ее производительность.

Драйверы устройств HBA в OS X

Хранение устройства HBA обеспечивает интерфейс для наборов параллельного SCSI, Волоконно-оптического канала, Serial ATA (SATA) или устройства Serial Attached SCSI (SAS). Некоторые HBAs имеют встроенное микропрограммное обеспечение, позволяющее им связываться больше чем с одним типом подключенного устройства. Например, некоторый HBAs может обработать и SAS и диски SATA.

Можно разработать драйвер HBA для выполнения в OS X за любым типом HBA, понимающего команды SCSI, определенные в наборах команд SPC 3 (SCSI Основные Команды 3), SBC-2 (Блочные Команды SCSI 2), MMC 3 (Мультимедийный набор команд 3), и RBC (Сокращенный Блочный Набор команд). Это включает большую часть Волоконно-оптического канала устройства HBA, кроме того чтобы быть параллельным SCSI и SAS HBAs. Для получения дополнительной информации о Параллели SCSI Взаимосвязанные стандарты, посетите веб-сайт Торговой ассоциации SCSI в www.scsita.org.

Драйвер устройства HBA в штабеле драйвера массового хранения

В OS X драйверы HBA участвуют в штабеле драйвера массового хранения как часть физического взаимосвязанного уровня (для получения дополнительной информации об объектах в других уровнях этого штабеля, см. Руководство по программированию Драйвера Устройства массового хранения). Коммуникация устройства групп стека драйвера массового хранения на логические уровни, каждый из которых содержит драйверы и другие объекты, реализующие надлежащие протоколы. В целом, предоставленный Apple драйверы и другие объекты реализуют системные службы, такие как замена в горячем режиме поддержки и обработки событий, позволяя сторонним драйверам фокусироваться на том, чтобы поддерживать функции, уникальные для определенных устройств. Водительская основная задача пользовательского HBA состоит в том, чтобы передать команды к аппаратным средствам, но это могло бы также реализовать специфичные для аппаратных средств задачи обработки прерываний или управления устройствами.

Рисунок 1-1 показывает объекты и уровни в штабеле драйвера массового хранения в качестве примера, накопленном от пользовательского драйвера HBA.

Рисунок 1-1  пользовательский драйвер HBA участвует в штабеле драйвера массового хранения

Когда Набор I/O выполняет устройство, соответствующее на объекте, представляющем устройство HBA, это инстанцирует объекта контроллера интерфейса параллели SCSI ( IOSCSIParallelInterfaceController экземпляр). В зависимости от отдельного устройства HBA или пользовательский драйвер HBA или объект контроллера интерфейса параллели SCSI тогда инстанцируют некоторого числа объектов устройства интерфейса параллели SCSI (IOSCSIParallelInterfaceDevice экземпляры). Несмотря на то, что рисунок 1-1 показывает только один объект устройства интерфейса параллели SCSI, реальный штабель содержал бы много этих объектов, равных числу устройств, которые может поддерживать устройство HBA.

Каждый объект устройства интерфейса параллели SCSI тогда пытается создать объект целевого устройства SCSI ( IOSCSITargetDevice экземпляр). Объект целевого устройства SCSI сканирует устройство, которое он представляет для логических единиц и создает кусок логической единицы SCSI ( IOSCSILogicalUnitNub экземпляр) для каждого это находит. Рисунок 1-1 показывает объекту целевого устройства SCSI одновременная покупку и продажу логической границы между транспортным драйвером и физическими взаимосвязанными уровнями. Это вызвано тем, что это представляет ссылку между семьей Model архитектуры SCSI (в котором это определяется), и семья параллели SCSI (с которым это связывается).

Важно подчеркнуть, что ни объект контроллера интерфейса параллели SCSI, ни пользовательский объект драйвера HBA не создают объекты целевого устройства SCSI. Это позволяет драйверу контроллера (Предоставленный Apple или пользовательский) избегать иметь необходимость повторно отсканировать всю шину для целевых устройств. Вместо этого пересканирование фокусируется на только тех объектах устройства интерфейса параллели SCSI, не имеющих объекта целевого устройства SCSI присоединенным к ним. Такое пересканирование не прерывает происходящие передачи I/O на объектах устройства интерфейса параллели SCSI, действительно имеющих объект целевого устройства SCSI присоединенным к ним.

Появление куска логической единицы SCSI заставляет Набор I/O находить и соответствовать к нему любому драйвер логической единицы в ядре (за 00$ типов периферийного устройства, 05$, 07$ и 0$ E) или пользовательский клиент задачи SCSI (для других типов периферийного устройства). Драйвер логической единицы создает объект задачи SCSI (экземпляр SCSITask) для содержания I/O запрашивают, чтобы это получило от объектов выше его в штабеле. Объект задачи SCSI содержит блок дескриптора команды (или CDB) и является основной единицей транзакций I/O в транспортном уровне драйвера.

Объекты в уровне услуг устройства драйвера массового хранения складывают устройства представления как абстрактные пространства памяти и не знают о наборах команд или физических протоколах обмена. Мультимедийные объекты могут представлять подмножество устройства хранения (такого как раздел диска) или ряд устройств (таких как набор, которым управляет устройство HBA). Дополнительные драйверы фильтра могут реализовать шифрование или проверку на содержании, которое представляют мультимедийные объекты. Универсальный драйвер блочной системы хранения реализует открытую и близкую семантику для устройства и обрабатывает задачи, такие как разблокирование для невыровненных передач и опроса относительно выбрасываемых носителей.

Проект семьи параллели SCSI

Семья SCSI Parallel, представленная в OS X v10.2, была разработана для замены семьи SCSI (который осуждался в OS X v.10.3). Несмотря на его довольно собственное имя, семья SCSI Parallel поддерживает любое устройство HBA, которое может представить себя как параллельный SCSI HBA. Естественно, это включает последовательно присоединенный SCSI (SAS) устройства HBA, но он также включает Волоконно-оптический канал и SATA HBAs, многие из которых используют высокоуровневый SCSI APIs для обработки I/O.

Семья SCSI Parallel предлагает много преимуществ перед семьей SCSI, таких как устранение проблем блокировки и синхронизации, часто заполонявших более старую семью. Семья SCSI Parallel также подчеркивает корректную реализацию стандартов SPI 3 интерфейса параллели SCSI и SPI 4, что означает, что это обрабатывает подавляющее большинство соответствующих устройств.

Из большей части интереса для разработчиков драйвера HBA, однако, факт, что семья SCSI Parallel реализует большинство зависимых от операционной системы и определенных с помощью SPI задач, требуемых для драйвера HBA связываться с другими объектами в штабеле драйвера массового хранения. Например, семья SCSI Parallel обрабатывает сканирование шины, восстановление устройства, открытие логических единиц, создание объектов целевого устройства и конструкцию команд SCSI, среди прочего. Этот высокий уровень поддержки присуждает три значительных преимущества:

  • Это позволяет разработчикам фокусироваться на основной задаче драйвера устройства HBA курсирующего I/O к и от аппаратных средств.

  • Это обеспечивает непротиворечивый опыт через физические межсоединения.

  • Это изолирует разработчиков от потенциальных изменений в конкретных реализациях.

Семья SCSI Parallel определяет IOSCSIParallelInterfaceController класс, который является базовым классом для всех пользовательских драйверов HBA, которые могут передать команды SCSI использования. IOSCSIParallelInterfaceController класс обрабатывает большинство функций жизненного цикла драйвера Набора I/O, различных задач выделения памяти и дополнительного управления целевого устройства, среди прочего. Как подкласс этого класса, пользовательский драйвер HBA реализует несколько требуемых методов сообщить информацию о себе, инициализировать себя и обработать запросы I/O. Если необходимо, пользовательский драйвер HBA может также реализовать методы для выполнения задач управления устройствами и специфичной для устройства обработки прерываний.

IOSCSIParallelInterfaceController класс также обеспечивает большое количество методов, позволяющих Вам получать информацию о других объектах, не будучи должен знать что-либо о структуре тех объектов. Например, существуют методы для получения информации об объектах задачи параллели SCSI, представляющих запросы I/O и команды SCSI и методы для получения информации об объектах целевого устройства SCSI. Используя эти методы и удобно и безопасен; если их реализации изменяются, доступ к таким объектам непосредственно может привести к проблемам.

Роль устройства HBA в поездке запроса I/O

Одна из самых важных функций OS X - то, что это - многопоточная операционная система. Преимущества многопоточности особенно очевидны в производительности I/O. Этот раздел фокусируется на ролях различных потоков в обработке запроса I/O. Всестороннее описание многопоточности и других способов, которыми это могло бы влиять на Ваш драйвер, выходит за рамки этого документа; если требуется узнать больше о нем, см. Руководство по программированию Ядра.

Рисунок 1-2 показывает упрощенное представление пути I/O. Именуйте это число, поскольку Вы читаете описание ниже его.

Рисунок 1-2  поездка запроса I/O

Предположите, что приложение делает стандартный BSD read запрос и что запрос (без ведома к приложению) в конечном счете предназначается для устройства хранения SCSI. Команда BSD вызывает в ядро, выполняющее перевод дескриптора файла команды, чтобы гарантировать, что это предназначается для корректной файловой системы. После некоторой дополнительной обработки, переходов запроса чтения от уровня файловой системы до уровня I/O Kit, где это вводит объект IOMedia, представляющий предназначенное содержание.

Запрос перемещается вниз штабель драйвера массового хранения, каждый драйвер, обертывающий запрос в надлежащий, определенный формат протокола и передающий его драйверу ниже. Наконец, запрос достигает драйвера HBA, отсылающего команду на периферийной шине к надлежащему целевому устройству. В этой точке, блоках потока приложения, ожидающих завершения его запроса. Точное расположение потока ожидания зависит от определенных обстоятельств и не крайне важно для этого описания. Важная вещь состоит в том, что чтение запрашивает перемещения на потоке приложения, полностью к драйверу HBA.

Когда целевое устройство завершает запрос, оно вызывает аппаратные средства (прямое) прерывание. Контроллер прерываний (работающий в основном контексте прерывания) диспетчеризирует прерывание драйверу HBA и сигнализирует его цикл работы для выполнения. С этим основной контекст прерывания уходит и вторичный контекст прерывания (в котором драйвер контроллера теперь работает), начинается, с сохраненной блокировкой. Контроллер, который выполняет водительская подпрограмма завершения чтения, который инициировал каскад подпрограмм завершения как завершенные перемещения запроса, копирует штабель. Наконец, объект в блочном уровне служб, все еще на потоке цикла работы с сохраненной блокировкой, вызывает подпрограмму завершения файловой системы, сигнализирующую поток приложения для пробуждения. Поток приложения возвращается к приложению с завершенным запросом чтения, и приложение продолжает работать.

Различие между двумя потоками, вовлеченными в поездку запроса I/O, является важным, потому что это влияет на способ, которым Ваш драйвер HBA обрабатывает запросы I/O и обрабатывает прерывания.