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

kum*_*mar 1 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);
}; 
Run Code Online (Sandbox Code Playgroud)

在.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);
}
Run Code Online (Sandbox Code Playgroud)

然后我在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
Run Code Online (Sandbox Code Playgroud)

之后

在OSBundleLibraries字典中,我添加了两个条目

Key                            Type                                   value


com.apple.kpi.iokit          String                                  11.3.0                          

com.apple.kpi.libkern        string                                  11.3.0
Run Code Online (Sandbox Code Playgroud)

之后我再次成功构建它

来到终端加载我按照以下步骤

在终端之前我找到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# 
Run Code Online (Sandbox Code Playgroud)

嘿伙计们请帮助我,其中一个重要的事情就是每当我执行通用驱动程序开发的kext文件时,它在终端中执行非常成功.

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

pmd*_*mdj 9

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

从那里删除你的kext并做这样的事情:

sudo cp -r /path/to/your/IOKIT.kext /tmp/
Run Code Online (Sandbox Code Playgroud)

这也应解决任何权限问题 - 无需运行chmod/chown.然后,作为kextload建议的错误消息,请kextutil改为使用.不要使用kextload,kextutil各方面都要好.

sudo kextutil /tmp/IOKIT.kext
Run Code Online (Sandbox Code Playgroud)

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

sudo kextutil -v /tmp/IOKIT.kext
Run Code Online (Sandbox Code Playgroud)

这应该有希望给你一个更有用的错误信息,然后你可以采取行动.

某些类型的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
Run Code Online (Sandbox Code Playgroud)

在第二个Terminal.app窗口(或通过另一个系统的ssh会话),或启动Console.app并选择左侧的"所有消息"(10.7及更早版本:kernel.log).

更新:我添加了提及/Library/Extensions现在是安装第三方kexts的正确位置.仅适用/System/Library/Extensions于10.8或更早版本.我还更新了内核日志查看.

  • 他可能想到的另一件事是在kextutil上使用"-n"选项,因此它会给他输出,但不会加载.我通常使用-v6来获得最大的冗长度. (2认同)