1. 程式人生 > >Linux字元裝置與塊裝置的區別與比較

Linux字元裝置與塊裝置的區別與比較

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

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

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

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

1、資料結構

1.1字元裝置資料結構

struct file; 
        struct inode;

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

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

1.2塊裝置資料結構

struct gendisk (定義於 <linux/genhd.h>) 是單獨一個磁碟驅動器的核心表示. 事實上, 核心還使用 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, 定義在 <linux/fs.h>,其主要操作方法如下:

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。

相關推薦

Linux字元裝置裝置區別比較

Linux中I/O裝置分為兩類:塊裝置和字元裝置。兩種裝置本身沒有嚴格限制,但是,基於不同的功能進行了分類。 (1) 字元裝置:提供連續的資料流,應用程式可以順序讀取,通常不支援隨機存取。相反,此類裝置支援按位元組/字元來讀寫資料。舉例來說,調變解調器是典型的字元裝置。 (

Linux系統中/dev/mtd/dev/mtdblock的區別,即MTD字元裝置裝置區別

1. /dev/mtdN 是Linux 中的MTD架構中,系統自己實現的mtd分割槽所對應的字元裝置,其裡面添加了一些ioctl,支援很多命令,如MEMGETINFO,MEMERASE等。 而mtd-util中的flash_eraseall等工具,就是以這些ioctl為基礎而

字元裝置驅動裝置驅動、網路裝置驅動的區別

在Linux作業系統下有3類主要的裝置檔案型別:塊裝置、字元裝置和網路裝置。這種分類方法可以將控制輸入/輸出裝置的驅動程式與其他作業系統軟體分離開來。字元裝置是指存取時沒有快取的裝置。典型的字元裝置包括滑鼠、鍵盤、序列口等。字元裝置與塊裝置的主要區別是:在對字元裝置發出讀/

[Linux]字元裝置裝置區別

前言: 最根本區別在於它們是否可以被隨機訪問,字元裝置可以不定長度依循先後順序存取資料;塊裝置可以隨機存取。 裝置檔案分為Block Device Driver和Character Device Drive兩類。Character Device Drive又被稱為字元裝

字元裝置裝置

在Unix-like作業系統中,裝置檔案(device file),也被稱為專用檔案(special file),它為裝置驅動提供一個介面,使得作業系統(使用者)可以像操作檔案一樣對裝置進行訪問(Wi

Linux內核模編程內核模LICENSE -《具體解釋(第3版)》預讀

dev sdn hack 認識 方式 flags sin arr 整數 Linux內核模塊簡單介紹Linux內核的總體結構已經很龐大,而其包括的組件或許多。我們如何把須要的部分都包括在內核中呢?一種方法是把全部須要的功能都編譯到Linux內核。這會導致兩個問題。一是生成

Linux-Flash驅動(2)-裝置驅動例項分析

在上一節課中,我們在記憶體中劃分出512kB作為一個塊裝置,並對它實現讀寫的操作。現在我們來具體分析這段程式碼。 #include <linux/module.h> #include <linux/moduleparam.h> #include

Linux驅動編寫(裝置驅動程式碼)

【 宣告:版權所有,歡迎轉載,請勿用於商業用途。  聯絡信箱:feixiaoxing @163.com】    按照ldd的說法,linux的裝置驅動包括了char,block,net三種裝置。char裝置是比較簡單的,只要分配了major、minor號,就可以進行讀寫處理了

系統技術非業餘研究 » Linux下方便的裝置檢視工具lsblk

之前在Linux下看有什麼塊裝置,通常都用fdisk什麼的或者直接ls /dev/ 人肉去看看, 很土,不方便。 前二天在江楓的網站上看到了介紹的lsblk,這玩意不錯,推薦給大家。 這個工具屬於util-linux-ng包,在RHEL 6.1上是安裝好的啦,直接用就好。 ubuntu高版本下也有

裝置字元裝置裝置不全面比較

A.為什麼Oracle要使用裸裝置呢裸裝置,也叫裸分割槽(原始分割槽),是一種沒有經過格式化,不被Unix通過檔案系統來讀取的特殊字元裝置。本文收集裸裝置和Oracle問答20例。   1.什麼叫做裸裝置?  裸設備,也叫裸分割槽(原始分割槽),是一種沒有經過格式化,不被U

Linux I/O Block--裝置的表示

       塊裝置的特點是其平均訪問時間較長,因此為了提高塊裝置的訪問效率,Linux核心用了很多的筆墨來設計和塊裝置相關的部分,這樣一來,從程式碼的角度來看,訪問一個檔案的過程變得尤其的漫長……整個路徑包含的過程基本可以概括為虛擬檔案系統-->塊裝置實際檔案系統-

字元裝置裝置、裸裝置、RAW裝置

第一,字元裝置是指在I/O傳輸過程中以字元為單位進行傳輸的裝置,例如鍵盤,印表機等。請注意,以字元為單位並不一定意味著是以位元組為單位,因為有的編碼規則規定,1個字元佔16位元,合2個位元組。 在UNIX系統中,字元裝置以特別檔案方式在檔案目錄樹中佔據位置並擁有相應的i結點。

Linux裝置驅動--裝置 之概念和框架

基本概念   塊裝置(blockdevice) --- 是一種具有一定結構的隨機存取裝置,對這種裝置的讀寫是按塊進行的,他使用緩衝區來存放暫時的資料,待條件成熟後,從快取一次性寫入裝置或者從裝置一次性讀到緩衝區。 字元裝置(Character devic

Linux裝置驅動--裝置(一)之概念和框架

基本概念   塊裝置(blockdevice) --- 是一種具有一定結構的隨機存取裝置,對這種裝置的讀寫是按塊進行的,他使用緩衝區來存放暫時的資料,待條件成熟後,從快取一次性寫入裝置或者從裝置一次性讀到緩衝區。 字元裝置(Character device) ---是一個順

轉】字元裝置裝置、裸裝置、RAW裝置

第一,字元裝置是指在I/O傳輸過程中以字元為單位進行傳輸的裝置,例如鍵盤,印表機等。請注意,以字元為單位並不一定意味著是以位元組為單位,因為有的編碼規則規定,1個字元佔16位元,合2個位元組。 在UNIX系統中,字元裝置以特別檔案方式在檔案目錄樹中佔據位置並擁有相應的i結點。i結點中的檔案型別指明該檔案是字元

深入了解DSPARM的區別聯系

表示 同時 系統集成 信號處理 man 運行速度 行修改 alt 那種 深入了解DSP與ARM的區別與聯系 2011-09-30 12:49:43| 分類: 嵌入式の半入其室 | 標簽:體系結構 |舉報|字號 訂閱

strcpy、strncpymemcpy的區別使用方法

flow class created 行為 ons return sizeof creat 數組 今天做題用到了這兩個函數,不是很懂,學習了下~ 轉自http://www.cnblogs.com/houjun/p/4913216.html 本文參考《C 標準庫》編寫。

PHP數據庫連接mysqlmysqli的區別用法

close ace ase 二次 銷毀 數據庫 table name .cn 一、mysql與mysqli的概念相關: 1、mysql與mysqli都是php方面的函數集,與mysql數據庫關聯不大。 2、在php5版本之前,一般是用php的mysql函數去驅動mysq

SessionCookie的區別聯系

系統 數據 如果 多層 刪除 默認 重新 sqli nbsp 描述兩個事情的不同,一般先從概念入手,然後分析他們是怎麽生成、怎麽使用以及怎麽消亡的: 1、Cookie僅由客戶端生成、管理並使用,PHP只是發出指令要求客戶端如何生成Cookie、何時過期等,但是客戶端不一

Java NIOIO的區別比較

選擇器 獲取 如果 得到 提供服務 單獨 每次 取數 details 現代的酒店服務方式跟傳統的區別有兩個:1、增加了一個角色,要有一個專門負責收集客人需求的人。NIO裏對應的就是Selector。2、由阻塞服務方式改為非阻塞服務了,客人吃著的時候服務員不用一直侯在客人旁邊