2

现在我正在开发自己的驱动程序。我在 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);
}; 

在.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 文件时,它都会在终端中非常成功地执行。

我也是这个内核编程的初学者

4

2 回答 2

10

首先:我非常不建议您将开发中的 kext 复制到/Library/Extensionsor /System/Library/Extensions- 这是一个非常糟糕的主意,可能会导致您的系统无法启动。复制到/Library/Extensions/System/Library/Extensions可以完全自动加载您的 kext,这通常不是您在开发期间想要的(特别是如果它使您的系统崩溃 - 重新启动时,它将重新加载 kext 并再次使系统崩溃等)。

从那里删除您的 kext 并执行以下操作:

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

这也应该解决任何权限问题 - 无需运行 chmod/chown。然后,正如错误消息kextload所暗示的那样,请kextutil改用。不使用kextloadkextutil各方面都更好。

sudo kextutil /tmp/IOKIT.kext

对于其他输出,您可以使用以下-v标志:

sudo kextutil -v /tmp/IOKIT.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 并选择左侧的“所有消息”(10.7 及更早版本:kernel.log)。

更新:我已经添加了/Library/Extensions现在安装第三方 kexts 的正确位置的提及。仅/System/Library/Extensions在 10.8 或更高版本上使用。我还更新了内核日志查看。

于 2012-03-17T11:09:31.307 回答
0

请查看文档: 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 的文档后,它对我来说很好。

于 2012-08-17T09:25:11.870 回答