読み込み時の動き
- あるプロセスがあるファイルをfopenの後、(ライブラリ関数の)freadをする
- fread中ではシステムコールread()を呼ぶ。
- read()はソフトウェア割り込みとして実行開始。
- もしファイルがメモリ上にあればこれを戻り値にしてシステムコール終了。
- そうでなければディスクからファイルを(急いで)読み出さなくてはならない。
- プロセスを中断し、ディスクのデバイスキューに移動しwaiting状態にする。
- (その後)ディスクが使用できる状態になったら、システムコール再開する。
- read要求をディスクのデバイスドライバに送る。
- デバイスドライバはカーネル中にデータ受信用のバッファを用意して、 l/O機器のデバイスコントローラにコマンドを送る。(指定の番地にあるレジスタにコマンドを書き込む。)
- デバイスコントローラは、ディスクからファイルを読み出し、
- ファイルデータをDMA転送でメモリ上のバッファに(CPUを使わずに)送る。
- DMA転送終了時に割り込みを発生する。
- 割り込みハンドラがディスクのデバイスドライバを起動。
- デバイスドライバは、ファイルの準備が完了したことを確認し終了。
カーネルI/Oサブシステムは、プロセスにメモリ上のファイルの位置を渡し、プロセスをReadyキューに戻し、read()システムコール終了。
I/Oシステムより
- Operating Systems: I/O Systems
他に参考になる資料
書き込み時の動き(ライトバック)
ライトバックはカーネルメモリのページキャッシュにデータを書き込んだタイミングでアプリ側に完了のレスポンスを返す。ページキャッシュとディスクの差分をDirtyCacheという形で管理し、後々同期をするのだがその前にクラッシュなどするとデータが破損する。
巷にはこれを避けるためディスクに不揮発性のメモリを蓄えて、ライトバックで書き込む先をこのディスクのメモリにすることでクラッシュしても問題ないようにする仕組みもある。
書き込み時の動き(ライトスルー)
AWSのインスタンスではライトスルーになっているので、基本的に安全性の高いこっちにするのがデフォルトっぽい。
$ uname -a Linux ip-10-0-0-123.ap-northeast-1.compute.internal 4.14.231-173.361.amzn2.x86_64 #1 SMP Mon Apr 26 20:57:08 UTC 2021 x86_64 x86_64 x86_64 GNU/Linux $ cat /sys/block/nvme0n1/queue/write_cache write through
デバイスドライバとは
ここでのデバイスは補助記憶装置とする(要するにデバイスドライバの場合は、SSDやHDDのデバイスドライバという想定)
デバイスドライバは、制御対象のデバイスを適切にコントロールし、ハードウェアが提供する機能を運用。
アプリケーションをはじめとする他のプログラムに対して、機能を実現するために不可欠なAPI内の実装を提供するソフトウェアです
デバイスコントローラーは、デバイスとOSの仲介役であり、デバイスドライバーは、デバイスコントローラーとOSのインターフェースである。基本的に、デバイスドライバはデバイスコントローラを理解し、OSの他の部分にデバイスへの統一されたインターフェースを提供します。
デバイスドライバがデバイスを認識する仕組み
はじめて学ぶデバイスドライバ開発。組み込みLinuxによるハードウェア制御の仕組みを学ぶ | APS|半導体技術コンテンツ・メディア
デバイスコントローラ
ハードウェアデバイスとオペレーティングシステムまたはアプリケーションプログラムとの間のブリッジとして機能するハードウェアコンポーネントです。
Difference Between Device Driver and Device Controller | Difference Between
I/Oデバイスへのアクセス方法(DMAとPIO)
DMAがない場合、システム内のすべてのデータ転送はCPUが転送元からデータを読み込み、転送先に書き込むという処理(Programmed Input/Output:PIO)を行う必要があるが、DMAに対応したシステムでは、CPUはチップセットなどにある専用のコントローラに指示を出し、コントローラがデータの読み書きを行う。
これにより、CPUが機器の応答を待たずに処理を進めることができる。これをDirect Memory Access(DMA)という