t0mmy

2020年12月30日に参加

学習履歴詳細

Linuxのしくみ 増量改訂版 6章 デバイスアクセス 読了

やったこと

  • Linuxのしくみ 増量改訂版 6章 デバイスアクセス 読了

学んだこと

学び

  • デバイスファイルの役割
    • プロセスがデバイスファイルへアクセスしたいときに使用するファイル
    • プロセスがデバイスファイルへ直接アクセスできないようにする
  • デバイスファイルには、以下の二種類が存在する
    • キャラクタデバイス
    • ブロックデバイス
  • デバイスファイルとデバイスのやり取り
  • parsistant device name の存在

気付き

  • /dev/ 配下のデバイスファイル名は仮名ぐらいに思っておく
    • これらデバイスファイル名を指定する場合は、「label機能の使用」や「uuidの指定」を行うこと
  • デバイスファイルは、デバイスの抽象化レイヤーと認識。以下の利点がある
    • デバイスごとの違いを吸収し、ユーザから隠匿出来る
    • 言い換えると、ユーザは、デバイス毎に異なる、デバイスのお作法を気にする必要がなくなる
    • ユーザに、直接デバイスを操作させない
    • ユーザとデバイスの間に入り込み、処理要求を制御できる

メモ

概要

プロセスがデバイスにアクセスすると、競合が発生してしまい、予期せぬ動作を引き起こしてしまう。
そのため、カーネルを仲介する形でデバイスへアクセスする。
これにより、カーネルがデバイスへのアクセスを取り仕切る事ができるようになり、デバイスへのアクセスをコントロールでき、ひいては競合問題を解決出来る。

流れ) プロセス ==(カーネルに依頼)==> デバイスファイル ==> デバイスドライバ ==> デバイス操作

デバイスファイル

プロセスがデバイスへアクセスする際は、デバイスファイルを使用する。
デバイスファイルも"ファイル"なので、ファイル操作系 system call で扱うことが出来る。

ls -l 行頭の文字が c の場合はキャラクタデバイス、 b の場合はブロックデバイスを示す。

キャラクタデバイス(キーボード、端末など)は、読み書きを実行できるが、書き込む場所の指定(いわゆるシーク操作)は出来ない。
ブロックデバイス(HDD,SSDなど)は、読み書きとシーク操作を実行できる。

デバイスドライバ

現代では、メモリマップトI/O(MMIO) という仕組みを用いて、デバイスのレジスタにアクセスする。

  • MMIO : デバイスを操作する場合、仮想アドレス空間上に、物理メモリに加えてレジスタ情報もマップする

デバイスドライバが処理の完了を検知するには、以下のどちらかを使用する。

  • ポーリング : デバイスドライバが、デバイスに依頼した処理が完了したか定期的に確認する
  • 割り込み : デバイスが、処理完了をCPUに通知する。CPUは、割り込みハンドラを用いて、デバイスドライバに処理完了を通知する

CPUリソースを十分に活用(CPUをidle状態にして、他の処理に回すことが)できる、「割り込み」が主流。
一方で、「デバイスの処理が高速」かつ「処理が高頻度」な場合は、ポーリングを採用できる。

  • 割り込み時に発生するオーバーヘッドが大きくなりすぎて、ポーリングの方が効率が良くなるような状況

デバイスファイル名は変わりうる

デバイスファイル名は、一定の規則に則って名前が付与される。
特にブロックストレージは、接続した順番で名前が変わりうる。

このため、デバイスファイル名を指定する際は、 /dev/ 配下のデバイスファイル名ではなく、 「parsistant device name」を使用すること。

マウントする時にデバイスファイル名を指定する場合は、 mount コマンドの「label」機能や、デバイスの UUID を指定する事で問題を解決できる。

linux

2023年04月02日(日)

1.5時間