linux塊裝置驅動程式

2021-08-20 14:06:29 字數 2463 閱讀 5325

框架:

--------------------------------------------- 檔案的讀寫

檔案系統: 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...