Driver/デバイス番号

Last-modified: 2007-10-04 (木) 13:32:04

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など)に対応する関数が呼び出される。