字符設備驅動小結,塊設備驅動引入

之前學完的字符驅動設備進行一個小結

在這裏插入圖片描述

引入塊設備驅動

磁盤

在這裏插入圖片描述

flash

在這裏插入圖片描述

對於塊設備,先把所有要讀,和要寫的放入隊列,一次進行讀和寫,加快速度

先看看,app修改文件後,調用硬盤的框架
在這裏插入圖片描述

怎麼寫塊設備驅動??

1.分配gendisk : alloc_disk
2.設置
2.1分配/設置隊列: request_quete_t //提高讀寫能力的
blk_init_queue
2.2 設置 genddisk其他信息
3.註冊:add_disk

1分配gendisk結構體

在shell裏面 輸入 ls /dev/ram* - l
在這裏插入圖片描述
當次設備號爲0時,表示整塊ram,其他的是ram的分區
ramblock_disk = alloc_disk(16); /* 次設備號個數: 分區個數+1 */
這裏寫爲16 表示最多可以創建15個分區
在這裏插入圖片描述

2.設置
2.1 分配/設置隊列: 提供讀寫能力

用 blk_init_queue() 構造一個隊列 返回值是一個隊列的結構體,構造這個結構體
參1執行隊列的函數,參2 一個鎖
在這裏插入圖片描述
在這裏插入圖片描述
寫出這個執行隊列的函數
數據傳輸的三要素 源,目的,長度
在這裏插入圖片描述
源/目的 req->sector * 512; //一個扇區有512字節
在這裏插入圖片描述
設置長度
在這裏插入圖片描述
如果是讀
源:req->buffer(從buffer裏面讀) 目的:ramblock_buf+offset(讀到內存加偏移值)
在這裏插入圖片描述
如果是寫
在這裏插入圖片描述

構造完隊列後,設置這個隊列
在這裏插入圖片描述

2.2設置其他屬性

major = register_blkdev(0, “ramblock”); //分配主設備號
ramblock_disk->major = major; //設置主設備號
ramblock_disk->first_minor = 0; //設置次設備號
sprintf(ramblock_disk->disk_name, “ramblock”); //名字隨意
ramblock_disk->fops = &ramblock_fops; //經過實驗一定要構造的fops
set_capacity(ramblock_disk, RAMBLOCK_SIZE / 512); // 容量

關於容量的設置
先分配一兆 #define RAMBLOCK_SIZE (1024*1024)
設置容量,單位(扇區除以512)
在這裏插入圖片描述

另外

現在磁盤可能沒有柱面,磁頭了,但是爲了兼容老工具,我們假裝他有柱面和磁頭
在這裏插入圖片描述
容量=面扇區*(512字節)

4設置

add_disk(ramblock_disk)
在這裏插入圖片描述

測試驅動程序

insmod 驅動
在這裏插入圖片描述
這裏提示未識別的分區表,因爲裏面的分配內存都是清零的
mkdosfs /dev/ramblock //進行格式化
在這裏插入圖片描述
mount /dev/ramblock /tmp/ //掛載tmp
讀寫文件: cd /tmp, 在裏面 vi 文件等都可以。我在裏面放入了一個文件
在這裏插入圖片描述
umount /tmp/ 後,重新掛載時,裏面的內容還存在。
重新啓動開發版 fdisk /dev/ramblock
在這裏插入圖片描述
添加一個新的分區
在這裏插入圖片描述
在這裏插入圖片描述
使用默認柱面1,接着是結束柱面,爲5 這時候按p
在這裏插入圖片描述
添加的分區出來啦
在這裏插入圖片描述
現在的新分區可以分別格式化,分別掛接了

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章