裝置檔案系統(DevFS)

2021-05-12 15:09:19 字數 3011 閱讀 5124

devfs裝置檔案系統是linux 2.4乙個全新的功能,它主要為了有效的管理/dev目錄而開發的。我能知道,unix/linux中所有的目錄都是層次結構,唯獨/dev目錄是一維結構(沒有子目錄),這就直接影響著訪問的效率及管理的方便與否。另外,/dev目錄下的節點並不是按實際需要建立的,因此,該目錄下存在大量實際不用的節點,但一般也不能輕易刪除。

理想的/dev目錄應該是層次的、其規模是可伸縮的。 devfs就是為達到此目的而設計。它在底層改寫了使用者與裝置互動的方式和途徑。它會給使用者在兩方面帶來影響。首先,幾乎所有的裝置名稱都做了改變 ,例如:「/dev/hda」是使用者的硬碟,現在可能被定位於「/dev/ide0/...」。這一修改方案增大了裝置可用的名字空間,且容許usb類和類似裝置的系統整合。其次,不再需要使用者自己建立裝置節點。 devfs的 /dev目錄最初是空的,裡面特定的檔案是在系統啟動時、或是載入模組後驅動程式裝入時建立的。當模組和驅動程式解除安裝時,檔案就消失了。為保持和舊版本的相容,可以使用乙個使用者空間守護程式「devfsd」,以使先前的裝置名稱能繼續使用。目前,devfs的使用還只是乙個實驗性選項,由乙個編譯選項 config_devfs_fs加以選擇。

(1) 註冊和登出字元裝置驅動程式

如前所述,乙個新的檔案系統要加入系統,必須進行註冊 。那麼,乙個新的驅動程式要加入系統,也必須進行註冊。在下一章我們會看到,我們把裝置大體分為字元裝置和塊裝置。字元裝置的註冊和登出呼叫register_chrdev()和unregister_chrdev()函式。註冊了裝置驅動程式以後,驅動程式應該呼叫devfs_register()登記裝置的入口點,所謂裝置的入口點就是裝置所在的路徑名;在登出裝置驅動程式之前,應該呼叫 devfs_unregister()取消註冊。

devfs_register()和 devfs_unregister() 函式原型為:

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_handle_t表示devfs的控制代碼(乙個結構型別),每個引數的含義如下:

dir : 我們要建立的檔案所在的devfs的控制代碼。null意味著這是devfs的根,即 /dev。

flags :裝置檔案系統的標誌,預設值為devfs_fl_default。

major : 主裝置號,普通檔案不需要這一引數。

minor : 次裝置號, 普通檔案也不需要這一引數

mode : 預設的檔案模式(包括屬性和許可權)。

ops : 指向 file_operations 或 block_device_operations結構的指標

info : 任意乙個指標,這個指標將被寫到file結構的private_data域。

例如,如果我們要註冊的裝置驅動程式叫做device_name,其主裝置號為major_nr,次裝置號為minor_nr,預設的檔案操作為 device_fops:則該裝置驅動程式的init_module()函式和cleanup_module()函式如下:

int init_module(void)

void cleanup_module(void)

對以上**進行改寫以支援裝置檔案系統(假定裝置入口點的名字為device_entry)

#include

devfs_handle_t devfs_handle;

int init_module(void)

void cleanup_module(void)

(2)在devfs名字空間中建立乙個目錄

devfs_mk_dir()用來建立乙個目錄,這個函式返回devfs的控制代碼,這個控制代碼用作devfs_register的引數dir。 例如,為了在「/dev/mydevice」目錄下建立乙個裝置裝置入口點,則進行如下操作:

devfs_handle = devfs_mk_dir(null, "mydevice", null);

devfs_register(devfs_handle, device_entry, devfs_fl_default,

major_nr, minor_nr, s_ifchr | s_irugo | s_iwusr,

&device_fops, null);

(3)註冊一系列裝置入口點

如果乙個裝置有幾個次裝置號,就說明同乙個裝置驅動程式控制了幾個不同的裝置,例如主ide硬碟的主裝置號為3,但其每個分割槽都有乙個從裝置號,例如 /dev/had2的從裝置號為2。在devfs下,每個從次裝置號也有乙個目錄,例如/dev/ide0/,/dev/ide1/等,也就是說,每個次裝置號都有乙個裝置入口點,於是就可以呼叫devfs_register_series來建立一系列的裝置入口點。裝置入口點的名字以printf()函式中format引數的形式來建立。

註冊device_nr裝置入口點(次裝置號從minor_start開始)的操作如下:

devfs_handle = devfs_mk_dir(null, "mydevice", null);

devfs_register_series(devfs_handle, "device%u", max_device, devfs_fl_default,

major_nr, minor_start, s_ifchr | s_irugo | s_iwusr,

&device_fops, null);

(4)塊裝置

註冊和登出塊設的函式為:

devfs_register_blkdev()

devfs_unregister_blkdev ()

裝置檔案系統

一.devfs 裝置檔案系統 過時的系統 主要特點如下 1.可以通過程式在裝置初始化時在 dev目錄下建立裝置檔案,解除安裝裝置時將它刪除。2.裝置驅動程式可以指定裝置名 所有者和許可權位,使用者空間程式仍可以修改所有者和許可權位。3.不再需要為裝置驅動程式分配主裝置號以及處理次裝置號,在程式中可以...

udev裝置檔案系統

1.udev是2.6.13之後linux採用的裝置檔案系統,之前採用devfs裝置檔案系統,不是一種檔案系統,而是生成裝置檔案系節點的方法。主要功能在於管理 dev下的裝置節點,並匯出資訊到系統中的 sysfs,它利用sysfs的匯出資訊建立裝置節點。在嵌入式系統中,是用的是mdev.主要優點在於 ...

dev loop與裝置檔案系統

摘要 在進行測試的時候,我們往往需要新建一些磁碟分割槽或者裝置等,此時對硬碟進行重新劃分往往不太方面。這種情況下,我們可以通過偽裝置來實現迴圈掛載,從而達到目的。本文主要為你講解什麼是迴圈掛載,什麼是虛擬裝置,裝置和檔案系統有什麼關係。在類unix系統中,dev loop 或稱vnd vnode d...