塊裝置和字元裝置驅動比較

2021-06-25 15:23:24 字數 2573 閱讀 7208

塊裝置和字元裝置驅動比較

linux中i/o裝置分為兩類:塊裝置和字元裝置。兩種裝置本身沒有嚴格限制,但是,基於不同的功能進行了分類。

(1) 字元裝置:提供連續的資料流,應用程式可以順序讀取,通常不支援隨機訪問。相反,此類裝置支援按位元組/字元來讀寫資料。舉例來說,數據機是典型的字元裝置。

(2) 塊裝置:應用程式可以隨機訪問裝置資料,程式可自行確定讀取資料的位置。硬碟是典型的塊裝置,應用程式可以定址磁碟上的任何位置,並由此讀取資料。此外,資料的讀寫只能以塊(通常是512b)的倍數進行。與字元裝置不同,塊裝置並不支援基於字元的定址。

兩種裝置本身並沒用嚴格的區分,主要是字元裝置和塊裝置驅動程式提供的訪問介面(file i/o api)是不一樣的。本文主要就資料介面、訪問介面和裝置註冊方法對兩種裝置進行比較。

1、資料結構

1.1字元裝置資料結構

struct file; 

struct inode;

file定義於 , 是裝置驅動中第二個最重要的資料結構. 檔案結構代表乙個開啟的檔案. 它由核心在 open 時建立, 並傳遞給在檔案上操作的任何函式, 直到最後的關閉. 在檔案的所有例項都關閉後, 核心釋放這個資料結構。

inode 結構由核心在內部用來表示檔案.inode 結構包含大量關於檔案的資訊其中dev_t i_rdev成員包含實際的裝置編號.struct cdev *i_cdev中struct cdev 是核心的內部結構, 代表字元裝置。

1.2塊裝置資料結構

struct gendisk (定義於 ) 是單獨乙個磁碟驅動器的核心表示. 事實上, 核心還使用 gendisk 來表示分割槽。

2、裝置訪問介面

2.1字元裝置訪問介面

struct file_operations 其中file_operation 結構中的每個成員必須指向驅動中的函式, 這些函式實現乙個特別的操作, 或者對於不支援的操作留置為 null. 當指定為 null 指標時核心的確切的行為是每個函式不同的,該結構中主要函式如下:

ssize_t read(struct file *filp, char __user *buff, size_t count, loff_t *offp);

ssize_t write(struct file *filp, const char __user *buff, size_t count, loff_t *offp);

filp 是檔案指標, count 是請求的傳輸資料大小. buff 引數指向持有被寫入資料的快取, 或者放入新資料的空快取. 最後, offp 是乙個指標指向乙個"long offset type"物件, 它指出使用者正在訪問的檔案位置. 返回值是乙個"signed size type"。

2.2塊裝置訪問介面

字元裝置通過 file_ 操作結構使它們的操作對系統可用. 乙個類似的結構用在塊裝置上; 它是 struct block_device_operations, 定義在 ,其主要操作方法如下:

int (*open)(struct inode *inode, struct file *filp); 

int (*release)(struct inode *inode, struct file *filp);

就像它們的字元驅動對等體一樣工作的函式; 無論何時裝置被開啟和關閉都呼叫它們. 乙個字元驅動可能通過啟動裝置或者鎖住門(為可移出的介質)來響應乙個 open 呼叫. 如果你將介質鎖入裝置, 你當然應當在 release 方法中解鎖。

int (*ioctl)(struct inode *inode, struct file *filp, unsigned int cmd, unsigned long arg);

實現 ioctl 系統呼叫的方法. 但是, 塊層首先解釋大量的標準請求; 因此大部分的塊驅動 ioctl 方法相當短。

3、裝置註冊

3.1字元裝置註冊

int register_chrdev_region(dev_t first, unsigned int count, char *name) 

int alloc_chrdev_region(dev_t *dev, unsigned int firstminor, unsigned int count, char *name) 

void unregister_chrdev_region(dev_t first, unsigned int count);

允許驅動分配和釋放裝置編號的範圍的函式. register_chrdev_region 應當用在事先知道需要的主編號時; 對於動態分配, 使用 alloc_chrdev_region 代替.

3.2塊裝置註冊

int register_blkdev(unsigned int major, const char *name); 

int unregister_blkdev(unsigned int major, const char *name);

register_blkdev 註冊乙個塊驅動到核心, 並且, 可選地, 獲得乙個主編號. 乙個驅動可被登出, 使用 unregister_blkdev。

塊裝置驅動

若塊裝置驅動程式也按以下字元裝置驅動程式的簡單思想來寫 1.硬碟 磁碟的讀寫其實非常快,慢在機械結構讀寫裝置的定位上面,從乙個 磁頭 的某 柱面 某 扇區 讀到資料後 步驟 r0 跳到另乙個 磁頭 的某 柱面 的某 扇區 去寫 步驟 w 接著再跳回原 磁頭 相同柱面的下乙個 扇區 去讀 步驟r1 慢...

字元裝置驅動與塊裝置驅動 網路裝置驅動的區別

在linux作業系統下有3類主要的裝置檔案型別 塊裝置 字元裝置和網路裝置。這種分類方法可以將控制輸入 輸出裝置的驅動程式與其他作業系統軟體分離開來。字元裝置是指訪問時沒有快取的裝置。典型的字元裝置包括滑鼠 鍵盤 序列口等。字元裝置與塊裝置的主要區別是 在對字元裝置發出讀 寫請求時,實際的硬體i o...

字元裝置驅動與塊裝置驅動 網路裝置驅動的區別

在linux作業系統下有3類主要的裝置檔案型別 塊裝置 字元裝置和網路裝置。這種分類方法可以將控制輸入 輸出裝置的驅動程式與其他作業系統軟體分離開來。字元裝置是指訪問時沒有快取的裝置。典型的字元裝置包括滑鼠 鍵盤 序列口等。字元裝置與塊裝置的主要區別是 在對字元裝置發出讀 寫請求時,實際的硬體i o...