как загрузить расширение драйвера комплекта ввода / вывода в терминал? - PullRequest
1 голос
/ 17 марта 2012

Сейчас я разрабатываю свой собственный драйвер. Я разрабатываю шаблон ввода / вывода 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 ]

9 голосов
/ 17 марта 2012

Прежде всего: я очень не рекомендую копировать кексы в процессе разработки в /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 или все, что требуется для загрузки самой системы, например, драйверы хранилища, необходимые для поиска тома операционной системы, или сетевые драйверы, необходимые для сетевой загрузки.)

I 'Мы также рекомендуем не использовать 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 или старше.Я также обновил просмотр журнала ядра.

0 голосов
/ 17 августа 2012

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

...