cdev構造体とデバイスドライバ(insmod)で登録するモジュールとmknodeとデバイス番号の関係
・デバイスを表現するcdevにはカーネル内でユニークな番号がつく->デバイス番号
メジャーデバイス番号 マイナーデバイス番号
よく使うデバイスについては共通のデバイス番号があらかじめふられている。
$cat /proc/devices
Character devices: 1 mem 2 pty 3 ttyp 4 ttyS 5 cua 6 lp 7 vcs 10 misc 13 input 21 sg
/usr/src/linux-2.4.21-15.EL/Documentation
1 char Memory devices 1 = /dev/mem Physical memory access 2 = /dev/kmem Kernel virtual memory access 3 = /dev/null Null device 4 = /dev/port I/O port access 5 = /dev/zero Null byte source 6 = /dev/core OBSOLETE - replaced by /proc/kcore 7 = /dev/full Returns ENOSPC on write 8 = /dev/random Nondeterministic random number gen. 9 = /dev/urandom Faster, less secure random number gen. 10 = /dev/aio Asyncronous I/O notification interface block RAM disk
・デバイスドライバ
モジュールとして作成されたデバイスドライバはinsmodで登録する。
デバイスドライバはinit処理時に静的あるいは動的にデバイス番号を割り当てる
動的割り振り alloc_chrdev_region 静的割り振り register_chrdev_region
・mknod
mknodで/dev以下にノードを作成するときにはデバイス番号を割り当てる。
このデバイス番号はデバイスドライバで登録されているのと同じ番号を指定する。
/dev/nodeA ----- (デバイス番号) ----- cdev ----- (container of) ----- デバイスドライバの構造体
デバイス番号によりノードでcdevが紐付けられる。これによりcdevに登録されていたfile operationの関数が取得でき、ノードに対して実行された操作(open, read, write, seekなど)に対応する関数が呼び出される。