LoginSignup
13
13

More than 5 years have passed since last update.

[OSX]ドライバについて(kext)

Posted at

Apple開発者のサイトでDarwinのソースコードが公開されているが、ドライバ関連では、文書とサンプルコードも付属しているので、開発したいものに近いサンプルコードを基に拡張していく方法もあるが、今回は、Xcodeの新規プロジェクトから製作してみようと思う。

Open Source - Releases

Mac OS X 10.7.5 - Source

Xcodeでドライバの新規プロジェクトを生成する場合、雛形としては、Generic Kernel ExtensionとIOKit Driverの二種類があるが、その違いについてまとめてみる。

Generic kernel extension template IOKit driver template
開発言語 C Embedded C++
実装方法 コールバック関数 I/O Kitクラスの派生クラス
実行方法 明示的に起動と停止 自動

それでは、kext(generic kernel extension)を作ってみよう。

新規プロジェクトで、Generic kernel extension templateを選択する。

20130623_0.jpg

プロジェクト名は、Smart Scrollという製品に対するプログラムを作成しようと思ったので、サンプルでは、SmartScrollKextとした。

TARGETSのArchitecturesのBuild Active Architecture Onlyは、NOを選択する。これを設定しておかないと、32bitカーネルで動作している開発機で、64bitドライバを生成し、テストに失敗してしまうなどのトラブルに遭遇する可能性がある。

20130623_1.jpg

SmartScrollKext.cにデバッグ出力を追加する。

#include <sys/systm.h>
#include <mach/mach_types.h>
 
kern_return_t SmartScrollKext_start(kmod_info_t * ki, void *d);
kern_return_t SmartScrollKext_stop(kmod_info_t *ki, void *d);
 
kern_return_t SmartScrollKext_start(kmod_info_t * ki, void *d)
{
    printf("SmartScrollKext has started.\n");
    return KERN_SUCCESS;
}
 
kern_return_t SmartScrollKext_stop(kmod_info_t *ki, void *d)
{
    printf("SmartScrollKext has stopped.\n");
    return KERN_SUCCESS;
}

SmartScrollKext-Info.plistのCFBundleIdentifierをcom.MyCompany.kext.${PRODUCT_NAME:rfc1034identifier}に変更する。下記の例では、MyCompanyは著者の会社のものにしている。

20130623_2.jpg

一度、プロジェクトをビルドする。Show the Log NavigatorからSmartScrollKext.kextの出力先を調べて、ターミナル.appで、そのディレクトリに移動する。

cd Build/Products/Debug

そこで以下のコマンドを実行する。

$ kextlibs -xml SmartScrollKext.kext
    <key>OSBundleLibraries</key>
    <dict>
        <key>com.apple.kpi.libkern</key>
        <string>11.4.2</string>
    </dict>

この内容をSmartScrollKext-Info.plistのOSBundleLibrariesに設定する。

20130623_3.jpg

再度、ビルドし、生成されたSmartScrollKext.kextを/tmpにコピーする。

$ sudo cp -R SmartScrollKext.kext /tmp

以下のコマンドで、問題がないか確認する。

$ kextutil -n -print-diagnostics /tmp/SmartScrollKext.kext
No kernel file specified; using running kernel for linking.
/tmp/SmartScrollKext.kext appears to be loadable (including linkage for on-disk libraries).

ログ確認の準備を行う。

$ cd /var/log
$ tail -f kernel.log

ロードする。

$ sudo kextload /tmp/SmartScrollKext.kext

アンロードする。

$ sudo kextunload /tmp/SmartScrollKext.kext

ログにデバッグ出力が印字されている事を確認する。

Jun 24 00:31:39 マシン名 kernel[0]: SmartScrollKext has started.
Jun 24 00:33:08 マシン名 kernel[0]: SmartScrollKext has stopped.

関連情報
Mac OS X 10.7.5 - Source

Kernel Extension Programming Topics

【Cocoa練習帳】
http://www.bitz.co.jp/weblog/

http://ameblo.jp/bitz/(ミラー・サイト)

13
13
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
13
13