Драйвер массового хранения, соответствующий и загружающийся
Прежде чем устройство массового хранения может использоваться, Набор I/O должен найти и загрузить несколько драйверов для него. В транспортном уровне драйвера требуемые драйверы являются драйвером служб протокола и драйвером логической единицы. Единственный требуемый драйвер в уровне услуг устройства является универсальным драйвером блочной системы хранения, но если существует настоящее носителей в устройстве, может быть раздел и драйверы схемы фильтра, также. Как все драйверы Набора I/O, эти драйверы должны объявить, какие устройства они подходят для диска путем размещения специфичной для устройства или специфичной для типа устройства информации в вызванные лица специальных словарей. В вызванном соответствии драйвера процесса Набор I/O сравнивает эту информацию со значениями, которые, как сообщает устройство, нашли самый подходящий драйвер.
Эта глава сначала описывает процесс соответствия драйвера в целом и затем фокусируется на соответствующей семантике драйверов служб протокола, драйверов логической единицы и дополнительных драйверов схемы фильтра.
Лица драйвера и соответствие процесса
Набор I/O находит и загружает драйверы устройств в трехэтапном процессе соответствия, исключающем неподходящие драйверы из пула кандидатов, пока не оставляют один или несколько приемлемых драйверов. Самому приемлемому из остающихся драйверов тогда дают первую возможность управлять устройством.
Этот процесс использует соответствие словарей, которые находятся в каждом водительском информационном списке свойств. Каждый словарь, состоя из пар ключ/значение XML, указывает индивидуальность драйвера, объявляющего его пригодность для определенного устройства или типа устройства. Драйвер может иметь больше чем одну индивидуальность, если это может управлять различными устройствами или типами устройства.
Этот раздел представляет краткий обзор лиц драйвера и соответствия (для более всестороннего описания этих тем, см. Основные принципы IOKit.) Последующие разделы, Соответствие Драйвера Protocol Services, Соответствие Драйвера Логической единицы и Драйвер Схемы фильтра, Соответствующий, описывают, как этот процесс реализован определенными драйверами массового хранения.
Лица драйвера
Каждый драйвер устройства должен объявить одно или более лиц, определяющих типы устройств, которые он может поддерживать. Эти лица находятся в форме словарей XML, содержавшихся в информационном списке свойств (Info.plist
файл) в водительском расширении ядра (KEXT) пакет.
Каждая запись в соответствующем словаре составлена из пары ключ/значение в который XML-тэги <key>
и </key>
включите ключ, и присваиваемое значение включается XML-тэгами, указывающими его тип данных.
В минимуме все лица драйвера содержат следующие два ключа:
IOClass
ключ объявляет имя класса, которого Набор I/O инстанцирует при зондировании. Например,<key>IOClass</key>
<string>IOATAPIProtocolTransport</string>
говорит Набору I/O инстанцировать
IOATAPIProtocolTransport
драйвер при зондировании устройства для этой индивидуальности.IOProviderClass
ключ объявляет, что имя куска классифицирует индивидуальность драйвера присоединения к. Например,<key>IOProviderClass</key>
<string>IOFireWireSBP2LUN</string>
говорит Набору I/O, что эта индивидуальность драйвера присоединяет к
IOFireWireSBP2LUN
кусок.Класс провайдера определяет специфичные для семьи ключи соответствия, используемые на пассивном шаге соответствия, описанном в Соответствии Драйвера.
Большинство лиц драйвера также содержит IOProbeScore
ключ, объявляющий начальный тестовый счет к индивидуальности. Например,
<key>IOProbeScore</key> |
<integer>5000</integer> |
объявляет основной тестовый счет 5 000, который может быть увеличен или уменьшен во время процесса соответствия, отразив водительскую пригодность для устройства.
Соответствие драйвера
Когда устройство обнаружено, драйвер, соответствующий, происходит. Каждый драйвер кандидата имеет тестовый счет, отражающий, как хорошо подходящий он должен управлять устройством. Во время процесса соответствия семья может увеличить тестовый счет с каждым соответствием свойства. Драйверу с самым высоким тестовым счетом дают первую возможность управлять устройством.
Процесс соответствия драйвера состоит из трех фаз:
В фазе соответствия класса Набор I/O устраняет драйверы неправильного класса. Например, Набор I/O устраняет драйверы, убывающие от класса SCSI при поиске драйвера USB.
В пассивной фазе соответствия Набор I/O исследует индивидуальность драйвера для специфичных для семьи свойств. В семье Model архитектуры SCSI, чем больше соответствующих найденных свойств, тем выше водительский тестовый счет. Например, драйвер, соответствующий и на имени поставщика и на названии продукта, имеет более высокий тестовый счет, чем драйвер, соответствующий только на имени поставщика. Семейство систем хранения, с другой стороны, не влияет на водительский тестовый счет во время соответствия.
Часто этот шаг достаточен, чтобы определить, подходит ли драйвер для устройства. Если нет никакого специфичного для семьи соответствия, однако, следующий шаг автоматически вызывается.
В активной фазе соответствия драйверу кандидата позволяют связаться с устройством и проверить, что это может управлять им. Набор I/O загружает драйверы, остающиеся после пассивной фазы соответствия и каждого водительского
probe
функция вызвана в отношении устройства, против которого она является соответствующей.probe
метод может исследовать устройство всегда, это выбирает, пока это оставляет устройство в том же состоянии, в котором это было найдено.Например, поставщик может использовать определенные биты значения свойства для выражения присутствия определенного компонента устройства. Драйвер логической единицы для того устройства может реализовать a
probe
метод, исследующий те биты, чтобы определить, присутствует ли действительно компонент.В зависимости от результатов зонда драйвер увеличивает или уменьшает свой тестовый счет для указания его пригодности для управления устройством.
I/O Кит выбирает драйвер с самым высоким тестовым счетом и запускает его. Если драйвер запускается успешно, любые остающиеся кандидаты драйвера отбрасываются. Если это не успешно, драйвер со следующим самым высоким тестовым счетом запущен, и процесс продолжается, пока не найден успешный драйвер.
Запуск драйвера
При зондировании драйвер может выполнить подробное исследование устройства, включая, при необходимости, выделения памяти, но это должно оставить устройство в том же состоянии, в котором это нашло его. Если драйвер запускается успешно, он может снова использовать память, которую он выделил в probe
метод, но если это неуспешно, это, несомненно, должно будет освободить память в free
метод.
Когда драйвер запускается, он должен вызвать свой суперкласс start
метод прежде, чем сделать что-либо еще. Если суперкласс start
метод успешно выполняется, драйвер может тогда выполнить свои инициализации или выделения. Поскольку драйвер может не быть в состоянии выполнить инициализации или выделения безопасно после того, как он запускается, он должен выполнить такие задачи в start
метод. Если драйвер неспособен выполнить свои задачи, он может уведомить Набор I/O, и драйвер со следующим самым высоким тестовым счетом запускается.
Соответствие драйвера служб протокола
Во время здания штабеля драйвера массового хранения объекты в физическом взаимосвязанном уровне обнаруживают устройство массового хранения и публикуют кусок, представляющий его в Реестре I/O. Набор I/O находит драйвер служб протокола путем выполнения драйвера, соответствующего на этом куске.
Драйверы служб протокола полагаются на соответствие семантики, которые являются определенными для семейства шины, с которой они связываются. Следующие разделы описывают соответствующие свойства и процесс для каждого предоставленного Apple драйвера служб протокола.
Драйвер FireWire SBP-2 служб протокола
Как описано в Конструкции Штабеля Драйвера Массового хранения, драйвер служб протокола для устройства массового хранения FireWire SBP-2 должен соответствовать на IOFireWireSBP2LUN
кусок, опубликованный IOFireWireTarget
объект в физическом взаимосвязанном уровне. IOFireWireSBP2LUN
объект содержит следующие семь ключей:
Command_Set
Command_Set_Spec_ID
Vendor_ID
Command_Set_Revision
IOUnit
Firmware_Revision
Device_Type
IOFireWireTarget
возразите сканирует конфигурацию устройства ROM и заполняет значения для этих ключей. Если устройство не объявляет один или больше этих свойств в его конфигурации ROM, IOFireWireSPB2LUN
публикует соответствующий ключ с нулевым значением.
Соответствовать на IOFireWireSBP2LUN
, IOFireWireSerialBusProtocolTransport
индивидуальность драйвера включает ключи, показанные в Перечисление 3-1.
Перечисление 3-1 словарь индивидуальности драйвера IOFireWireSerialBusProtocolTransport
<dict> |
<!-- CFBundleIdentifier denotes the name of the driver in |
-- reverse DNS notation. --> |
<key>CFBundleIdentifier</key> |
<string>com.apple.iokit.IOFireWireSerialBusProtocolTransport</string> |
<!-- Command_Set refers to the organization responsible |
-- for the definition of the command set. --> |
<key>Command_Set</key> |
<integer>66776</integer> |
<!-- Command_Set_Spec_ID specifies the commands |
-- understood by the device. --> |
<key>Command_Set_Spec_ID</key> |
<integer>24734</integer> |
<!-- The name of the class the I/O Kit instantiates |
-- when probing. --> |
<key>IOClass</key> |
<string>IOFireWireSerialBusProtocolTransport</string> |
<!-- The initial probe score for this personality. --> |
<key>IOProbeScore</key> |
<integer>4096</integer> |
<!-- The provider class is the name of the nub class this |
-- driver personality attaches to. --> |
<key>IOProviderClass</key> |
<string>IOFireWireSBP2LUN</string> |
<!-- The next two keys describe which |
-- bus the device is on and whether it is |
-- internal or external.--> |
<key>Physical Interconnect</key> |
<string>FireWire</string> |
<key>Physical Interconnect Location</key> |
<string>External</string> |
</dict> |
Подкласс IOFireWireSerialBusProtocolTransport
драйвер может использовать больше семи ключей IOFireWireSBP2LUN
возразите, чтобы более узко определить устройство, которым это подходит управлять. Это может также исследовать значения свойств в probe
метод для дальнейшего определения его пригодности. Например, поставщик может использовать некоторые биты в значении свойства для объявления присутствия компонента устройства. Драйвер, который должен определить присутствие этого компонента, может исследовать те биты в probe
метод. Перечисление 3-2 показывает, как это может быть сделано для подкласса IOFireWireSerialBusProtocolTransport
драйвер.
Пример перечисления 3-2 драйвер служб протокола FireWire зондирует метод
// This example probe method tests the Firmware_Revision value. |
IOService *com_MySoftwareCompany_driver_MyFWProtocolLayerDriver::probe( |
IOService *provider, SInt32 *score ) |
{ |
IOFireWireSBP2LUN *fwSBP2LUN = NULL; |
OSObject *firmwareObject; |
IOService *returnValue = 0; |
// Override probe method inherited from IOFireWireSBP2LUN. |
// Incorporate additional matching based on bits within |
// firmware revision data. |
// Allow superclass first chance at probe |
if ( !IOFireWireSerialBusProtocolTransport::probe( provider, score ) ) |
goto ErrorExit; |
fwSBP2LUN = OSDynamicCast( IOFireWireSBP2LUN, provider ); |
if ( fwSBP2LUN == NULL ) |
goto ErrorExit; |
// Get key from registry that IOFireWireSBP2LUN published |
firmwareObject = provider->getProperty( "Firmware_Revision" ); |
if ( firmwareObject ) |
{ |
OSNumber *firmwareNumberObject; |
UInt32 firmwareValue = 0; |
// Translate the Firmware_Revision property |
// into an OSNumber value for inspection. |
firmwareNumberObject = OSDynamicCast( OSNumber, firmwareObject ); |
if ( firmwareNumberObject ) |
{ |
firmwareValue = firmwareNumberObject->unsigned32BitValue( ); |
} |
// Check bits 8 through 23 of the Firmware_Revision value by |
// comparing them with the constants kMyConstant1 and |
// kMyConstant2. |
// These constants represent identification codes and |
// would be defined earlier in the driver's code. |
if ( ( ( ( firmwareValue >> 8 ) & 0x000FFF ) == kMyConstant1 ) |
|| |
( ( ( firmwareValue >> 8 ) & 0x000FFF ) == kMyConstant2 ) ) |
{ |
IOLog( "%s: Device component detected\n", getName( ) ); |
returnValue = this; |
} |
} |
ErrorExit: |
return returnValue; |
} |
Драйвер служб протокола класса массового хранения USB
Когда устройство класса массового хранения USB обнаружено, семья USB абстрагирует содержание дескриптора устройства в вызванный объект куска Набора I/O IOUSBDevice
. Дескриптор устройства включает информацию, такую как класс и подкласс устройства, поставщик и номера продуктов и число конфигураций.
Поскольку устройства класса массового хранения USB определяются как составные устройства класса, AppleUSBComposite
драйвер соответствует против IOUSBDevice
объект куска и наборы первая конфигурация в устройстве. Это заставляет семью USB абстрагировать каждый интерфейсный дескриптор в конфигурации в IOUSBInterface
объект куска. IOUSBMassStorageClass
драйвер тогда соответствует на массовом хранении совместимые классом интерфейсные объекты куска.
Предоставленное Apple IOUSBMassStorageClass
драйвер содержит шесть лиц, соответствующих шести подклассам массового хранения. Каждый подкласс представляет тип блока команды, устанавливает использование интерфейсов устройства. Если устройство совместимо со спецификацией класса массового хранения USB, ее интерфейсный дескриптор содержит ее подкласс и протокол в bInterfaceSubClass
и bInterfaceProtocol
поля, соответственно.
Код подкласса в bInterfaceSubClass
поле относится к одному из подклассов, перечисленных в Таблице 3-1. Эти коды обозначают спецификации промышленного стандарта, описывающие блочные определения команды, используемые интерфейсами устройств класса массового хранения USB. Они не обращаются к определенным типам устройства, так как большинство устройств класса массового хранения USB может принять решение соответствовать любой блочной спецификации команды.
Код подкласса | Блочная спецификация команды | Типичное использование |
---|---|---|
0x01 | Reduced Block Commands (RBC) | Устройство Flash, другие устройства класса массового хранения |
0x02 | SFF8020I | Устройство CDROM, другие устройства массового хранения |
0x03 | QIC-157 | Накопитель на магнитной ленте |
0x04 | UFI | Устройство гибкого диска |
0x05 | SFF8070I | Устройство гибкого диска, другие устройства массового хранения |
0x06 | SCSI прозрачный набор команд | Любое устройство, соответствующее определенному с помощью SCSI набору команд |
bInterfaceProtocol
поле в интерфейсном дескрипторе обозначает транспортный протокол интерфейсное использование. IOUSBMassStorageClass
драйвер поддерживает интерфейсные протоколы, показанные в Таблице 3-2.
Код протокола | Реализация протокола |
---|---|
0x0 | Протокол управления/Объема/Прерывания с прерыванием завершения команды |
0x01 | Протокол управления/Объема/Прерывания без прерывания завершения команды |
0x50 | Транспорт только для объема |
Если устройство является совместимым классом массового хранения, один из IOUSBMassStorageClass
водительские лица соответствуют на интерфейсном подклассе устройства. Перечисление 3-3 показывает первую индивидуальность в IOUSBMassStorageClass
водительский словарь индивидуальности.
Перечисление 3-3 Один из IOUSBMassStorageClass водительские лица
<dict> |
<!-- CFBundleIdentifier denotes the name of the driver in |
-- reverse DNS notation. --> |
<key>CFBundleIdentifier</key> |
<string>com.apple.iokit.IOUSBMassStorageClass</string> |
<!-- IOUSBMassStorageClass is the name of the class the I/O Kit |
-- instantiates. --> |
<key>IOClass</key> |
<string>IOUSBMassStorageClass</string> |
<!-- IOUSBInterface is the name of the nub class this |
-- personality attaches to. --> |
<key>IOProviderClass</key> |
<string>IOUSBInterface</string> |
<!-- The next two keys describe which bus |
-- the device is on and whether it is internal |
-- or external.--> |
<key>Physical Interconnect</key> |
<string>USB</string> |
<key>Physical Interconnect Location</key> |
<string>External</string> |
<!-- The interface class this driver matches on.--> |
<key>bInterfaceClass</key> |
<integer>8</integer> |
<!-- Interface subclass 1 refers to the Reduced Block Commands |
-- subclass.--> |
<key>bInterfaceSubClass</key> |
<integer>1</integer> |
Специфичный для поставщика класс массового хранения совместимые устройства
Иногда, устройство совместимо со спецификацией массового хранения USB, но объявляет, что ее класс устройства поставщик, определенный вместо массового хранения. В этом случае необходимо побудить Набор I/O загружаться IOUSBMassStorageClass
драйвер для Вашего устройства даже при том, что драйвер соответствует в только интерфейсах класса массового хранения.
Вы делаете это путем создания KEXT, состоящего исключительно из информационного списка свойств, содержащего индивидуальность для устройства. Как любой специфичный для поставщика интерфейсный драйвер, этот KEXT соответствует на значении конфигурации, интерфейсном числе, и поставщике и номерах продуктов IOUSBInterface
предоставления куска. В отличие от большинства специфичных для поставщика драйверов, однако, этот KEXT устанавливает IOClass
ключ к IOUSBMassStorageClass
и включает словарь, названный “Характеристики Массового хранения USB”, содержащие подкласс и информацию о протоколе, отражающую, как должно быть обработано устройство. IOUSBMassStorageClass
драйвер тогда использует те ключи для определения подкласса и протокола устройства вместо того, чтобы полагаться на информацию, предоставленную устройством.
Перечисление 3-4 показывает индивидуальность для устройства, соответствующего спецификации класса массового хранения USB, но принадлежащего специфичному для поставщика классу.
Перечисление 3-4 Частичное перечисление файла Info.plist для специфичного для поставщика устройства
<dict> |
<key>CFBundleIdentifier</key> |
<string>com.apple.iokit.IOUSBMassStorageClass</string> |
<!-- IOUSBMassStorageClass is the name of the class the |
-- I/O Kit instantiates when probing. --> |
<key>IOClass</key> |
<string>IOUSBMassStorageClass</string> |
<!-- IOUSBInterface is the name of the nub class |
< -- the driver attaches to. --> |
<key>IOProviderClass</key> |
<string>IOUSBInterface</string> |
<!-- The following two keys describe |
-- which bus the device is on and whether it |
-- is internal or external. --> |
<key>Physical Interconnect</key> |
<string>USB</string |
<key>Physical Interconnect Location</key> |
<string>External</string> |
<key>USB Mass Storage Characteristics</key> |
<dict> |
<!-- The bInterfaceProtocol value is Control/Bulk/Interrupt |
-- with command completion interrupt. --> |
<key>Preferred Protocol</key> |
<integer>1</integer> |
<!-- The bInterfaceSubclass value is SFF8070I. --> |
<key>Preferred Subclass</key> |
<integer>5</integer> |
</dict> |
<!-- The following four keys are used for interface |
-- matching. --> |
<key>bConfigurationValue</key> |
<integer>MyConfigurationValue</integer> |
<key>bInterfaceNumber</key> |
<integer>MyInterfaceNumber</integer> |
<key>idProduct</key> |
<integer>MyProductID</integer> |
<key>idVendor</key> |
<integer>MyVendorID</integer> |
</dict> |
Соответствие для подкласса драйвера служб протокола USB
Если Ваше устройство несовместимо со спецификацией класса массового хранения USB, необходимо разработать подкласс IOUSBMassStorageClass
драйвер для поддержки различий. Чтобы гарантировать, что Ваш драйвер загружается в пользу обобщения IOUSBMassStorageClass
драйвер необходимо использовать ключи, определенные для интерфейса, соответствующего в Универсальной последовательной шине Общая Спецификация Класса, Версия 1.0 (доступный для скачивания от http://www .usb.org/developers/devclass_docs/usbccs10.pdf.)
Соответствующие интерфейс ключи, определенные в USB Общая Спецификация Класса, состоят из определенных комбинаций ключей свойства. Для успешного соответствия необходимо включать ключи свойства, определенные точно одним соответствием интерфейса, вводят Ваш Info.plist
файл. При использовании комбинации ключей свойства, не определенных каким-либо соответствующим интерфейс ключом драйвер не будет соответствовать. Например, при использовании ключей свойства для поставщика, продукта и интерфейсного протокола, драйвер не будет соответствовать. Это вызвано тем, что нет никакого ключа, комбинирующего ключи свойства поставщика, продукта и интерфейсного протокола.
Таблица 3-3 перечисляет ключи в порядке специфики: соответствующий интерфейс ключ для самого определенного соответствия (и самого высокого тестового счета) перечислен сначала.
Соответствующий интерфейс ключ | Комментарий |
---|---|
| |
| |
| Только если |
| Только если |
| Только если |
|
Драйвер служб протокола ATAPI
Когда устройство массового хранения ATAPI обнаружено, контроллер шины ATAPI публикует кусок устройства ATA, который является конкретным подклассом IOATADevice
. Семья ATA не определяет специфичного для семьи соответствия, таким образом, все соответствие активно. Это означает, что драйвер зондирует устройство, чтобы определить, подходит ли это управлять им.
В start
метод во время активного соответствия, IOATAPIProtocolTransport
драйвер сравнивает свойства в своей индивидуальности к свойствам устройства. В частности если тип устройства ATA устройства является ATAPI, загрузками драйвера для того устройства. Перечисление 3-5 показывает индивидуальность для IOATAPIProtocolTransport
драйвер.
Перечисление 3-5 словарь индивидуальности драйвера IOATAPIProtocolTransport
<dict> |
<!-- CFBundleIdentifier denotes the name of the driver in |
-- reverse DNS notation. --> |
<key>CFBundleIdentifier</key> |
<string>com.apple.iokit.IOATAPIProtocolTransport</string> |
<!-- IOATAPIProtocolTransport is the class the I/O Kit |
-- instantiates when probing. --> |
<key>IOClass</key> |
<string>IOATAPIProtocolTransport</string> |
<!-- IOATADevice is the nub this driver attaches to. --> |
<key>IOProviderClass</key> |
<string>IOATADevice</string> |
<!-- The next two keys describe which bus the |
-- device is on and whether it is internal |
-- or external.--> |
<key>Physical Interconnect</key> |
<string>ATAPI</string> |
<key>Physical Interconnect Location</key> |
<string>Internal<string> |
<!-- The value of this key is compared to the ATA device type |
-- of the device. --> |
<key>ata device type</key> |
<string>atapi</string> |
</dict> |
Подкласс IOATAPIProtocolTransport
драйвер должен включать те же ключи, показанные в Перечисление 3-5 в его словаре индивидуальности. Если необходимо решить ATAPI-специфичные проблемы, такие как устройство, которое должно сделать жесткую перезагрузку после определенного события, необходимо разработать подкласс IOATAPIProtocolTransport
это переопределяет надлежащие методы. Чтобы гарантировать, что Ваш драйвер подкласса загружается, необходимо реализовать probe
метод и увеличение тестовый счет после определения, что Ваш драйвер может, фактически, управлять устройством.
Для изменения режимов DMA или UDMA устройства, однако, можно использовать в своих интересах функцию в IOATAPIProtocolTransport
драйвер, позволяющий подклассу переопределять режим отчеты устройства. Вы активируете эту опцию путем создания KEXT, состоящего из Info.plist
файл, содержащий словарь, названный “Характеристики Массового хранения ATAPI” в дополнение к ключам, показанным в Перечислении 3-5. Этот словарь содержит имя модели устройства и значения режима DMA и UDMA, которые Вы выбираете. Имя модели устройства является строкой возвраты устройства, когда это реагирует на ATA Identify
команда. Значения режима DMA и UDMA являются битовыми масками, определенными в ATA/ATAPI-5 спецификация (доступный в http://www.t13.org). Перечисление 3-6 показывает словарь индивидуальности в качестве примера, переопределяющий DMA и значения UDMA, возвращенные устройством.
Перечисление 3-6 словарь индивидуальности, переопределяющий значения UDMA и DMA
<dict> |
<key>ATAPI Mass Storage Characteristics</key> |
<dict> |
<key>DMA Mode</key> |
<integer>0</integer> |
<key>UDMA Mode</key> |
<integer>0</integer> |
<key>device model</key> |
<string>MyDeviceModel</string> |
</dict> |
<key>CFBundleIdentifier</key> |
<string>com.apple.iokit.IOATAPIProtocolTransport</string> |
<key>IOClass</key> |
<string>IOATAPIProtocolTransport</string> |
<key>IOProbeScore</key> |
<integer>5000</integer> |
<key>IOProviderClass</key> |
<string>IOATADevice</string> |
<key>Physical Interconnect</key> |
<string>ATAPI</string> |
<key>Physical Interconnect Location</key> |
<string>Internal</string> |
<key>ata device type</key> |
<string>atapi</string> |
</dict> |
В этом примере, когда это устройство обнаружено, Набор I/O позволяет весь KEXTs с парой ключ/значение
<key>ata device type</key> |
<string>atapi</string> |
зондировать устройство. Если индивидуальность KEXT содержит словарь Характеристик Массового хранения ATAPI, Набор I/O сравнивает значение device model
строка с именем модели устройства, о котором сообщает устройство. Если они соответствуют, Набор I/O загружается IOATAPIProtocolTransport
драйвер и применяет DMA и переопределения UDMA, объявленные в словаре Характеристик Массового хранения ATAPI.
Соответствие драйвера логической единицы
После загрузок драйвера служб протокола кусок периферийного устройства запрашивает устройство и публикует его тип устройства в Реестре I/O. Набор I/O тогда находит и загружает надлежащий драйвер логической единицы для устройства. В отличие от специфичной для шины перспективы драйверов служб протокола, драйверы логической единицы просматривают устройство массового хранения с точки зрения его типа устройства, как определено спецификациями Модели архитектуры SCSI. Таким образом все четыре драйвера логической единицы в ядре используют тот же язык соответствия.
Следующие четыре свойства в индивидуальности драйвера логической единицы определяют, для каких устройств или типов устройства драйвер подходит:
Свойство типа периферийного устройства
Свойство поставщика
Продукт или свойство модели
Продукт или свойство программного контроля
Эти четыре свойства варьируются от генерала к определенному. Каждое указанное свойство сужает диапазон устройств, для которых драйвер подходит. Чем больше свойств, которые драйвер включает в его индивидуальность, тем более определенный устройство он подходит управлять. Присутствие более определенных свойств не восполняет отсутствие свойства типа периферийного устройства, как бы то ни было. Если Вы не будете включать свойство типа периферийного устройства в свою логическую единицу водительская индивидуальность, то это не рассмотрят для загрузки.
Во время пассивной фазы соответствия свойства исследованы в перечисленном порядке, и водительский тестовый счет увеличен с каждым соответствием. Каждое свойство в водительской индивидуальности должно соответствовать для драйвера, который будет рассмотрен кандидатура для устройства. Другими словами, если драйвер указывает свойство, он должен соответствовать для того драйвера, который рассмотрят. Если одно из более определенных свойств отсутствует, однако, оно не влияет на тестовый счет, потому что это означает, что драйвер может управлять более широким диапазоном устройств.
Например, четырех перечисленных свойств, IOSCSIPeripheralDeviceType00
драйвер перечисляет только свойство типа периферийного устройства в своей индивидуальности, потому что это может управлять любым устройством, соответствующим спецификации Модели архитектуры SCSI для устройств блочной системы хранения. Словарь индивидуальности для IOSCSIPeripheralDeviceType00
драйвер показан в Перечислении 3-7.
Перечисление 3-7 словарь индивидуальности драйвера IOSCSIPeripheralDeviceType00
<dict> |
<!-- The CFBundleIdentifier gives the name of this KEXT in |
-- reverse-DNS notation. --> |
<key>CFBundleIdentifier</key> |
<string>com.apple.iokit.IOSCSIBlockCommandsDevice</string> |
<!-- IOSCSIPeripheralDeviceType00 is the name of the class |
-- the I/O Kit instantiates. --> |
<key>IOClass</key> |
<string>IOSCSIPeripheralDeviceType00</string> |
<!-- IOSCSIPeripheralDeviceNub is the name of the nub |
-- class this personality attaches to. --> |
<key>IOProviderClass</key> |
<string>IOSCSIPeripheralDeviceNub</string> |
<!-- This personality is suited to drive devices of peripheral |
-- device type 0. -> |
<key>Peripheral Device Type</key> |
<integer>0</integer> |
</dict> |
При разделении на подклассы драйвера логической единицы для обращения по-другому реализованной команды устройства или дополнительной функции, необходимо гарантировать, что водительский тестовый счет выше, чем тот из более универсального драйвера. Чтобы сделать это, Вы добавляете столько же из четырех свойств индивидуальности драйвера логической единицы по мере необходимости для однозначного определения устройства.
Например, драйвер может использовать и поставщика и информацию о продукте, чтобы гарантировать, что это загружается в пользу одного из предоставленных Apple драйверов логической единицы. Перечисление 3-8 показывает словарь индивидуальности для драйвера, конкурирующего с IOSCSIPeripheralDeviceType05
драйвер.
Словарь индивидуальности драйвера логической единицы перечисления 3-8 В качестве примера
<dict> |
<!-- The CFBundleIdentifier value is the name of |
-- this KEXT. --> |
<key>CFBundleIdentifier</key> |
<string>com.MySoftwareCompany.driver.MyLogicalUnitDriver</string> |
<!-- The IOClass value is the name of the class |
-- the I/O Kit instantiates. --> |
<key>IOClass</key> |
<string>com_MySoftwareCompany_iokit_MyLogicalUnitDriver</string> |
<!-- The IOProviderClass value is the name of the |
-- nub this driver attaches to. --> |
<key>IOProviderClass</key> |
<string>IOSCSIPeripheralDeviceNub</string> |
<!-- The next three keys determine the device this |
-- driver is suited to drive. --> |
<key>Peripheral Device Type</key> |
<integer>5</integer> |
<key>Product Identification</key> |
<string>MyProductID</string> |
<key>Vendor Identification</key> |
<string>MyVendorID</string> |
</dict> |
Соответствие драйвера схемы фильтра
После загрузок драйвера логической единицы это публикует надлежащий кусок услуг устройства с типом устройства в Реестре I/O. Набор I/O инициирует соответствие на этом объекте куска и находит надлежащий универсальный драйвер блочной системы хранения. Драйвер блочной системы хранения тогда публикует IOMedia
объект, представляющий целое устройство. Если диск отформатирован Apple, IOApplePartitionScheme
соответствия на IOMedia
возразите и публикует новый IOMedia
объекты для каждого раздела.
Драйверы схемы фильтра должны соответствовать на свойствах IOMedia
объекты публикуют. Стандартный набор свойств для IOMedia
объекты включают следующее:
Ключ | Ввести | Описание |
---|---|---|
| Булевская переменная | Действительно ли носители являются выбрасываемыми? |
| Число | Естественный размер блока носителей в байтах. |
| Число | Весь размер носителей в байтах. |
| Булевская переменная | Носители в корне дерева носителей? Это - истина для представления физических сред, представления носителей RAID, и т.д. |
| Булевская переменная | Действительно ли носители перезаписываемы? |
| Строка | Описание содержания носителей, как подсказал во время создания объекта. Строка имеет формат MyCompany_MyContent. |
| Строка | Имя узла устройства BSD носителей, динамично присваивающееся при создании объекта. |
Можно выбрать любое подмножество этих свойств для включения в водительский словарь индивидуальности, но все свойства в индивидуальности должны соответствовать для драйвера, который рассмотрят для загрузки.
kIOMediaContentHintKey
самое полезное свойство, потому что оно соответствует на уникальной строке довольной подсказки Ваши места дисковой утилиты в разделе носителей (для получения дополнительной информации об этом процессе, посмотрите Конструкцию Штабеля Драйвера Массового хранения). Вы определяете строку довольной подсказки Ваше использование дисковой утилиты, Вы помещаете ту же строку довольной подсказки в kIOMediaContentHintKey
свойство Вашей водительской индивидуальности и Вашего драйвера схемы фильтра является единственным кандидатом для соответствия на этом носителей.
В отличие от семьи Model архитектуры SCSI, Семейство систем хранения не увеличивает водительский тестовый счет с каждым успешным соответствием свойства во время пассивной фазы соответствия. Если схема фильтра водительская индивидуальность соответствует успешно на IOMedia
свойства объекта, Набор I/O позволяет ему зондировать носители во время активной фазы соответствия. Если драйвер схемы фильтра реализует свое собственное probe
метод, это может увеличить или уменьшить свой тестовый счет согласно его возможности управлять носителями. Однако, потому что драйвер схемы фильтра, соответствующий на строке довольной подсказки, является почти наверняка единственным кандидатом драйвера, редко необходимо переопределить probe
метод. По умолчанию, probe
возвраты метода true
и активные концы фазы соответствия как I/O, Кит выбирает один драйвер схемы фильтра, соответствовавший на свойстве строки довольной подсказки.
При разработке собственного драйвера схемы фильтра необходимо гарантировать, что водительская индивидуальность может соответствовать на содержании, как идентифицировано строкой довольной подсказки. Перечисление 3-9 показывает словарь индивидуальности драйвера схемы фильтра, соответствующего на строке довольной подсказки MySoftwareCompany_MyContent
.
Индивидуальность драйвера схемы фильтра перечисления 3-9 В качестве примера
<dict> |
<key>IOStorage</key> |
<dict> |
<!-- The CFBundleIdentifier gives the name of this KEXT in |
-- reverse-DNS notation. --> |
<key>CFBundleIdentifier</key> |
<string>com.MySoftwareCompany.driver.MyFilterScheme</string> |
<!-- The Content Hint value must be identical to the content hint |
-- string your disk utility program places in the partition. --> |
<key>Content Hint</key> |
<string>MySoftwareCompany_MyContent</string> |
<!-- The IOClass value is the name of the class |
-- the I/O Kit instantiates. --> |
<key>IOClass</key> |
<string>com_MySoftwareCompany_driver_MyFilterScheme</string> |
<!-- The IOMatchCategory key is a special key that allows |
-- multiple clients to match on an IOMedia object. --> |
<key>IOMatchCategory</key> |
<string>IOStorage</string> |
<!-- The IOProviderClass is the name of the |
-- nub this driver attaches to. --> |
<key>IOProviderClass</key> |
<string>IOMedia</string> |
</dict> |
</dict> |