星期一, 2月 20, 2006

Linux Devfs (Device File System) FAQ

和原有的char,block device不一樣,利用devfs,kernel可以用"name"而不是major, minor number來註冊device。device會自動出現在/dev中。

devfs有兩個特性:
name space和mout --- 完全部知道在講甚麼.

Why do it

Major/Minor number allocatin

以往的dev 設計必須要有一個unique major/minor number,所以新設計的device必須要向kernel mantain人員註冊一個major/minor number,以免被其他人使用(或與已有的device重複)。這樣很麻煩。
devfs將major/minor number改由"檔名"的方式。利用device driver註冊的名字來access。只要driver的writer選擇一格符合自己device特性的名字就可以。

/dev mamagement
以往major/minor的設計方式,需要kernel module和/dev system中有相同的對應(也就是說同要變更一個device major/minor number,同時要變更kernel module的註冊表和/dev 的node內容。這樣很麻煩。
devfs就不需要。

/dev growth
以往的/dev系統,不論系統中有沒有這個device,該device 的major/minor number都不能被其他device使用,這樣讓/dev下的data變得很大,也讓kernel 的module table變得很大。

devfs 不使用major/minor number,當device module呼叫devfs_register( ),這個module的entry name將會被附加到內部device table 後。系統會去/dev檢查這個module的entry是否已經存在,如果沒有,會由file_operation create一個inode。
所以devfs下,/dev內的device是avaiable的device,和古老的/dev系統不同,古老的/dev系統包含的是所有的device,不論目前喜統有沒有這個device。

Read-only root filesystem

以前的/dev是掛在root filesystem下,所以當使用readonly root filesystem時,要變更device node的owership是不可能的,除非用script create ramdisc,把/dev copy 過去,再unmount /dev,把ramdisk /dev mount進來。
devfs就不必這樣作。


Non-Unix root filesystem

Non-Unix filesystem不支援block, char special file,和symbolic link。這樣甚至要mount一個ramdisk 內的dev到/dev都不行。(因為Non-Unix filesystem不支援dev filesystem)。


How it works

Registering device entries

每個device都要call devfs_register( ),這個function call會將device name,file operation pointer加到kernel 的 device entry table中。
device 也可以remove,將自己從device table中刪除。
註冊的devicec會自動出現在已經mount的devfs中。

Inod lookup

在device table中尋找某個entry(device)時,如果沒找到,會呼叫devfsd,還是找不到,會return一個負的entry值,接著VFS就會呼叫create( )或是mknode( )。

Manually creating device nodes

用mknod( ) method可以在devfs下create一個 inode。如果那個device還不存在,也可以。
user可以對預先存在的node設定權限,這樣當device真的註冊後,權限會繼續存在。不會被overwrite。

Chroot( ) goals --- 完全看不懂在幹嘛

Operation issues

給沒耐心的人看的..

至少要看一下這部份,否則系統可能不會boot...

Devfsd

System Libraries

/etc/security

XFree86

Disble devpts

Unsupported drivers

/dev/mouse

The Kernel

kerel config file中
set CONFIG_EXPERIMENTAL=y
CONFIG_DEVFS_FS=y
CONFIG_DEVFS_MOUNT=y
rebuild kernel。boot後,/dev會自動 mount進來

沒有留言:

網誌存檔