簡體   English   中英

如何在終端中加載 i/o 套件驅動程序擴展?

[英]how to load the i/o kit driver extension in terminal?

現在我正在開發自己的驅動程序。我在 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 文件時,它都會在終端中非常成功地執行。

而且我也是這個內核編程的初學者

首先:我非常不建議您將開發中的 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 是否加載而不會崩潰通常仍然很有幫助。 (例如:IOFramebuffer kexts,或啟動系統本身所需的任何東西,例如查找操作系統卷所需的存儲驅動程序,或網絡啟動所需的網絡驅動程序。)

我還建議不要使用su ,而是在每個需要它的sudo上使用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 的正確位置。 僅在 10.8 或更早版本上使用/System/Library/Extensions 我還更新了內核日志查看。

請查看文檔: 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 的文檔后,它對我來說很好用。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM