Linux 塊裝置驅動分析(一)

2021-10-22 04:48:27 字數 2159 閱讀 5764

linux 塊裝置驅動分析(一)

linux 塊裝置驅動分析(二)

linux 塊裝置驅動分析(三)

塊裝置與字元裝置的不同

塊裝置是與字元裝置並列的概念,這兩類裝置在linux中驅動的結構有較大差異,總體而言,塊裝置驅動比字元裝置驅動要複雜得多,在i/o操作上表現出極大的不同,緩衝、i/o排程、請求佇列等都是與塊裝置驅動相關的概念。

系統中能夠隨機(不需要按順序)訪問固定大小資料片的硬體裝置稱作塊裝置,這些固定大小的資料片就稱作塊。最常見的塊裝置是硬碟,除此以外,還有軟盤驅動器、藍光光碟機和快閃儲存器等許多其他塊裝置。塊裝置的一般訪問方式是通過檔案系統。

另一種基本的裝置型別是字元裝置。字元裝置按照字元流的方式被有序訪問,像串列埠和鍵盤就屬於字元裝置。

塊裝置中最小的可定址單元是扇區,扇區大小最常見的是512位元組。雖然物理磁碟定址是按照扇區級進行的,但是核心執行的所有磁碟操作都是按照塊進行的。由於扇區是裝置的最小可定址單元,所以塊不能比扇區還小,只能數倍於扇區大小。另外,核心(對有扇區的硬體裝置)還要求塊大小是2的整數倍,而且不能超過乙個頁的長度,通常塊大小是512位元組、1kb或4kb。

塊裝置的i/o操作特點

(1)塊裝置只能以塊為單位接受輸入和返回輸出,而字元裝置則以位元組為單位。

(2)塊裝置對於 i/o 請求有對應的緩衝區,因此它們可以選擇以什麼順序進行響應,字元裝置無須緩衝且被直接讀寫。對於儲存裝置而言調整讀寫的順序作用巨大,因為在讀寫連續的扇區比分離的扇區更快。

(3)字元裝置只能被順序讀寫,而塊裝置可以隨機訪問。雖然塊裝置可隨機訪問,但是對於磁碟這類機械裝置而言,順序地組織塊裝置的訪問可以提高效能。

linux塊裝置io子系統框架

核心都是通過檔案系統訪問塊裝置的,而不同的硬體平台採用的檔案系統不一樣,如ext2、fat、nfs等,不同的檔案系統,訪問的介面肯定是不太一樣的,但是不管採用何種檔案系統,應用層都可以通過open開啟乙個檔案,然後read讀取檔案中的資料,也可以write往檔案中寫資料,這得歸功於vfs,虛擬檔案系統。vfs是對各種具體檔案系統的一種封裝,使用者程式訪問檔案提供統一的介面。

generic block layer

該層隱藏了底層硬體塊裝置的特性,將對不同塊裝置的操作轉換成對邏輯資料塊的操作,為檔案系統層提供通用的塊裝置讀寫介面。

i/o scheduler layer

接收通用塊層發出的i/o請求,為了優化定址操作,核心既不會簡單地按請求接收次序,也不會立即將其提交給磁碟,而是試圖合併與排序請求,這可以極大地提高系統的整體效能。

gendisk結構體,描述乙個通用的磁碟裝置,對應乙個具體的磁碟,結構體定義如下:

struct gendisk 

;

字元裝置有乙個file_operations,對應的塊裝置有乙個block_device_operations,定義如下:

struct block_device_operations 

;

一塊磁碟是可以分成多個分割槽的,每個分割槽可以安裝不同型別的檔案系統,比如ext2、ext4等檔案系統。

hd_struct結構體,描述乙個具體的磁碟分割槽,定義如下:

struct hd_struct 

;

gendisk裡有一成員part_tbl,描述磁碟的分割槽表資訊,定義如下:

struct disk_part_tbl 

;

linux核心也把分割槽也當作乙個塊裝置。

block_device結構體,描述乙個邏輯上的塊裝置,對應乙個磁碟或分割槽,定義如下:

struct block_device 

;

block_device、hd_struct和gendisk之間的關係如下圖:

Linux塊裝置驅動

塊裝置提供塊裝置提供裝置的訪問,裝置的訪問,可以隨機的以固定大小的塊傳輸資料,例如我們最為常見的磁碟裝置,當然塊裝置和字元裝置有較大差別,塊裝置有自己的驅動介面。簡單來說,核心決定乙個塊是固定的4096 位元組,當然該值可以隨著依賴檔案系統的變化而改變。塊裝置驅動採用register blkdev向...

linux驅動之塊裝置驅動

塊裝置驅動的系統架構 塊裝置註冊過程 1,註冊裝置塊驅動程式 register blkdev 2,初始化請求佇列 blk init queue 3,指明扇區的大小 blk queue logical block size dev queue,sect size 4,申請乙個gendisk結構,初始化...

LINUX塊裝置驅動 1

編寫塊裝置驅動的關鍵步驟 1 呼叫register blkdev申請或註冊主裝置號及裝置名稱,詳見核心原始碼中該函式的注釋。不過下面這篇文章裡並未用到這一步 2 呼叫blk init queue函式建立並初始化乙個 request queue 結構,該函式需要乙個用來處理請求的do request函...