デバイスドライバを勉強していてわからなかったことまとめ

会社で行われているセミナーで、デバイスドライバについて発表することになったため、デバイスドライバについての勉強を行っています。私はこれまでほとんど触れたことがなかったためわからないことばかりでした。
今からデバイスドライバを勉強してみようと思っている人や、今勉強していてわからないことが多いなという方のお役に立てるように、復習もかねてわからなかったことをまとめようと思います。

## 目次
1. まずデバイスドライバとは？
2. プログラム全般の知識
3. ドライバ全般の知識
4. Macドライバの知識
5. 終わりに
6. 参考にしたサイト

## まずデバイスドライバとは？
デバイスドライバはPCと周辺機器(デバイス)の橋渡しをするソフトウェアのことです。周辺機器とはモニターやキーボード、スピーカー、プリンターなどです。
デバイスドライバは身近なところで言うと皆さんが使っているスマートフォンにも使われています。

デバイスドライバについて説明している弊社の記事がありますのでよろしければご覧ください。

https://qiita.com/spc_canbe/items/30487b56bfb1f47e8d14

## プログラム全般の知識

先ほどのリンクの記事を読んでいて、私がわからなかったことをまとめました。
デバイスドライバ以前のプログラムの知識なので、もうわかってるよという方は読み飛ばしていただいて構いません。
### インターフェースとは？
インターフェースはクラスとクラスの窓口のようなもので、クラス同士のやり取りを容易にしてくれます。
例えばUserとtestの2つのクラスがあるとします。
testを変更すると、その変更点をUserが使っていればすべて修正する必要があります。
しかし、testのインターフェースを作成して、testをインターフェースに準拠して実装していれば、testを変更しても、Userがその影響を受けることがありません。
インターフェースにはこのような利点があるため、使うとよい設計になるといわれています。

### APIとは？
APIとは、アプリケーション・プログラミング・インターフェースの略です。
2つのアプリケーションやソフトウェア同士が情報をやり取りする際に使用される、プログラミング上の窓口のようなものです。

## ドライバ全般の知識
### カーネル空間とユーザー空間とは？
#### カーネル空間
まず、カーネルとはオペレーティングシステム(OS)の中核となるソフトウェアのことです。カーネルは動作中のプログラムの実行状態を管理したり、ハードウェア資源を管理してプログラムがハードウェアの機能を利用する手段を提供したりとよりハードウェアに近い処理、機能を担っています。
このカーネルが動作するところがカーネル空間です。
#### ユーザー空間
ユーザーとは文字通り、今PCなどを操作している私たちのことです。OSでよりユーザに近い処理、機能を担っている個々のアプリケーションが動作している空間のことをユーザー空間といいます。
OSは一般的なものはこのユーザー空間と先ほどのカーネル空間に分けることができます。
### なぜカーネル空間とユーザー空間を分けているの？
先ほど記述した通り、カーネルはシステムの中核であるため、カーネルが動いているメモリ領域が侵されてしまうと、OSが停止してしまいます。もしカーネル空間とユーザー空間が分けられていなかった場合、アプリケーションでバグが起こってしまうとカーネル空間にも影響が及んでしまう可能性があります。
カーネル空間とユーザー空間でメモリ領域を分けてお互いの領域にアクセスできないようにすればOSが停止することを防ぐことができるため、カーネル空間とユーザー空間を分けています。

## Macドライバの知識
### SystemExtensionとDriverKitとは？
#### SystemExtension
SystemExtensionはシステム拡張機能のことです。システム拡張機能はバックグラウンドで働き、Macの機能を拡張してくれます。
SystemExtensionでは、カーネルレベルのアクセスを必要とせず、macOSの機能の拡張を行うことができます。
#### DriverKit
DriverKitはドライバ用のフレームワークで、macOSなどのデバイスドライバの基本的な動作を定義しています。フレームワークとはシステム開発が楽に行えるように用意されたプログラムのことです。これを利用することにより開発が楽になり、効率を上げることができます。
DriverKitが出てくる前までは、カーネル拡張が使われていましたが、これはカーネル空間で動作するもので、問題が起きればカーネルパニックが発生していました。
DriverKitはmacOS10.15から導入され、DriverKitで作成したドライバはユーザー空間で動作します。そのため、macOSのセキュリティと安定性が保たれます。

