linux核心中,用gendisk結構體表示乙個磁碟裝置或分割槽,塊裝置驅動程式的設計主要就是圍繞gendisk這個資料結構展開的。乙個簡單的塊裝置驅動程式框架如下:
在init函式中分配、設定、新增乙個gendisk;
設計gendisk結構體fops成員包含的操作函式;
設計gendisk結構體queue(請求佇列)成員的請求處理函式。
gendisk結構的定義:
struct gendisk ;
下面說明gendisk的主要成員及設定方法。
int major //主裝置號
register_blkdev()函式用來註冊塊裝置驅動,並申請主裝置號
/* 註冊塊裝置驅動 */
int register_blkdev(unsigned int major, const char *name);
/* 登出塊裝置驅動 */
int unregister_blkdev(unsigned int major, const char *name);
int first_minor; //次裝置號
如果有分割槽,每個分割槽都需要乙個次裝置號
int minors; //次裝置的最大數目,未分割槽則 = 1
char disk_name[32]; //磁碟名字
struct block_device_operations *fops; //塊裝置操作函式集合
類似字元裝置驅動的file_operation結構體,定義如下:
struct block_device_operations ;
/* 初始化請求佇列 */
request_queue_t *blk_init_queue(request_fn_proc *request, spinlock_t *lock);
/* 清除請求佇列 */
void blk_cleanup_queue(request_queue_t *);
/* 分配請求佇列 */
request_queue_t *blk_alloc_queue(int gfp_mask);
/* 繫結製造請求函式 */
void blk_queue_make_request(request_queue_t *q, make_request_fn *mfn);
/* 提取請求 */
struct request *blk_peek_request(struct request_queue *q);
/* 啟動請求 */
void blk_start_request(struct request *req);
/* 報告完成 */
void blk_end_request_all(struct request *rq, int error);
void __blk_end_request_all(struct request *rq, int error); //在持有佇列鎖的場景下呼叫
對請求的處理有兩種模式,可以使用請求佇列,也可以不使用,在使用請求佇列時,使用blk_init_queue()函式,不用請求佇列時,將blk_alloc_queue()和blk_queue_make_request()結合使用,一般模式為;
***_queue = blk_alloc_queue(gfp_kernel);
blk_queue_make_request(***_queue, ***_make_request);
int flags; //描述驅動器狀態的標誌
如果為可移動介質:genhd_fl_removable
如果為cd_rom:genhd_fl_cd
如果不需要分割槽資訊出現在 /proc/partitions, 設定為
genhd_fl_suppress_partitions_info
sector_t capacity; //磁碟驅動器容量,以512位元組的扇區個數為單位
一般通過set_capacity()函式設定:
void set_capacity(struct gendisk *disk, sector_t size);
void *private_data; //指向私有資料的指標
gendisk的操作函式:
/* 分配gendisk */
struct gendisk *alloc_disk(int minors);
/* 刪除gendisk */
void del_gendisk(struct gendisk *gd);
/* 增加gendisk */
void add_disk(struct gendisk *gd);
Linux塊裝置驅動
塊裝置提供塊裝置提供裝置的訪問,裝置的訪問,可以隨機的以固定大小的塊傳輸資料,例如我們最為常見的磁碟裝置,當然塊裝置和字元裝置有較大差別,塊裝置有自己的驅動介面。簡單來說,核心決定乙個塊是固定的4096 位元組,當然該值可以隨著依賴檔案系統的變化而改變。塊裝置驅動採用register blkdev向...
Linux 塊裝置驅動分析(一)
linux 塊裝置驅動分析 一 linux 塊裝置驅動分析 二 linux 塊裝置驅動分析 三 塊裝置與字元裝置的不同 塊裝置是與字元裝置並列的概念,這兩類裝置在linux中驅動的結構有較大差異,總體而言,塊裝置驅動比字元裝置驅動要複雜得多,在i o操作上表現出極大的不同,緩衝 i o排程 請求佇列...
linux驅動之塊裝置驅動
塊裝置驅動的系統架構 塊裝置註冊過程 1,註冊裝置塊驅動程式 register blkdev 2,初始化請求佇列 blk init queue 3,指明扇區的大小 blk queue logical block size dev queue,sect size 4,申請乙個gendisk結構,初始化...