Разделение на подклассы драйверов служб протокола

Драйвер служб протокола в транспортном уровне драйвера штабеля драйвера массового хранения ответственен за подготовку команд, которые это получает от драйвера логической единицы для передачи через определенную шину. Каждая поддерживаемая шина определяет протокол автобусного транспорта, указывающий, как команды и данные отправляются через шину. Если Ваше устройство не соответствует протоколу автобусного транспорта шины, это подключено с, необходимо разделить надлежащий драйвер служб протокола Apple на подклассы для оказания поддержки, которой требует устройство.

Apple обеспечивает драйверы служб протокола для устройств, соответствующих следующим протоколам автобусного транспорта:

В этой главе описываются, как разделить предоставленный 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 с фактическими значениями для Вашего устройства.

  Свойства Table 6-1 Personality для MyFWProtocolServicesDriver

Свойство

Класс

Значение

CFBundleIdentifier

Строка

com.MySoftwareCompany.driver.MyFWProtocolServicesDriver

Command_Set

Число

MyCommandSetNumber

Command_Spec_ID

Число

MyCommandSpecIDNumber

Device_Type

Число

MyDeviceTypeNumber

IOClass

Строка

com_MySoftwareCompany_driver_MyFWProtocolServicesDriver

IOProbeScore

Число

MyProbeScore

IOProviderClass

Строка

IOFireWireSBP2LUN

Physical Interconnect

Строка

FireWire

Physical Interconnect Location

Строка

External

Vendor_ID

Число

MyVendorID

Драйвер объявляет свои зависимости от других загружаемых расширений ядра и компонентов в ядре в OSBundleLibraries словарь. Каждая зависимость имеет строковое значение, объявляющее самую раннюю версию зависимости, с которой драйвер совместим.

Демонстрационный драйвер зависит от загружаемых расширений от IOSCSIArchitectureModel семья и IOFireWire семья. Добавить эти зависимости к OSBundleLibraries словарь, Вы создаете новый дочерний элемент для каждой зависимости. Таблица 6-2 показывает зависимости, которые Вы добавляете для демонстрационного драйвера.

Табличные 6-2  зависимости для MyFWProtocolServicesDriver

Свойство

Класс

Значение

com.apple.iokit.IOSCSIArchitectureModelFamily

Строка

1.0.0

com.apple.iokit.IOFireWireFamily

Строка

1.0.0

com.apple.iokit.IOFireWireSBP2

Строка

1.0.0

com.apple.iokit.IOFireWireSerialBusProtocolTransport

Строка

1.0.0

Поскольку драйвер дисковода для компакт-дисков должен быть в состоянии смонтировать корень на локальном томе, Вы добавляете 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