デバイスドライバの働き

# 色々なデバイス
デバイスを直接操作するためには、各デバイスに内蔵されているレジスタという領域を読み書きします。具体的にどのようなレジスタがあるか、```どのレジスタにアクセスするとどのような操作をするのかは各デバイスによって異なります```。

### 気づき
レジスタはCPUについてる記憶装置だったような気がする。それでレジスタが各デバイスによって異なるということは部品それぞれがデバイスになるのかな。いろんな記憶するものを連携してパソコンはできてるんだな。
改めて思う。

# プロセスのデバイス操作
* プロセスが```デバイスファイルを介して```、デバイスドライバに対してデバイスを操作してほしいと依頼する
* CPUがカーネルモードに切り替わり、デバイスドライバが```レジスタを介して```デバイスに要求を伝える。
* デバイスが要求に応じた処理をする
* デバイスドライバがデバイスの処理完了を検出して結果を受け取る
* CPUがユーザモードに切り替わり、プロセスがデバイスドライバの処理完了を検出して結果を受け取る。

### 気づき
デバイスドライバ、レジスタを介して要求対象のデバイスを操作するのか

# メモリマップトI/O(MMIO)
x８６_64アーキテクチャにおいては、Linuxカーネルは自身の仮想アドレス空間に物理メモリを全てマップしています。

### 気づき
メモリマップI/Oという仕組みによってデバイスのレジスタにアクセスします
図を見るとプロセスの要求によってレジスタを介してデバイスを操作することでメモリ領域が割り当てられる

#### "マップする"の意味なんだったけ？
#### 出典
https://wa3.i-3-i.info/word1347.html

ディスク上のファイルの一部または全体を、```アプリケーションのアドレス空間内の一定のアドレス範囲にマッピング```する方法です。これによってアプリケーションでは、動的メモリへのアクセスと同様にディスク上のファイルにアクセスできるようになります。
#### 出典
https://jp.mathworks.com/help/matlab/import_export/overview-of-memory-mapping.html#:~:text=%E3%83%87%E3%82%A3%E3%82%B9%E3%82%AF%E4%B8%8A%E3%81%AE%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%81%AE%E4%B8%80%E9%83%A8%E3%81%BE%E3%81%9F%E3%81%AF%E5%85%A8%E4%BD%93%E3%82%92%E3%80%81%E3%82%A2%E3%83%97%E3%83%AA%E3%82%B1%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%E3%81%AE%E3%82%A2%E3%83%89%E3%83%AC%E3%82%B9%E7%A9%BA%E9%96%93%E5%86%85%E3%81%AE%E4%B8%80%E5%AE%9A%E3%81%AE%E3%82%A2%E3%83%89%E3%83%AC%E3%82%B9%E7%AF%84%E5%9B%B2%E3%81%AB%E3%83%9E%E3%83%83%E3%83%94%E3%83%B3%E3%82%B0%E3%81%99%E3%82%8B%E6%96%B9%E6%B3%95%E3%81%A7%E3%81%99%E3%80%82%E3%81%93%E3%82%8C%E3%81%AB%E3%82%88%E3%81%A3%E3%81%A6%E3%82%A2%E3%83%97%E3%83%AA%E3%82%B1%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%E3%81%A7%E3%81%AF%E3%80%81%E5%8B%95%E7%9A%84%E3%83%A1%E3%83%A2%E3%83%AA%E3%81%B8%E3%81%AE%E3%82%A2%E3%82%AF%E3%82%BB%E3%82%B9%E3%81%A8%E5%90%8C%E6%A7%98%E3%81%AB%E3%83%87%E3%82%A3%E3%82%B9%E3%82%AF%E4%B8%8A%E3%81%AE%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%81%AB%E3%82%A2%E3%82%AF%E3%82%BB%E3%82%B9%E3%81%A7%E3%81%8D%E3%82%8B%E3%82%88%E3%81%86%E3%81%AB%E3%81%AA%E3%82%8A%E3%81%BE%E3%81%99%E3%80%82

ITの分野では、ある集合の要素を何らかの規則に基づいて別の集合や要素へ対応付けたり、字義通り、要素の分布や配置を地図などの上に図示することなどを意味する。

