现在我正在开发自己的驱动程序。我在i / o 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);
};
in .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文件时,它就会非常成功地在终端中执行。
我也是初学者这个内核编程
答案 0 :(得分:9)
首先:我非常不建议将开发中的密钥复制到/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之前手动加载时,通常仍然有助于完整性检查kext加载而不会崩溃。 (例如:IOFramebuffer kexts,或引导系统本身所需的任何内容,例如查找操作系统卷所需的存储驱动程序,或netboot所需的网络驱动程序。)
我还建议不要使用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并选择左侧的“All Messages”(10.7&old;:kernel.log)。
更新:我添加了/Library/Extensions
的提及,现在是安装第三方关键字的正确位置。仅在10.8或更早版本上使用/System/Library/Extensions
。我还更新了内核日志查看。
答案 1 :(得分:0)
$ sudo cp -R MyDriver.kext /tmp
$ sudo chown -R root:wheel MyDriver.kext
在关注Apple的文档后,它对我来说很好。