特定のタイプのデバイスのサービスを実装するには以下のフレームワークを実装する必要があります。
* HIDDriverKit：キーボードやポインティングデバイスなどヒューマンインターフェースデバイス
* USBDriverKit：USBベースのデバイス
* NetworkingDriverKit：イーサネットネットワークデバイス
* SerialDriverKit：Macに接続されるシリアルI/Oデバイス
* USBSerialDriverKit：Macに接続されるシリアルのUSBデバイス

### IOKitとは？
IOKitはmacOSの標準フレームワークの一つです。
カーネルに近い部分のデータにアクセスするためのライブラリであり、主にCPU負荷やメモリ使用量などのOS状態やシリアル番号などのハードウェアに関する詳細な情報を取得および設定したり、デバイスドライバを開発したりする際に用います。
macOS標準のフレームワークの大部分はObjectiv-Cで書かれていますが、IOKitはC++で書かれています。

#### IOService
IOServiceはドライバのセットアップと登録を管理するための基本クラスです。
ユーザーがデバイスを接続すると、システムはそのデバイスとの相互作用を管理するために１つまたは複数のサービスを作成します。
Appleのビルトインドライバファミリーではほとんどのデバイスと標準のインターフェースをサポートしており、デバイスを接続するとシステムはその中からデバイスの能力に一番適したサービスオブジェクトを探します。
デバイスのカスタム操作をサポートするためにカスタムのサービスオブジェクトを提供するのですが、ほとんどの場合、IOService自身ではなく、IOServiceの子クラスをサブクラス化します。
サブクラス化したクラスのメソッドを使って、ドライバの初期化やセットアップ及び破棄の処理をしたり、デバイスとインターフェースのI/Oレジストリエントリの設定をしたり、パワーレベルの変更に対応したりします。

## 終わりに
今回デバイスドライバを勉強している中で感じたことはわからないことが多いなということです。初めて学ぶことなので、わからないことが多いのは当然なのですが、デバイスドライバ以前の知識が足りていなくて勉強の時間が余計にかかってしまいました。少しずつでも毎日勉強して、プログラムやデバイスドライバの知識を深めていこうと思います。

まだまだ知識や経験が浅いため、誤字脱字のご指摘はもちろん、「ここわかりにくい」や「ここ間違ってる」などがあればコメント等、是非よろしくお願いします。
最後までお読みいただきありがとうございました。


## 参考にしたサイト
デバイスドライバ：https://qiita.com/spc_canbe/items/30487b56bfb1f47e8d14
インターフェイス：https://qiita.com/yutorisan/items/d28386f168f2f3ab166d
カーネル空間：https://www.wdic.org/w/TECH/%E3%82%AB%E3%83%BC%E3%83%8D%E3%83%AB%E7%A9%BA%E9%96%93
ユーザー空間：https://www.wdic.org/w/TECH/%E3%83%A6%E3%83%BC%E3%82%B6%E3%83%BC%E7%A9%BA%E9%96%93
SystemExtenton：https://developer.apple.com/jp/system-extensions/
DriverKit：https://support.apple.com/ja-jp/guide/security/secd0a47c14c/web
IOKit：https://monobook.org/wiki/IOKit#:~:text=IOKit%20I%2FO%20Kit,%E3%81%A8%E3%81%AF%E3%80%81%20macOS%20%E3%81%AE%E6%A8%99%E6%BA%96%E3%83%95%E3%83%AC%E3%83%BC%E3%83%A0%E3%83%AF%E3%83%BC%E3%82%AF%EF%BC%88%E6%A8%99%E6%BA%96%E3%83%A9%E3%82%A4%E3%83%96%E3%83%A9%E3%83%AA%EF%BC%89%E3%81%AE%E3%81%B2%E3%81%A8%E3%81%A4%E3%81%A7%E3%81%82%E3%82%8B%E3%80%82
IOService：https://developer.apple.com/documentation/driverkit/ioservice