如何在终端中加载i / o kit驱动程序扩展?

时间:2012-03-17 09:54:08

标签: macos terminal kernel iokit

现在我正在开发自己的驱动程序。我在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文件时,它就会非常成功地在终端中执行。

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

2 个答案:

答案 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。不要使用kextloadkextutil在各方面都会更好。

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)

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