Как загрузить расширение драйвера комплекта ввода / вывода в терминал?
Сейчас я разрабатываю свой собственный драйвер. Я разрабатываю шаблон ввода / вывода 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 он работает нормально.