トップ «前の日記(2013-06-17) 最新 次の日記(2013-06-30)» 編集

Cocoa練習帳

iOS/iPhone/iPad/watchOS/tvOS/MacOSX/Android プログラミング, Objective-C, Cocoa, Swiftなど

2012|01|02|03|04|05|06|07|08|09|10|11|12|
2013|01|02|03|04|05|06|07|08|09|10|11|12|
2014|01|02|03|04|05|06|07|08|09|10|11|12|
2015|01|02|03|04|05|06|07|08|09|10|11|12|
2016|01|02|03|04|05|06|07|08|09|10|11|12|
2017|01|02|03|04|05|06|07|08|09|10|11|12|
2018|01|02|03|04|05|06|07|08|09|10|11|12|
2019|01|02|03|04|05|06|07|08|09|10|11|12|
2020|01|02|03|04|05|06|07|08|09|10|11|12|
2021|01|02|03|04|05|06|07|08|09|10|11|12|
2022|01|02|03|04|05|06|07|08|09|10|11|12|
2023|01|02|03|04|05|06|07|08|09|10|11|12|
2024|01|02|03|

2013-06-23 [OSX]ドライバについて(kext)

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

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

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

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

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

新規プロジェクトkext

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

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

アーキテクチャ

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は著者の会社のものにしている。

CFBundleIdentifier

一度、プロジェクトをビルドする。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に設定する。

OSBundleLibraries

再度、ビルドし、生成された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.

_ 【Cocoa練習帳】

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

トップ «前の日記(2013-06-17) 最新 次の日記(2013-06-30)» 編集