框架:
分析ll_rw_block
for (i = 0; i < nr; i++) {
struct buffer_head *bh = bhs[i];
submit_bh(rw, bh);
struct bio *bio; // 使用bh來構造bio (block input/output)
submit_bio(rw, bio);
// 通用的構造請求: 使用bio來構造請求(request)
generic_make_request(bio);
__generic_make_request(bio);
request_queue_t *q = bdev_get_queue(bio->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\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...