日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > linux >内容正文

linux

linux 块设备驱动 (三)块设备驱动开发

發布時間:2025/3/21 linux 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 linux 块设备驱动 (三)块设备驱动开发 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

linux 塊設備驅動 (三)塊設備驅動開發

一: 塊設備驅動注冊與注銷

塊設備驅動中的第1個工作通常是注冊它們自己到內核,完成這個任務的函數是 register_blkdev(),其原型為:
int register_blkdev(unsigned int major, const char *name);

與register_blkdev()對應的注銷函數是unregister_blkdev(),其原型為:
int unregister_blkdev(unsigned int major, const char *name);
這里,傳遞給register_blkdev()的參數必須與傳遞給register_blkdev()的參數匹配,否則這個函數返回-EINVAL。

二: 塊設備的請求隊列操作

標準的請求處理程序能排序請求,并合并相鄰的請求,如果一個塊設備希望使用標準的請求處理程序,那它必須調用函數blk_init_queue來初始化請求隊列。當處理在隊列上的請求時,必須持有隊列自旋鎖。初始化請求隊列
request_queue_t *blk_init_queue(request_fn_proc *rfn, spinlock_t *lock);

該函數的第1個參數是請求處理函數的指針,第2個參數是控制訪問隊列權限的自旋鎖,這個函數會發生內存分配的行為,故它可能會失敗,函數調用成
功時,它返回指向初始化請求隊列的指針,否則,返回NULL。這個函數一般在塊設備驅動的模塊加載函數中調用。清除請求隊列
void blk_cleanup_queue(request_queue_t * q);

這個函數完成將請求隊列返回給系統的任務,一般在塊設備驅動模塊卸載函數中調用。

提取請求
struct request *elv_next_request(request_queue_t *queue);
上述函數用于返回下一個要處理的請求(由 I/O 調度器決定),如果沒有請求則返回NULL。

去除請求
void blkdev_dequeue_request(struct request *req);
上述函數從隊列中去除1個請求。如果驅動中同時從同一個隊列中操作了多個請求,它必須以這樣的方式將它們從隊列中去除。

分配“請求隊列”
request_queue_t *blk_alloc_queue(int gfp_mask);
對于FLASH、RAM盤等完全隨機訪問的非機械設備,并不需要進行復雜的I/O調度,這個時候,應該使用上述函數分配1個“請求隊列”,并使用如下函數來綁定“請求隊列”和“制造請求”函數。
void blk_queue_make_request(request_queue_t * q,
make_request_fn * mfn);

void blk_queue_hardsect_size(request_queue_t *queue,
unsigned short max);
該函數用于告知內核塊設備硬件扇區的大小,所有由內核產生的請求都是這個大小的倍數并且被正確對界。但是,內核塊設備層和驅動之間的通信還是以512字節扇區為單位進行。

步驟:

在塊設備驅動的模塊加載函數中通常需要完成如下工作:
① 分配、初始化請求隊列,綁定請求隊列和請求函數。
② 分配、初始化gendisk,給gendisk的major、fops、queue等成
員賦值,最后添加gendisk。
③ 注冊塊設備驅動。
在塊設備驅動的模塊卸載函數中通常需要與模塊加載函數相反的工作:
① 清除請求隊列。
② 刪除gendisk和對gendisk的引用。
③ 刪除對塊設備的引用,注銷塊設備驅動。

總結:

塊設備的I/O操作方式與字符設備存在較大的不同,因而引入了
request_queue、request、bio等一系列數據結構。在整個塊設備的I/O操作中,貫穿于始終的就是“請求”,字符設備的I/O操作則是直接進行不繞彎,
塊設備的I/O操作會排隊和整合。

驅動的任務是處理請求,對請求的排隊和整合由I/O調度算法解決,因此,塊設備驅動的核心就是請求處理函數或“制造請求”函數。

盡管在塊設備驅動中仍然存在block_device_operations結構體及其成員函數,但其不再包含讀寫一類的成員函數,而只是包含打開、釋放及I/O控制等
與具體讀寫無關的函數。塊設備驅動的結構相當復雜的,但幸運的是,塊設備不像字符設備那么包羅萬象,它通常就是存儲設備,而且驅動的主體已經
由Linux內核提供,針對一個特定的硬件系統,驅動工程師所涉及到的工作往往只是編寫少量的與硬件直接交互的代碼。

總結

以上是生活随笔為你收集整理的linux 块设备驱动 (三)块设备驱动开发的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。