塊裝置驅動程式

2021-05-26 18:10:08 字數 2762 閱讀 3401

裝置描述---

定義於linux/genhd.h

struct gendisk ;

裝置註冊---

void add_disk(struct gendisk *gd)

裝置操作---

字元裝置通過file_operations結構來定義它所支援的操作。塊裝置通過struct block_device_operations結構來定義它所支援的操作。

無讀寫------使用i/o請求來實現。

struct block_device_operations ;

i/o請求---

struct request表示等待處理的塊裝置i/o請求。

struct request ;

請求佇列----

簡單的講,請求佇列就是io請求request所形成的佇列,在linux核心中struct request_queue描述。

核心提供了一系列函式用來操作請求佇列:

struct request_queue *blk_init_queue(request_fn_proc *rfn,spinlock_t *lock)

rfn 函式指標------當請求佇列上有request過來之後,通過自己定義的這個函式指標指向的函式,實現真正的資料訪問。

lock 自旋鎖

初始化請求佇列,一般在塊裝置驅動的模組載入函式中呼叫。

void blk_cleanup_queue(request_queue_t *q)

清除請求佇列,這個函式完成將請求佇列返回給系統的任務,一般在塊裝置驅動模組解除安裝函式中呼叫。

struct request *elv_next_request(request_queue_t *queue)

返回乙個要處理的請求(由io排程器決定),如果沒有請求則返回null。elv_next_request()不會清除請求,它仍然將這個請求保留在佇列上,因此連續呼叫它2次,2次會返回同乙個請求結構體。

void blkdev_dequeue_request(struct request *req)

從佇列中刪除乙個請求。

#include

#include

#include

#include

#include /* printk() */

#include /* kmalloc() */

#include /* everything... */

#include /* error codes */

#include

#include /* size_t */

#include /* o_accmode */

#include /* hdio_getgeo */

#include

#include

#include

#include

#include /* invalidate_bdev */

#include

#define simp_blkdev_devicemajor        compaq_smart2_major

#define simp_blkdev_diskname        "simp_blkdev"

#define simp_blkdev_bytes        (16*1024*1024)

static struct request_queue *simp_blkdev_queue;

static struct gendisk *simp_blkdev_disk;

unsigned char simp_blkdev_data[simp_blkdev_bytes];

名字能變,引數型別,返回值不能變。

static void simp_blkdev_do_request(struct request_queue *q)

switch (rq_data_dir(req)) }

}struct block_device_operations simp_blkdev_fops = ;

static int __init simp_blkdev_init(void)

simp_blkdev_disk = alloc_disk(1);

分配gendisk結構

if (!simp_blkdev_disk)

strcpy(simp_blkdev_disk->disk_name, simp_blkdev_diskname);

simp_blkdev_disk->major = simp_blkdev_devicemajor;

simp_blkdev_disk->first_minor = 0;

simp_blkdev_disk->fops = &simp_blkdev_fops;

simp_blkdev_disk->queue = simp_blkdev_queue;

set_capacity(simp_blkdev_disk, simp_blkdev_bytes>>9);

add_disk(simp_blkdev_disk);

return 0;

err_alloc_disk:

blk_cleanup_queue(simp_blkdev_queue);

err_init_queue:

return ret;

}static void __exit simp_blkdev_exit(void)

module_init(simp_blkdev_init);

module_exit(simp_blkdev_exit);

裝置驅動 塊裝置驅動程式

塊裝置驅動程式提供對面向塊的裝置的訪問,這種裝置以隨機訪問的方式傳輸資料,並且資料總是具有固定大小的塊。典型的塊裝置是磁碟驅動器,也有其它型別的塊裝置。塊裝置和字元裝置有很大區別。比如塊裝置上可以掛載檔案系統,字元裝置不可以。這是隨機訪問帶來的優勢,因為檔案系統需要能按塊儲存資料,同時更需要能隨機讀...

塊裝置驅動程式

塊裝置驅動程式 1 塊裝置和字元裝置的區別 1,讀取資料的單元不同,塊裝置讀寫資料的基本單元式塊,字元裝置的基本單元是位元組。2,塊裝置可以隨機訪問,字元裝置只能順序訪問。2 linux核心中塊裝置的描述 struct gendisk 裝置操作 struct block device operati...

塊裝置驅動程式

1 塊裝置驅動程式的引入 對於塊裝置,不能像字元裝置那樣直接提供讀寫函式 假設 寫扇區0和扇區1 原先是這樣寫扇區0 a.讀出整塊到buffer b.修改buffer裡的扇區0 c.擦除整塊 d.燒寫整塊 原先是這樣寫扇區1 a.讀出整塊到buffer b.修改buffer裡的扇區1 c.擦除整塊 ...