Как загрузить расширение драйвера комплекта ввода / вывода в терминал?

Сейчас я разрабатываю свой собственный драйвер. Я разрабатываю шаблон ввода / вывода kitDriver. Я создаю свой код, он выполняется успешно, но проблема в терминале. Я разработал код ниже в заголовочном файле

#include <IOKit/IOService.h>

class com_osxkernel_driver_IOKIT : public IOService
{
  OSDeclareDefaultStructors(com_osxkernel_driver_IOKIT)
public:
  virtual bool    init (OSDictionary* dictionary = NULL);
  virtual void    free (void);
  virtual IOService*      probe (IOService* provider, SInt32* score);
  virtual bool    start (IOService* provider);
  virtual void    stop (IOService* provider);
}; 

в.cpp

#include "IOKIT.h"
#include <IOKit/IOLib.h>

#define super IOService

OSDefineMetaClassAndStructors(com_osxkernel_driver_IOKIT, IOService)

bool com_osxkernel_driver_IOKIT::init (OSDictionary* dict)
{
  bool res = super::init(dict);
  IOLog("IOKI::init\n");
  return res;
}


void com_osxkernel_driver_IOKIT::free(void)
{
  IOLog("IOKIT::free\n");
  super::free();
}


IOService* com_osxkernel_driver_IOKIT::probe (IOService* provider, SInt32* score)
{
  IOService *res = super::probe(provider, score);
  IOLog("IOKIT::probe\n");
  return res;
}


bool com_osxkernel_driver_IOKIT::start(IOService*provider)
{
  bool res = super::start(provider);
  IOLog("IOKIT::start\n");
  return res;
}

void com_osxkernel_driver_IOKIT::stop(IOService*provider)
{
  IOLog("IOKIT::stop\n");
  super::stop(provider);
}

Затем я успешно создаю приведенный выше код после этого IOKIT-info.plist

Словарь IOKitPersonalities ниже пять содержания, которое я добавил

Key                                           Type                            Value



CFBundleIdentifier                  String  com.osxkernel.${PRODUCT_NAME:rfc1034identifier}                          

IOClass                             String      com_osxkernel_driver_IOKIT

IOMatchCategory                     String       com_osxkernel_driver_IOKIT

IOProviderClass                     String       IOResources

IOResourceMatch                     String        IOKit

после этого

в словаре OSBundleLibraries я добавил две записи

Key                            Type                                   value


com.apple.kpi.iokit          String                                  11.3.0                          

com.apple.kpi.libkern        string                                  11.3.0

После этого я снова строю его успешно

Подходя к загрузке терминала, я следую нижеуказанным шагам

перед терминалом я нахожу путь к файлу kext и копирую этот пакет в / system / library / extension /

затем перейдите к терминалу

выполнить нижеуказанным образом

ensiss-Mac-mini:~ ensis$ sudo su
Password:
sh-3.2# chown -R 775 /System/Library/Extensions/IOKIT.kext 
sh-3.2# sudo kextload /System/Library/Extensions/IOKIT.kext 
/System/Library/Extensions/IOKIT.kext failed to load - (libkern/kext) validation failure 
(plist/executable); check the system/kernel logs for errors or try kextutil(8).
sh-3.2# 

Эй, ребята, пожалуйста, помогите мне, и одна из важных вещей - всякий раз, когда я выполняю файлы kext, разработанные универсальным драйвером, он выполняется в терминале очень успешно.

А также я начинающий это программирование ядра

2 ответа

Решение

Прежде всего: я очень не рекомендую копировать кексы в разработке /Library/Extensions или же /System/Library/Extensions - это очень плохая идея, и она может привести к тому, что ваша система перестанет загружаться. Копирование в /Library/Extensions или же /System/Library/Extensions может загружать ваш kext полностью автоматически, что обычно не то, что вы хотите во время разработки (особенно если это не приводит к сбоям в вашей системе - при перезагрузке он перезагрузит kext и снова приведет к краху системы и т. д.).

Удалите ваш kext оттуда и сделайте что-то вроде этого:

sudo cp -r /path/to/your/IOKIT.kext /tmp/

Это также должно решить любые проблемы с правами доступа - не нужно запускать chmod / chown. Затем, как сообщение об ошибке от kextload предлагает использовать kextutil вместо. Не использовать kextload, kextutil лучше во всех отношениях.

sudo kextutil /tmp/IOKIT.kext

Для дополнительного вывода вы можете использовать -v флаг:

sudo kextutil -v /tmp/IOKIT.kext

Надеемся, что это даст вам более полезное сообщение об ошибке, после чего вы сможете действовать.

Некоторые типы kext требуют загрузки при загрузке или, по крайней мере, для большинства видов тестирования. Часто все еще полезно проверить, что kext загружается без сбоев при загрузке вручную перед его установкой. (Примеры: IOFramebuffer kexts или все, что требуется для загрузки самой системы, например, драйверы хранилища, необходимые для поиска тома операционной системы, или сетевые драйверы, необходимые для сетевой загрузки.)

Я бы также рекомендовал не использовать suи вместо этого используя sudo на каждую команду, которая этого требует. Он все равно запоминает ваш пароль.

Чтобы увидеть журнал ядра, либо запустите

# 10.12+:
log stream
# 10.8-10.11:
tail -f /var/log/system.log
# 10.7 and earlier:
tail -f /var/log/kernel.log

во втором окне Terminal.app (или через сеанс ssh из другой системы) или запустите Console.app и выберите "Все сообщения" (10.7 и старше: kernel.log) слева.

Обновление: я добавил упоминания /Library/Extensions который сейчас является правильным местом для установки сторонних кексов. Использовать только /System/Library/Extensions на 10,8 или старше. Я также обновил просмотр журнала ядра.

Пожалуйста, проверьте документ: https://developer.apple.com/library/mac/#documentation/Darwin/Conceptual/KEXTConcept/KEXTConceptDebugger/debug_tutorial.html

$ sudo cp -R MyDriver.kext /tmp

$ sudo chown -R root:wheel MyDriver.kext

После подписания документа от Apple он работает нормально.

Другие вопросы по тегам