4
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

CocoaAdvent Calendar 2015

Day 12

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

Posted at

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

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

20130630_0.jpg

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

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

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

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

Name Value
CFBundleIdentifier com.MyCompany.driver.${PRODUCT_NAME:rfc1034identifier}
IOClass com_MyCompany_driver_SmartScrollDriver
IOKitDebug 65535
IOProviderClass IOResources
IOMatchCategory com_MyCompany_driver_SmartScrollDriver

20130630_1.jpg

IOClassは、このドライバの起点となるクラス名の様だ。ようするに、この名前のクラスを実装する事になる。

IOProviderClassは、ドライバがぶら下がるnubクラス名。

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

#include <IOKit/IOService.h>
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);
};
#include <IOKit/IOLib.h>
#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);
}

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

cd Build/Products/Debug

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

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

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

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

$ sudo cp -R SmartScrollDriver.kext /tmp

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

$ 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).

ロードしてみる。

$ 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).

確認する。

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

アンロード。

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

関連情報
Mac OS X 10.7.5 - Source

Kernel Extension Programming Topics

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

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

4
4
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
4
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?