MacOSでドライバ開発：DriverKit入門① ～DriverKit用プロジェクトの作成～

# このシリーズについて
これまでのMacOSでデバイスドライバを作成する場合、カーネル拡張（Kernel Extension)を作成する必要がある。
カーネル拡張はその名の通りカーネル空間で実行されるため、カーネルパニックなどの致命的なエラーを起こしやすく、開発時のデバッグにも時間がかかる。
これは、デバイスドライバ開発が難しいといわれる一つの要因だと言えるだろう。

そんなデバイスドライバ開発に対して、大きな転機が訪れる。
Apple社は[WWDC2019](https://developer.apple.com/videos/play/wwdc2019/702/)において、macOSのセキュリティと安定性を高めるためにデバイスドライバをカーネル空間からユーザー空間に移動することを発表した。
これは、新しいフレームワークである「System Extension」と「DriverKit」を使用することで、ユーザー空間のデバイスドライバの作成ができるようになるというものだ。

さらに、WWDC2020で発表された新しいOS「macOS Big Sur」からはカーネル拡張ベースのドライバが[一部を除いて実行できなくなってしまった](https://developer.apple.com/support/kernel-extensions/)。

デバイスドライバの開発者としては、いち早くこの新しいドライバ技術を身につける必要があるだろう。

新しいフレームワークということもあり、ネット上の情報が圧倒的に少ないので手探りでの勉強になった。
このシリーズを通して、これまでの勉強で身につけたデバイスドライバの開発に必要な知識を共有していきたいと思う。

# ドライバプロジェクトの作成
カーネル拡張で実装したドライバは`System/Library/Extension`または`/Library/Extension`配下に配置するだけでOS側からドライバとして認識されていた。
`DriverKit`ドライバの場合、`SystemExtension`フレームワークのAPIを呼んでシステム拡張（system extension)としてインストールする必要がある。
システム拡張インストールAPIを呼ぶアプリケーションを作成して、アプリバンドル内の`Contents/Library/SystemExtensions`フォルダにドライバを配置しないとドライバをインストールできない。

このような構成のアプリ＋ドライバ用のプロジェクトの作成手順を見ていこう

## プロジェクト作成
今回はXcode12を使用している。新しいフレームワークを使用するということもあり最新のXcodeの方がテンプレートとかも改良されていて開発が快適だ。

まずアプリケーションテンプレートを使ったプロジェクトを作成する。
![https://raw.githubusercontent.com/gmorimoto-spc/qiita-src/master/driverKit/01_createProject.png](https://raw.githubusercontent.com/gmorimoto-spc/qiita-src/master/driverKit/01_createProject.png)

![https://raw.githubusercontent.com/gmorimoto-spc/qiita-src/master/driverKit/02_createApp.png](https://raw.githubusercontent.com/gmorimoto-spc/qiita-src/master/driverKit/02_createApp.png)

## ドライバの追加
プロジェクトが作成できたら、プロジェクトに新しいターゲットを追加してDriverKitドライバをプロジェクトに追加する。

![https://raw.githubusercontent.com/gmorimoto-spc/qiita-src/master/driverKit/03_addTarget.png](https://raw.githubusercontent.com/gmorimoto-spc/qiita-src/master/driverKit/03_addTarget.png)

ターゲットのテンプレートの選択画面で一番下にシステム拡張があるので、そこからDriverKitのテンプレートを選択する。テンプレートを使用することによって、アプリやドライバの基本設定、アプリバンドルのファイル構成設定を自動的にXcodeが設定してくれる。

![https://raw.githubusercontent.com/gmorimoto-spc/qiita-src/master/driverKit/04_addDriver.png](https://raw.githubusercontent.com/gmorimoto-spc/qiita-src/master/driverKit/04_addDriver.png)

## 設定の確認
新しいターゲットがプロジェクトに追加された。ドライバの設定を確認するとすでに`DriverKit.framework`がフレームワークとして追加されている。

![https://raw.githubusercontent.com/gmorimoto-spc/qiita-src/master/driverKit/05_driverSetting.png](https://raw.githubusercontent.com/gmorimoto-spc/qiita-src/master/driverKit/05_driverSetting.png)

アプリの設定を確認すると、プロジェクトにドライバを追加したことによりアプリの`Content`としてドライバが追加されている。

![https://raw.githubusercontent.com/gmorimoto-spc/qiita-src/master/driverKit/06_appSetting.png](https://raw.githubusercontent.com/gmorimoto-spc/qiita-src/master/driverKit/06_appSetting.png)

アプリの`Build Phase`の方でもドライバが追加されている。

![https://raw.githubusercontent.com/gmorimoto-spc/qiita-src/master/driverKit/07_appBuildPhase.png](https://raw.githubusercontent.com/gmorimoto-spc/qiita-src/master/driverKit/07_appBuildPhase.png)

この手順でプロジェクトを作成することによってここら辺を設定する手間が省ける。

# おわりに
シリーズの第1弾はプロジェクトの作成で終了。次回はシステム拡張インストール用のAPIをアプリ側に実装していく。

## 参考資料
https://developer.apple.com/system-extensions/
https://developer.apple.com/videos/play/wwdc2019/702/
https://developer.apple.com/documentation/driverkit
https://developer.apple.com/documentation/kernel/implementing_drivers_system_extensions_and_kexts
https://developer.apple.com/support/kernel-extensions/