框架:
--------------------------------------------- 檔案的讀寫
檔案系統: vfat, ext2, ext3, yaffs2, jffs2 (把檔案的讀寫轉換為扇區的讀寫)
-----------------ll_rw_block----------------- 扇區的讀寫
1. 把"讀寫"放入佇列
2. 呼叫佇列的處理函式(優化/調順序/合併)
塊裝置驅動程式
---------------------------------------------
硬體: 硬碟,flash
bi_bdev); // 找到佇列
// 呼叫佇列的"構造請求函式"
ret = q->make_request_fn(q, bio);
// 預設的函式是__make_request
__make_request
// 先嘗試合併
elv_merge(q, &req, bio);
// 如果合併不成,使用bio構造請求
init_request_from_bio(req, bio);
// 把請求放入佇列
add_request(q, req);
// 執行佇列
__generic_unplug_device(q);
// 呼叫佇列的"處理函式"
q->request_fn(q);
怎麼寫塊裝置驅動程式呢?
1. 分配gendisk: alloc_disk
2. 設定
2.1 分配/設定佇列: request_queue_t // 它提供讀寫能力
blk_init_queue
2.2 設定gendisk其他資訊 // 它提供屬性: 比如容量
3. 註冊: add_disk
/*參考:
* /drivers/blocks/xd.c
* */
#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include static struct gendisk *ramblock_disk;
static struct request_queue_t *ramblock_queue;
static define_spinlock(ramblock_lock);
static int major;
static unsigned char *ramblock_buf;
#define ramblock_size (1024*1024)
static int ramblock_getgeo(struct block_device *bdev, struct hd_geometry *geo)
static struct block_device_operations ramblock_fops = ;
static void do_ramblock_request(request_queue_t *q)
else
end_request(req, 1); /* wrap up, 0 = fail, 1 = success */ }
}static int ramblock_init(void)
static void ramblock_exit(void)
module_init(ramblock_init);
module_exit(ramblock_exit);
module_license("gpl");
測試:
/* drivers\block\xd.c */
/* drivers\block\z2ram.c */
測試3th,4th:
在開發板上:
1. insmod ramblock.ko
2. 格式化: mkdosfs /dev/ramblock
3. 掛接: mount /dev/ramblock /tmp/
4. 讀寫檔案: cd /tmp, 在裡面vi檔案
5. cd /; umount /tmp/
6. cat /dev/ramblock > /mnt/ramblock.bin
7. 在pc上檢視ramblock.bin
sudo mount -o loop ramblock.bin /mnt
測試5th:
1. insmod ramblock.ko
2. ls /dev/ramblock*
3. fdisk /dev/ramblock
裝置驅動 塊裝置驅動程式
塊裝置驅動程式提供對面向塊的裝置的訪問,這種裝置以隨機訪問的方式傳輸資料,並且資料總是具有固定大小的塊。典型的塊裝置是磁碟驅動器,也有其它型別的塊裝置。塊裝置和字元裝置有很大區別。比如塊裝置上可以掛載檔案系統,字元裝置不可以。這是隨機訪問帶來的優勢,因為檔案系統需要能按塊儲存資料,同時更需要能隨機讀...
塊裝置驅動程式
裝置描述 定義於linux genhd.h struct gendisk 裝置註冊 void add disk struct gendisk gd 裝置操作 字元裝置通過file operations結構來定義它所支援的操作。塊裝置通過struct block device operations結構...
塊裝置驅動程式
塊裝置驅動程式 1 塊裝置和字元裝置的區別 1,讀取資料的單元不同,塊裝置讀寫資料的基本單元式塊,字元裝置的基本單元是位元組。2,塊裝置可以隨機訪問,字元裝置只能順序訪問。2 linux核心中塊裝置的描述 struct gendisk 裝置操作 struct block device operati...