udevとdevfsファイルシステム


devfs(デバイスファイルシステム)はLinux 2である.4コアが導入され、主にデバイスドライバが独自のデバイスファイルを自主的に管理できるようになりました.具体的には、devfsは以下の利点を有する.
プログラムにより、デバイスの初期化時に/devディレクトリの下にデバイスファイルを作成し、デバイスをアンインストールするときに削除できます.
デバイスドライバは、デバイス名、所有者、およびパーミッションビットを指定できます.ユーザースペースプログラムは、所有者およびパーミッションビットを変更できます.
デバイスドライバにプライマリ・デバイス番号とセカンダリ・デバイス番号を割り当てる必要はありません.プログラムではregister_に直接割り当てることができます.chrdev()は、使用可能なプライマリ・デバイス番号を動的に取得するために0プライマリ・デバイス番号を渡し、devfs_register()でサブデバイス番号を指定します.
デバイスディレクトリ、デバイスファイル、および削除関数を作成するには、次の手順に従います.
devfs_handle_t devfs_mk_dir(devfs_handle_t dir, const char *name, void *info);
	devfs_handle_t devfs_register(devfs_handle_t dir, const char *name, unsigned int flags, unsigned int major, unsigned int minor, umode_t mode, void *ops, void *info);
	void devfs_unregister(devfs_handle_t de);

devfsの使用例は次のとおりです.
static devfs_handle_t devfs_handle; static int __init xxx_init(void){int ret;int I;/*カーネルにデバイスを登録*/ret=register_chrdev(XXX_major,DEVICE_NAME,&xxx_fops);if(ret<0){printk(DEVICE_NAME"can't register major number");return ret;}/*デバイスファイルの作成*/devfs_handle = devfs_register(NULL, DEVICE_NAME, DEVFS_FL_DEFAULT, xxx_MAJOR, 0, S_IFCHR | S_IRUSR | S_IWUSR, &xxx_fops, NULL); … printk(DEVICE_NAME “initialized”); return 0; } static void __exit xxx_exit(void){devfs_unregister(devfs_handle);/*デバイスファイルの取り消し*/unregister_chrdev(XXX_MAJOR,DEVICE_NAME);/*デバイスのログアウト*/}module_init(xxx_init); module_exit(xxx_exit);
 
最新のLinux 2.6のカーネルではdevfsが捨てられ,udevがそれに取って代わった.udevがdevfsに取って代わるいくつかの原因は以下の通りである.
l devfsが行った仕事はユーザ状態で完成できると確信されている.
lいくつかのバグはかなり長い間修復されていません
l devfsのメンテナンス者と著者はコードのメンテナンスを停止した.
udevは完全にユーザ状態で動作し,カーネルから送信されたホットスワップイベントをデバイスで追加または除去することによって動作する
作る.ホットスワップすると、デバイスの詳細が/sysにあるsysfsファイルシステムにカーネルから入力されます.udevのデバイス名ポリシー、権限制御、およびイベント処理は、sysfsの情報を利用してデバイスファイルノードの作成作業を行うユーザ状態で行われる.
udevは、システム内のハードウェアデバイスの状態に応じてデバイスファイルを動的に更新する、デバイスファイルの
作成や削除など、udevを使用すると、/devディレクトリにはシステムに本当に存在するデバイスしか含まれません.
devfsとudevのもう一つの顕著な違いは、devfsを用いて、存在しない/devが
ノードが開かれるとdevfsは対応する駆動を自動的にロードでき、udevはできません.これはudevの設計者がLinuxがアクセスされたときではなく、デバイスが発見されたときに駆動モジュールをロードすべきだと考えているからである.udevの設計者は、devfsが提供する/devノードを開くときに駆動を自動的にロードする機能は、正しいコンピュータを構成するのに余分であると考えている.システム内のすべてのデバイスはホットスワップイベントを生成し、適切なドライバをロードする必要がありますが、udevはそれに気づき、対応するデバイスノードを作成することができます.
udevを使用する例は次のとおりです.
#include …   static struct class * xxx_class; static int __init xxx_init(void){int ret;int i;/*カーネルにデバイスを登録*/ret=register_chrdev(XXX_major,DEVICE_NAME,&xxx_fops);if(ret<0){printk(DEVICE_NAME"can't register major number");return ret;//mdevが「/dev/」ディレクトリの下にデバイスノードxxx_を確立できるようにクラスを登録します.class = class_create(THIS_MODULE, DEVICE_NAME); if(IS_ERR(led_class)) {    printk("Err: failed in EmbedSky-leds class. ");    return -1; }//DEVICE_というデバイスノードを作成します.NAME class_device_create(xxx_class, NULL, MKDEV(xxx_major, 0), NULL, DEVICE_NAME); … printk(DEVICE_NAME “initialized”); return 0; } static void __exit xxx_exit(void){unregister_chrdev(XXX_MAJOR,DEVICE_NAME);/*ログアウトデバイス*/class_device_destroy(xxx_class,MKDEP(xx_major,0);//デバイスポイントclass_destroy(xxx_class);//ログアウトクラス}module_init(xxx_init); module_exit(xxx_exit);
mdevはbusyboxが持参した簡略化版udevであり、埋め込み式のアプリケーションに適している.使いやすいという特徴があります.その役割は、システムがドライバを起動してホットスワップしたり、動的にロードしたりするときに、ドライバに必要なノードファイルを自動的に生成することです.busyboxをベースに組み込みlinuxのルートファイルシステムを構築する場合に最適です.
 
注意:
class_create:classの作成
class_destroy:classの破棄
class_device_create:deviceの作成
class_device_destroy:deviceの破棄
 
これらのAPIは2.6.13からあり、2.6.13の前に使用すべきである.
 
class_simple_create
class_simple_destroy
class_simple_device_add
class_simple_device_remove 
 
kernel 2.6.26 has deprecated class_device_create and class_device_destroy、直接device_を使用createとdevice_destroy.