デバイスファイル
ハードウェアデバイスをファイルとして抽象化したもの
アクセスできるのはrootのみ
/dev/ ディレクトリに配置される
中にデータが保存されているわけではない
read/writeがそのままハードウェアへの入出力になる特殊なファイル
通常のファイルと同じ open/read/write/close システムコールでデバイスにアクセスできる
code:c
// 普通のファイル
fd = open("hello.txt", O_RDWR);
write(fd, "hello", 5); // → ディスクにデータが書き込まれる
read(fd, buf, 128); // → ディスクからデータを読む
// デバイスファイル
fd = open("/dev/ttyS0", O_RDWR);
write(fd, "hello", 5); // → シリアルポートから電気信号が出る
read(fd, buf, 128); // → シリアルポートに届いた電気信号を読む
どちらも open → read/write → close という同じ操作
プログラムからすると、相手がディスクなのかシリアルポートなのかを意識しなくていい
2種類のデバイスファイル
キャラクタデバイス
ブロックデバイス
table:_
キャラクタデバイス ブロックデバイス
データ単位 1バイトずつストリーム的 固定サイズのブロック単位
バッファリング なし(即座にやり取り) あり(カーネルがバッファキャッシュ管理)
ランダムアクセス 基本的に不可 可能
例 /dev/tty(端末)、/dev/null、/dev/random /dev/sda(ディスク)、/dev/nvme0n1
ls -lの表記 c b
メジャー番号・マイナー番号
各デバイスファイルは2つの番号を持つ:
code:_
$ ls -l /dev/sda
brw-rw---- 1 root disk 8, 0 ...
^ ^
| マイナー番号(同種デバイス内の個体識別)
メジャー番号(どのドライバが担当するか)
メジャー番号: カーネルがどのデバイスドライバに処理を委譲するかを決定
マイナー番号: ドライバ内でどの個体(パーティション等)かを識別
代表的なデバイスファイル
/dev /null
/dev /zero
/dev /random
/dev /sda, /dev /sda1
ディスク全体 / 第1パーティション
/dev /tty
現在の端末
/dev /loop0
ループバックデバイス(ファイルをブロックデバイスとしてマウント)
デバイスファイルの作成
従来は mknod コマンドで手動作成していた:
code:bash
mknod /dev/mydev c 240 0 # キャラクタデバイス、メジャー240、マイナー0
現在は udev(Linux)がカーネルのイベントを監視し、デバイスの接続・切断に応じて /dev/ 以下を自動管理する。
擬似デバイスとの関係
/dev/null や /dev/random のように物理ハードウェアに対応しないものは擬似デバイスと呼ばれる。物理デバイスと同じインターフェースで扱えるのがUnixの設計の強み。
/mrsekut-book-477419607X/227