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結點中的檔案型別指明該檔案是字元
深入了解DSP與ARM的區別與聯系
表示 同時 系統集成 信號處理 man 運行速度 行修改 alt 那種 深入了解DSP與ARM的區別與聯系 2011-09-30 12:49:43| 分類: 嵌入式の半入其室 | 標簽:體系結構 |舉報|字號 訂閱
strcpy、strncpy與memcpy的區別與使用方法
flow class created 行為 ons return sizeof creat 數組 今天做題用到了這兩個函數,不是很懂,學習了下~ 轉自http://www.cnblogs.com/houjun/p/4913216.html 本文參考《C 標準庫》編寫。
PHP數據庫連接mysql與mysqli的區別與用法
close ace ase 二次 銷毀 數據庫 table name .cn 一、mysql與mysqli的概念相關: 1、mysql與mysqli都是php方面的函數集,與mysql數據庫關聯不大。 2、在php5版本之前,一般是用php的mysql函數去驅動mysq
Session與Cookie的區別與聯系
系統 數據 如果 多層 刪除 默認 重新 sqli nbsp 描述兩個事情的不同,一般先從概念入手,然後分析他們是怎麽生成、怎麽使用以及怎麽消亡的: 1、Cookie僅由客戶端生成、管理並使用,PHP只是發出指令要求客戶端如何生成Cookie、何時過期等,但是客戶端不一
Java NIO與IO的區別和比較
選擇器 獲取 如果 得到 提供服務 單獨 每次 取數 details 現代的酒店服務方式跟傳統的區別有兩個:1、增加了一個角色,要有一個專門負責收集客人需求的人。NIO裏對應的就是Selector。2、由阻塞服務方式改為非阻塞服務了,客人吃著的時候服務員不用一直侯在客人旁邊