本文**於:1.
塊裝置相關的資料結構以及介面:
塊裝置介面則相對複雜,讀寫api沒有直接到塊裝置層,而是直接到檔案系統層,然後再由檔案系統層發起讀寫請求。
一: block_device: block_device結構代表了核心中的乙個塊裝置。它可以表示整個磁碟或乙個特定的分割槽。當這個結構代表乙個分割槽時,它的bd_contains成員指向包含這個分割槽的裝置,bd_part成員指向裝置的分割槽結構。當這個結構代表乙個塊裝置時,bd_disk成員指向裝置的gendisk結構。
struct block_device ;
二:gendisk是乙個單獨的磁碟驅動器的核心表示。核心還使用gendisk來表示分割槽。
struct gendisk ;
gendisk結構的操作函式包括以下幾個:
struct gendisk *alloc_disk(int minors); //分配磁碟
void add_disk(struct gendisk *disk); //增加磁碟資訊
void unlink_gendisk(struct gendisk *disk) //刪除磁碟資訊
void delete_partition(struct gendisk *disk, int part); //刪除分割槽
void add_partition(struct gendisk *disk, int part, sector_t start, sector_t len, int flags);//新增分割槽
三: block_device_operations結構是塊裝置對應的操作介面,是連線抽象的塊裝置操作與具體塊裝置操作之間的樞紐。
struct block_device_operations ;
block_device_operations並不能完全提供檔案操作全部的api,實際上只提供了open、release等函式,其他的檔案操作依賴於def_blk_fops:
const
struct file_operations def_blk_fops = ;
四: 系統對塊裝置進行讀寫操作時,通過塊裝置通用的讀寫操作函式將乙個請求儲存在該裝置的操作請求佇列(request queue)中,然後呼叫這個塊裝置的底層處理函式,對請求佇列中的操作請求進行逐一執行。request_queue結構描述了塊裝置的請求佇列,該結構定義如下:
struct request_queue
;
//建立佇列時提供了乙個自旋鎖。
request_queue_t *blk_init_queue(request_fn_proc *rfn, spinlock_t *lock);
//獲得佇列中第乙個未完成的請求。
struct request *elv_next_request(request_queue_t *q);
void end_request(struct request *req, int uptodate);//請求完成
void blk_stop_queue(request_queue_t *queue); //停止請求
void blk_start_queue(request_queue_t *queue); //開始請求
void blk_cleanup_queue(request_queue_t *);//清除請求佇列
五:向核心註冊和登出乙個塊裝置可使用如下函式:
int register_blkdev(unsigned int major, const
char *name);
int unregister_blkdev(unsigned int major, const
char *name);
Linux塊裝置驅動
塊裝置提供塊裝置提供裝置的訪問,裝置的訪問,可以隨機的以固定大小的塊傳輸資料,例如我們最為常見的磁碟裝置,當然塊裝置和字元裝置有較大差別,塊裝置有自己的驅動介面。簡單來說,核心決定乙個塊是固定的4096 位元組,當然該值可以隨著依賴檔案系統的變化而改變。塊裝置驅動採用register blkdev向...
Linux塊裝置驅動之記憶體模擬塊裝置
用記憶體代替塊裝置的總結,相對來簡單得多,對記憶體操作想必大家都很熟悉,直接分配一塊記憶體就可以直接讀寫操作了 參考 drivers block xd.c drivers block z2ram.c define ramblock size 1024 1024 乙個扇區是512位元組 static ...
塊裝置驅動
若塊裝置驅動程式也按以下字元裝置驅動程式的簡單思想來寫 1.硬碟 磁碟的讀寫其實非常快,慢在機械結構讀寫裝置的定位上面,從乙個 磁頭 的某 柱面 某 扇區 讀到資料後 步驟 r0 跳到另乙個 磁頭 的某 柱面 的某 扇區 去寫 步驟 w 接著再跳回原 磁頭 相同柱面的下乙個 扇區 去讀 步驟r1 慢...