Разделение на подклассы драйверов служб протокола
Драйвер служб протокола в транспортном уровне драйвера штабеля драйвера массового хранения ответственен за подготовку команд, которые это получает от драйвера логической единицы для передачи через определенную шину. Каждая поддерживаемая шина определяет протокол автобусного транспорта, указывающий, как команды и данные отправляются через шину. Если Ваше устройство не соответствует протоколу автобусного транспорта шины, это подключено с, необходимо разделить надлежащий драйвер служб протокола Apple на подклассы для оказания поддержки, которой требует устройство.
Apple обеспечивает драйверы служб протокола для устройств, соответствующих следующим протоколам автобусного транспорта:
Протокол последовательной шины FireWire 2 спецификации (см. http://t10 .org),
Спецификации класса массового хранения USB (см. http://www .usb.org),
ATA/ATAPI-5 спецификации (см. http://t13 .org),
В этой главе описываются, как разделить предоставленный Apple драйвер служб протокола на подклассы к специфичным для адресной шины проблемам. Пример кода в этой главе универсален и подчеркивает форму, которую Ваш драйвер должен принять, а не код, требуемый реализовать определенный метод. Поскольку демонстрационный драйвер универсален, он не присоединит к определенному устройству. Для тестирования его с устройством можно заменить универсальные значения для параметров, таких как поставщик или идентификация продукта со значениями, идентифицирующими устройство.
Пример кода в этой главе из проекта XCode, создающего драйвер Набора I/O. Для получения дополнительной информации о том, как разработать расширения ядра в целом и драйверы Набора I/O в частности посмотрите, что Расширение ядра Программирует Темы и Руководство по проектированию Драйвера устройства IOKit.
Установка Вашего проекта
В этом разделе описывается создать Ваш проект драйвера и отредактировать Ваш водительский информационный список свойств. Демонстрационный драйвер в этой главе является драйвером служб протокола для универсального устройства FireWire SBP-2 CDROM, таким образом, это - подкласс предоставленного Apple IOFireWireSerialBusProtocolTransport
драйвер.
Демонстрационное использование проекта MyFWProtocolServicesDriver
для имени драйвера и универсальных значений такой как MySoftwareCompany
для имени разработчика. Необходимо заменить эти имена и значения с собственной информацией для тестирования этого кода с устройством.
Создайте новый проект
Откройте приложение XCode и создайте новый названный проект драйвера Набора I/O MyFWProtocolServicesDriver
. Укажите каталог для нового проекта или примите значение по умолчанию.
При создании нового проекта драйвера Набора I/O XCode предоставляет несколько файлов, включая два пустых исходных файла —MyFWProtocolServicesDriver.h
и MyFWProtocolServicesDriver.cpp
. Перед добавлением любого кода к этим файлам, однако, необходимо отредактировать водительский информационный список свойств.
Отредактируйте свой водительский список свойств
Каждый драйвер имеет информационный список свойств (Info.plist
файл), который содержит информацию о драйвере и в чем это нуждается, включая его лица. Как описано в Лицах Драйвера и Соответствии Процесса, водительская индивидуальность содержит соответствующую информацию использование Набора I/O для определения надлежащего драйвера для устройства. Для проверки драйвер загружается для устройства, Вы добавляете несколько свойств к его словарю индивидуальности, идентифицирующих устройство или тип устройства, которое это поддерживает.
В XCode, водительском Info.plist
файл перечислен в представлении Groups & Files в проекте. Можно отредактировать файл списка свойств как простой текст XML в редакторе XCode окно, или можно выбрать различное приложение (такое как Редактор Списка свойств) для использования. Для получения дополнительной информации о том, как выбрать другого редактора, посмотрите Привет Набор I/O: Создание Драйвера С XCode.
IOKitPersonalities
словарь в водительском Info.plist
файл может содержать словари разносторонне развитой личности, один для каждого устройства или типа устройства Ваши поддержки драйвера. Демонстрационный драйвер в этой главе реализует только один словарь индивидуальности, но можно создать дополнительные словари, если драйвер может поддерживать больше чем один тип устройства или тип устройства.
Пример кода использует следующие десять ключей свойства:
CFBundleIdentifier
Command_Set
Command_Spec_ID
Device_Type
IOClass
IOProbeScore
IOProviderClass
Physical Interconnect
Physical Interconnect Location
Vendor_ID
Используя Вашу выбранную среду редактирования, создайте новый дочерний элемент IOKitPersonalities
словарь. Сделайте имя этого нового дочернего элемента MyFWProtocolServicesDriver
и набор его класс Словаря.
Создайте десять новых дочерних элементов MyFWProtocolServicesDriver
словарь, один для каждого из этих десяти свойств Вы будете добавлять. Таблица 6-1 показывает свойства, вместе с их классами и значениями. Для тестирования примера кода с устройством замените значения такой как MyCommandSetNumber
с фактическими значениями для Вашего устройства.
Свойство | Класс | Значение |
---|---|---|
| Строка |
|
| Число |
|
| Число |
|
| Число |
|
| Строка |
|
| Число |
|
| Строка |
|
| Строка |
|
| Строка |
|
| Число |
|
Драйвер объявляет свои зависимости от других загружаемых расширений ядра и компонентов в ядре в OSBundleLibraries
словарь. Каждая зависимость имеет строковое значение, объявляющее самую раннюю версию зависимости, с которой драйвер совместим.
Демонстрационный драйвер зависит от загружаемых расширений от IOSCSIArchitectureModel
семья и IOFireWire
семья. Добавить эти зависимости к OSBundleLibraries
словарь, Вы создаете новый дочерний элемент для каждой зависимости. Таблица 6-2 показывает зависимости, которые Вы добавляете для демонстрационного драйвера.
Свойство | Класс | Значение |
---|---|---|
| Строка |
|
| Строка |
|
| Строка |
|
| Строка |
|
Поскольку драйвер дисковода для компакт-дисков должен быть в состоянии смонтировать корень на локальном томе, Вы добавляете OSBundleRequired
свойство к верхнему уровню Info.plist
файл. Другими словами, новое OSBundleRequired
свойство является одноуровневым элементом IOKitPersonalities
и OSBundleLibraries
словари, не дочерний элемент. Отредактируйте новый элемент для соответствия следующего:
OSBundleRequired String Local-Root |
Создание Вашего драйвера
В этом разделе описываются некоторые элементы, которые должны быть включены в Ваши водительские исходные файлы. Для демонстрации процесса разделения на подклассы демонстрационный драйвер просто переопределяет init
, start
, и stop
методы и сообщения печати. Необходимо заменить эти тривиальные функции собственным кодом, поддерживающим определенные физические взаимосвязанные требования транспортного протокола устройства.
В XCode водительские исходные файлы перечислены в области Groups & Files, показанной discosure треугольником рядом с MyFWProtocolServicesDriver
проект и треугольник раскрытия рядом с папкой Source.
Отредактируйте заголовочный файл
Заголовочный файл обеспечивает доступ к внешним объявлениям и поддерживающий определения типа, необходимые функциям и объектам в файле C++. Заголовок для демонстрационного драйвера прост, потому что это включает только объявления метода и никакие объявления константы или объявления переменной. Отредактируйте MyFWProtocolServicesDriver.h
файл для соответствия кода в Перечислении 6-1.
Перечисление 6-1 заголовочный файл MyFWProtocolServicesDriver
#ifndef _MyFWProtocolServicesDriver_H_ |
#define _MyFWProtocolServicesDriver_H_ |
// Because the sample driver is a subclass of the Apple-provided |
// FireWire Serial Bus Protocol driver, it must include that driver's |
// header file. |
#include <IOKit/sbp2/IOFireWireSerialBusProtocolTransport.h> |
// Here, the sample driver declares its inheritance and the method |
// it overrides. |
class com_MySoftwareCompany_driver_MyFWProtocolServicesDriver : public |
IOFireWireSerialBusProtocolTransport |
{ |
OSDeclareDefaultStructors ( |
com_MySoftwareCompany_driver_MyFWProtocolServicesDriver ) |
public: |
virtual bool init ( OSDictionary * propTable ); |
virtual bool start ( IOService * provider ); |
virtual void stop ( IOService * provider ); |
}; |
#endif /* _MyFWProtocolServicesDriver_H_ */ |
Отредактируйте файл C++
Файл C++ обеспечивает код для переопределения выбранных методов. Демонстрационный водительский файл C++ содержит все элементы, требуемые для разделенного на подклассы драйвера даже при том, что он не выполняет ничто более существенное, чем сообщения, отправленные в системный файл журнала, /var/log/system.log
.
Отредактируйте MyFWProtocolServicesDriver.cpp
файл для соответствия кода в Перечислении 6-2.
Перечисление 6-2 файл C++ MyFWProtocolServicesDriver
// Include the header file you created. |
#include "MyFWProtocolServicesDriver.h" |
// This definition allows you to use the more convenient "super" in |
// place of "IOFireWireSerialBusProtocolTransport", where appropriate. |
#define super IOFireWireSerialBusProtocolTransport |
// This macro must appear before you define any of your class's methods. |
// Note that you must use the literal name of the superclass here, not |
// "super" as defined above. |
OSDefineMetaClassAndStructors ( |
com_MySoftwareCompany_driver_MyFWProtocolServicesDriver, |
IOFireWireSerialBusProtocolTransport ); |
// Define the methods to override. |
bool |
com_MySoftwareCompany_driver_MyFWProtocolServicesDriver::init ( |
OSDictionary * propTable ) |
{ |
bool returnValue; |
IOLog ( "MyFWProtocolServicesDriver overriding init\n" ); |
// You can add code that initializes your device here. |
// Call super's init method to make sure all other initialization is done. |
returnValue = super::init ( propTable ); |
return returnValue; |
} |
bool com_MySoftwareCompany_iokit_MyFWProtocolServicesDriver:: start ( |
IOService * provider ) |
{ |
bool returnValue = false; |
IOLog ( "MyFWProtocolServicesDriver overriding start\n" ); |
// You can add code for your driver's start functions here. |
// Call super's start method to make sure all other start functions are |
// fulfilled. |
returnValue = super::start ( provider ); |
return returnValue; |
} |
void com_MySoftwareCompany_iokit_MyFWProtocolServicesDriver::stop ( |
IOService * provider ) |
{ |
IOLog ( "MyFWProcolLayerDriver overriding stop\n" ); |
// You can add code for your driver's stop functions here. |
// Call super's stop method to ensure all other necessary clean-up is done. |
super::stop ( provider ); |
} |
Тестирование Вашего драйвера
Этот раздел представляет некоторое уведомление относительно тестирования Вашего драйвера. Вы не можете использовать kextload
загрузить и протестировать Ваш драйвер «вручную», потому что существуют универсальные драйверы, которые будут всегда загружаться в его месте во время начальной загрузки. Поэтому необходимо удостовериться, что у Вас есть многократные загрузочные диски или разделы, таким образом, можно демонтировать драйвер, если он ведет себя плохо, и перезагрузите диск или раздел.
Поскольку OSBundleRequired
свойство в водительской выборке Info.plist
файл установлен в Local-Root
, футболист BootX автоматически загрузит его, когда система будет перезапущена (для получения дополнительной информации об этом процессе, посмотрите Загружающиеся Расширения ядра во Время начальной загрузки).
Для справки с отладкой можно открыть окно в Терминальном приложении (расположенный в /Applications/Utilities/Terminal
) и введите следующую строку для просмотра системного журнала:
tail -f /var/log/system.log |