一.塊裝置驅動框架
與字元裝置相比什麼差別:
1.塊裝置僅僅能以塊為單位接受輸入和返回輸出。而字元裝置則以位元組為單位。大多數裝置是字元裝置,由於它們不須要緩衝並且不以固定塊大小進行操作。
2.塊裝置對於i/o請求有相應的緩衝區。因此它們能夠選擇以什麼順序進行響應,字元裝置無需緩衝且被直接讀寫。對於儲存裝置而言調整讀寫的順序作用巨大,由於在讀寫連續的扇區比分離的扇區更快。
3.符裝置僅僅能被順序讀寫,而塊裝置能夠隨機訪問。儘管塊裝置可隨機訪問,可是對於磁碟這類機械裝置而言。順序地組織塊裝置的訪問能夠提高效能。
二.驅動**
/* 參考:
* drivers\block\xd.c
* drivers\block\z2ram.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 request_queue_t *ramblock_queue;
static int major;
static define_spinlock(ramblock_lock);
#define ramblock_size (1024*1024)
static unsigned char *ramblock_buf;
/*幾何屬性*/
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); }}
static int ramblock_init(void) //入口函式
static void ramblock_exit(void) //出口函式
module_init(ramblock_init);
module_exit(ramblock_exit);
module_license("gpl");
三.驅動分析
我們的驅動程式要實現的功能就是將記憶體模擬硬碟進行操作。
1. 分配gendisk結構體
2. 設定
2.1 分配/設定佇列,並將它放入結構體中,用來提供讀寫能力
2.2 設定gendisk其它資訊(主裝置號、次裝置號、名字、操作函式、容量)
操作函式:這裡面主要呼叫了ramblock_getgeo函式用來設定硬碟的屬性(儘管是ram模擬的,為了使用 老的工具還是要假裝設定一下)
3.硬體相關的操作(就是分配一塊記憶體。比較簡單)
4. 註冊: add_disk
4.請求處理函式(塊裝置驅動的核心)
當核心須要驅動程式處理讀取、寫入以及其它的操作時。就會呼叫改函式。
static void do_ramblock_request(request_queue_t * q)
else //假設是寫
end_request(req, 1);
}}
這段**首先推斷是否有請求,假設有依據傳輸資料三要素進行設定,然後推斷讀寫,進行對應的操作。
ldd3
Linux塊裝置驅動之記憶體模擬塊裝置
用記憶體代替塊裝置的總結,相對來簡單得多,對記憶體操作想必大家都很熟悉,直接分配一塊記憶體就可以直接讀寫操作了 參考 drivers block xd.c drivers block z2ram.c define ramblock size 1024 1024 乙個扇區是512位元組 static ...
塊裝置驅動(記憶體模擬硬碟)
搜尋 blk init queut 參考 drivers block xd.c 和 drivers block z2ram.c 兩個檔案。看乙個驅動程式從 入口函式 開始看。處理函式 放到佇列 放到gendisk 其他屬性 gengdisk 最終效果,檔案系統通過處理函式來實現相應的功能.塊裝置驅動...
編寫塊裝置驅動之記憶體模擬磁碟
可以參考一下核心裡面的檔案 在核心裡面收索blk init queue 然後就會發現xd.c和z2ram.c 大概看一眼,看乙個去驅動程式從入口開始看,這裡有個register blkdev註冊塊裝置驅動,跟我們字元裝置相比少了乙個fops,註冊塊裝置已經退化了,它只不過是cat prok devi...