ver. 0.9 by inADA
kextドライバを検証するには準備が必要です。
Fig 3. Directory Utility
kextドライバはカーネル内で動作します。カーネルに関連する場所を操作するにはルートのアクセス権が必要です。
Mac OS Xでは/System/Library/CoreServices/にあるDirectory Utility.app(ディレクトリユーティリティ.app)と言うアプリケーションを利用してルートを有効にします。
Directory Utility.appを起動して、Edit(編集)メニューからルートを有効にしてパスワードを設定してください。これにより、Terminalでsuあるいはsudoが利用できます。
kextドライバからsystem.logあるいはkernel.logにデータを出力することにより、その動作状況を知ることができます。mDriver.kextはsystem.logに出力しています。
二つのログは/Applications/Utilities/にあるConsole.app(コンソール.app)でモニタできます。また、Terminalで二つのウィンドウを開き、それぞれに以下のように命令しても最新の状況を見ることもできます。なお、それぞれの終了はcontrol + cです。
tail -f -n 30 /var/log/kernel.log
tail -f -n 30 /var/log/system.log
カーネル内での作業は一つ間違えると、システムクラッシュに繋がります。kextドライバのコピーなど同じ命令を繰り返す作業はShell Script(シェルスクリプト)を書くことで、不必要なリスクを避けるようにすると作業効率が上がります。Shell Scriptの書き方や設定方法はUnixの解説などを参考にしてください。
Mac OS X 10.7.xでは、Xcodeで生成したkextドライバは/System/Library/Extensions/にコピーすると、kextドライバのownerとpermissionsは適切な設定に変更されます。
しかし、下記のkextloadとkextutilを利用するためには、kextドライバのownerとpermissionsを変更しなくてはなりません。この変更はビルドする時に毎回しますので、Shell Scriptを書くか、XcodeのBuild PhasesにShell Scriptを登録すると良いでしょう。
Terminalを使用するShell Scriptでは以下のようになります。
#!/bin/csh -f
sudo /usr/sbin/chown -R root:wheel $argv[1]
sudo find $argv[1] -type d -exec /bin/chmod 0755 {} \;
sudo find $argv[1] -type f -exec /bin/chmod 0644 {} \;
Xcodeでは[Navigate]メニューから[Reveal in Project Navigator]を選択します。画面の左欄の[mDriver]を選択し、その右に表示される欄から[TARGETS > mDriver]を選択します。さらに右欄から[Build Phases]タブを選択し、右下の[Add Build Phase]ボタンのポップアップ メニューから[Add Run Script]を選択して、上記のスクリプトを元に必要事項を入力してください。
Terminalのツールkextloadとkextutilを使用することにより、kextドライバを検証できます。kextutilはkextドライバのownerとpermissions、Info.plisの設定などを調べます。
kextloadはkextドライバを読み込みます。ただし、初期化と終了時に処理される場所が起動時とは異なるため、最終的な動作検証はkextドライバを/System/Library/Extensions/にコピーして再起動することになります。kextlunoadによりkextドライバをアンロードさせることができますが、非同期コールの処理などが原因で完全にはアンロードできない場合があります。
それぞれのツールを事項するにはルートのアクセス権が必要です。suまたはsudoによりルートのアクセス権でkextutilにkextドライバを引数として渡してkextドライバが正しく設定されいるかを調べます。次にkextloadにkextドライバを引数として渡して動作検証します。kextドライバが正常にロードされると、system.logに以下の行に似たような項目が表示されます。
USBF: 120.166 com_inADAinc_driver_mDriverClass[0x2aea400] ::start - USB Generic Mouse @ 4 (0x120000)
コンパイルが通っても正常に動作しない場合には、各関数に以下のコードを書き込むことにより、system.logにIOLogのテキストが出力されます。
IOLog("You are here.\n");
IOLogの書式はprintfと同じで変数を表示することもできます。system.logファイルを調べることによりプログラムがどこまで実行されているかを知ることができます。
誤動作の状況が複雑な場合には、GDBデバッガを利用したツーマシン・デバッグの機能もMac OS Xにあります。
kextに関する資料はAppleの開発者向けサイトにあります。kextについて検索すると、この記事を書いている時点で81件の資料がヒットしました。その中にはkextに関する基本資料をまとめたKernel Extension Programing Topis、kextドライバを64 bit化する場合の資料64-Bit Transition Guide: Kernel Extensions and Driversなどがあります。