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辞書以下の5つのコンテンツを追加しました

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辞書に2つのエントリを追加しました

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# 

やあみんな私を助けてください、そして重要なことの1つは私が汎用ドライバーによって開発されたkextファイルを実行するときはいつでもそれがターミナルで非常にうまく実行されることです。

また、私はこのカーネルプログラミングの初心者です

4

2 に答える 2

10

まず第一に、開発中の kext をorにコピーすることはあまりお勧めしません。これは非常に悪い考えであり、システムが起動できなくなる可能性があります。kextにコピーしたり、完全に自動的にロードしたりできますが、これは通常、開発中に必要なことではありません (特に、システムがクラッシュする場合はそうではありません。再起動時に kext がリロードされ、システムが再びクラッシュするなど)。/Library/Extensions/System/Library/Extensions/Library/Extensions/System/Library/Extensions

そこから 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それを必要とする各コマンドで使用することをお勧めします。とにかく、しばらくの間パスワードを覚えています。

カーネル ログを表示するには、次のいずれかを実行します。

# 10.12+:
log stream
# 10.8-10.11:
tail -f /var/log/system.log
# 10.7 and earlier:
tail -f /var/log/kernel.log

2 番目の Terminal.app ウィンドウ (または別のシステムからの ssh セッション経由) で、または Console.app を起動し、左側で [すべてのメッセージ] (10.7 以前: kernel.log) を選択します。

更新:/Library/Extensionsサードパーティの kext をインストールする正しい場所についての言及を追加しました。/System/Library/Extensions10.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 に答える