Linux塊裝置驅動(一)gendisk結構體

2021-08-29 02:53:18 字數 2395 閱讀 1619

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結構,初始化...