[OSX]ドライバについて（driver）

<p>今回は、IOKit driver templateで生成したプロジェクトを使って開発だ。</p>

<p>新規プロジェクトで、IOKit driver templateを選択する。</p>

![20130630_0.jpg](https://qiita-image-store.s3.amazonaws.com/0/12540/b52da196-d109-653a-6fe5-e0d920c3af76.jpeg)


<p>プロジェクト名は、前回の流れからSmartScrollDriverとした。</p>

<p>今回も、前回と同様にTARGETSのArchitecturesのBuild Active Architecture Onlyは、NOを選択する。</p>

<p>SmartScrollDriver-Info.plistのCFBundleIdentifierをcom.MyCompany.driver.${PRODUCT_NAME:rfc1034identifier}に変更する。著者は、MyCompanyに自分の会社のものにしている。</p>

<p>SmartScrollDriver-Info.plistのIOKitPersonalitiesにSmartScrollDriver辞書型を追加して、以下の内容に設定する。</p>

<table border="1">
	<tr>
		<th>Name</th><th>Value</th>
	</tr>
	<tr>
		<td>CFBundleIdentifier</td><td>com.MyCompany.driver.${PRODUCT_NAME:rfc1034identifier}</td>
	</tr>
	<tr>
		<td>IOClass</td><td>com_MyCompany_driver_SmartScrollDriver</td>
	</tr>
	<tr>
		<td>IOKitDebug</td><td>65535</td>
	</tr>
	<tr>
		<td>IOProviderClass</td><td>IOResources</td>
	</tr>
	<tr>
		<td>IOMatchCategory</td><td>com_MyCompany_driver_SmartScrollDriver</td>
	</tr>
</table>

![20130630_1.jpg](https://qiita-image-store.s3.amazonaws.com/0/12540/647832b7-85f9-4896-960c-a14b83454bbf.jpeg)


<p>IOClassは、このドライバの起点となるクラス名の様だ。ようするに、この名前のクラスを実装する事になる。</p>
<p>IOProviderClassは、ドライバがぶら下がるnubクラス名。</p>

<p>テンプレートのSmartScrollDriver.hとSmartScrollDriver.cppは空なので中身を実装する。メソッドが呼ばれたらにデバッグ出力するだけだ。</p>

<pre><code>#include &lt;IOKit/IOService.h&gt;
class jp_co_bitz_driver_SmartScrollDriver : public IOService {
    OSDeclareDefaultStructors(jp_co_bitz_driver_SmartScrollDriver)
public:
    virtual bool init(OSDictionary *dictionary = 0);
    virtual void free(void);
    virtual IOService *probe(IOService *provider, SInt32 *score);
    virtual bool start(IOService *provider);
    virtual void stop(IOService *provider);
};
</code></pre>

<pre><code>#include &lt;IOKit/IOLib.h&gt;
#include "SmartScrollDriver.h"
 
OSDefineMetaClassAndStructors(jp_co_bitz_driver_SmartScrollDriver, IOService)
 
#define super IOService
 
bool jp_co_bitz_driver_SmartScrollDriver::init(OSDictionary *dict)
{
    bool result = super::init(dict);
    IOLog("Initializing\n");
    return result;
}
 
void jp_co_bitz_driver_SmartScrollDriver::free(void)
{
    IOLog("Freeing\n");
    super::free();
}
 
IOService *jp_co_bitz_driver_SmartScrollDriver::probe(IOService *provider,
                                                SInt32 *score)
{
    IOService *result = super::probe(provider, score);
    IOLog("Probing\n");
    return result;
}
 
bool jp_co_bitz_driver_SmartScrollDriver::start(IOService *provider)
{
    bool result = super::start(provider);
    IOLog("Starting\n");
    return result;
}
 
void jp_co_bitz_driver_SmartScrollDriver::stop(IOService *provider)
{
    IOLog("Stopping\n");
    super::stop(provider);
}
</code></pre>

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

<pre><code>cd Build/Products/Debug
</code></pre>

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

<pre><code>$ kextlibs -xml SmartScrollDriver.kext
	&lt;key&gt;OSBundleLibraries&lt;/key&gt;
	&lt;dict&gt;
		&lt;key&gt;com.apple.kpi.iokit&lt;/key&gt;
		&lt;string&gt;11.4.2&lt;/string&gt;
		&lt;key&gt;com.apple.kpi.libkern&lt;/key&gt;
		&lt;string&gt;11.4.2&lt;/string&gt;
	&lt;/dict&gt;
</code></pre>

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

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

<pre><code>$ sudo cp -R SmartScrollDriver.kext /tmp
</code></pre>

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

<pre><code>$ kextutil -n -t /tmp/SmartScrollDriver.kext
No kernel file specified; using running kernel for linking.
Notice: /tmp/SmartScrollDriver.kext has debug properties set.
/tmp/SmartScrollDriver.kext appears to be loadable (including linkage for on-disk libraries).
</code></pre>

<p>ロードしてみる。</p>

<pre><code>$ sudo kextutil -v /tmp/SmartScrollDriver.kext
Password:
Notice: /tmp/SmartScrollDriver.kext has debug properties set.
/tmp/SmartScrollDriver.kext appears to be loadable (not including linkage for on-disk libraries).
Loading /tmp/SmartScrollDriver.kext.
/tmp/SmartScrollDriver.kext successfully loaded (or already loaded).
</code></pre>

<p>確認する。</p>

<pre><code>$ kextstat | grep jp.co.bitz
  162    0 0xb97000   0x4000     0x3000     jp.co.bitz.driver.SmartScrollDriver (1) <4 3>
</code></pre>

<p>アンロード。</p>

<pre><code>$ sudo kextunload -v /tmp/SmartScrollDriver.kext
jp.co.bitz.driver.SmartScrollDriver unloaded and personalities removed.
</code></pre>

関連情報
<a href="http://www.opensource.apple.com/release/mac-os-x-1075/">Mac OS X 10.7.5 - Source</a><br />
<a href="https://developer.apple.com/library/mac/#documentation/Darwin/Conceptual/KEXTConcept/KEXTConceptIntro/introduction.html">Kernel Extension Programming Topics</a><br />

【Cocoa練習帳】
<a href="http://www.bitz.co.jp/weblog/">http://www.bitz.co.jp/weblog/</a><br />
<a href="http://ameblo.jp/bitz/">http://ameblo.jp/bitz/</a>（ミラー・サイト）<br />