裝置描述---
定義於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.擦除整塊 ...