#### 出典
https://e-words.jp/w/%E3%83%9E%E3%83%83%E3%83%94%E3%83%B3%E3%82%B0.html#:~:text=IT%E3%81%AE%E5%88%86%E9%87%8E%E3%81%A7%E3%81%AF%E3%80%81%E3%81%82%E3%82%8B%E9%9B%86%E5%90%88%E3%81%AE%E8%A6%81%E7%B4%A0%E3%82%92%E4%BD%95%E3%82%89%E3%81%8B%E3%81%AE%E8%A6%8F%E5%89%87%E3%81%AB%E5%9F%BA%E3%81%A5%E3%81%84%E3%81%A6%E5%88%A5%E3%81%AE%E9%9B%86%E5%90%88%E3%82%84%E8%A6%81%E7%B4%A0%E3%81%B8%E5%AF%BE%E5%BF%9C%E4%BB%98%E3%81%91%E3%81%9F%E3%82%8A%E3%80%81%E5%AD%97%E7%BE%A9%E9%80%9A%E3%82%8A%E3%80%81%E8%A6%81%E7%B4%A0%E3%81%AE%E5%88%86%E5%B8%83%E3%82%84%E9%85%8D%E7%BD%AE%E3%82%92%E5%9C%B0%E5%9B%B3%E3%81%AA%E3%81%A9%E3%81%AE%E4%B8%8A%E3%81%AB%E5%9B%B3%E7%A4%BA%E3%81%99%E3%82%8B%E3%81%93%E3%81%A8%E3%81%AA%E3%81%A9%E3%82%92%E6%84%8F%E5%91%B3%E3%81%99%E3%82%8B%E3%80%82

### 気づき
メモリデバイスがメモリ領域を取得したところを基準にして０、１０、２０、３０、４０のプロセス（スレッドか？）がそれぞれ役割をすることでストレージデバイスからレジスタを介してアクセスしてデータを取得しているのか。

#### オフセットってなんだっけ
位置を基準点からの距離で表した値のこと。
#### 出典
https://wa3.i-3-i.info/word11923.html#:~:text=%E4%BD%8D%E7%BD%AE%E3%82%92%E5%9F%BA%E6%BA%96%E7%82%B9%E3%81%8B%E3%82%89%E3%81%AE%E8%B7%9D%E9%9B%A2%E3%81%A7%E8%A1%A8%E3%81%97%E3%81%9F%E5%80%A4%E3%81%AE%E3%81%93%E3%81%A8%E3%80%82

# ポーリング
デバイスドライバが能動的にデバイスの処理が完了したかどうかを確認します。デバイスは、デバイスドライバから依頼された処理が完了すると、```自身の処理完了通知用レジスタの値を変化```させます。デバイスドライバはその値を```定期的に読み出す```ことによって処理の完了を検出します。
...
デバイスドライバが完了するまで、```CPUはほぼ他のことができません```。
...
```デバイスに処理を依頼してから完了までの所要時間はミリ秒、マイクロ秒単位```が当たり前に対して、```CPUの１命令実行するのにかかる時間はナノ秒、あるいはもっと短い時間```なのを考えると無駄の大きさをある程度想像していただけるかと思います。

### 気づき
CPU処理速度が早いが応答先のデバイスの処理速度が遅いのでCPUにとって時間の無駄になるのか。
その無駄を減らすためにポーリングを使うのか

# デバイス側の割り込みの流れ
* ```デバイスドライバがデバイスに処理を依頼```する。この後CPUでは別の処理を動かせる
* デバイスが処理を完了すると、```割り込みという仕組みによってCPUに通知```する。
* CPUは、あらかじめデバイスドライバが、割り込みコントローラというハードウェアに登録しておいた、```割り込みハンドラ```という処理を呼び出す。
* ```割り込みハンドラがデバイスの処理結果を受け取る```

### 気づき
他デバイスから通知してもらえた方がCPUもしっかり他の作業ができる。
何かしら結果を受け取る時はハンドラが受け取るんだな。
聞いただけど他デバイスの方から通知された方が良さそうだけど

### デバイス側の割り込みを見てみよう
ストレージデバイスに処理を依頼した時に、割り込みの数が増加する様子を確認します。システムが起動してから```現在までの割り込みの数は/proc/interrupts```というファイルを見ればわかります。

```
vboxuser@**************:*******$:~$ cd study
vboxuser@**************:*******$:~/study$ cat /proc/interrupts 
           CPU0       
  0:         34   IO-APIC   2-edge      timer
  1:        171   IO-APIC   1-edge      i8042
  8:          0   IO-APIC   8-edge      rtc0
 ....
LOC:    1055694   Local timer interrupts
....
PIW:          0   Posted-interrupt wakeup event
```
### 気づき
これだけデバイス側から割り込みがあるのか
```
vboxuser@**************:*******$ while true ; do grep Local /proc/interrupts ;sleep 1 ; done
LOC:    1086651   Local timer interrupts
....
LOC:    1093926   Local timer interrupts
```
### 気づき
割り込みを多くしたら本当増えている

# 出典
https://gihyo.jp/book/2022/978-4-297-13148-7

# 感想
一回で理解できないなら実践しながらすればいい。
とりあえず言葉の意味を理解しよう。頑張ろう