gpt4 book ai didi

macos - 如何在终端加载 I/O 套件驱动程序扩展?

转载 作者:行者123 更新时间:2023-12-05 08:44:28 29 4
gpt4 key购买 nike

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

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

最佳答案

首先:我非常不建议将开发中的 kexts 复制到 /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,或启动系统本身所需的任何东西,例如查找操作系统卷所需的存储驱动程序,或网络启动所需的网络驱动程序。)

我还建议不要使用 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 session ),或启动 Console.app 并选择左侧的“所有消息”(10.7 及更早版本:kernel.log)。

更新:我添加了对/Library/Extensions 的提及,它现在是安装第三方内核扩展的正确位置。仅在 10.8 或更早版本上使用 /System/Library/Extensions。我还更新了内核日志查看。

关于macos - 如何在终端加载 I/O 套件驱动程序扩展?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9748985/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com