編寫塊裝置驅動之記憶體模擬磁碟

2021-07-29 10:09:56 字數 3434 閱讀 6563

可以參考一下核心裡面的檔案

在核心裡面收索blk_init_queue

然後就會發現xd.c和z2ram.c

大概看一眼,看乙個去驅動程式從入口開始看,

這裡有個register_blkdev註冊塊裝置驅動,跟我們字元裝置相比少了乙個fops,註冊塊裝置已經退化了,它只不過是cat /prok/device 可以看到一些資訊。或者前面xt_disk_major寫為0的時候可以返回乙個主裝置號給你

初始化乙個佇列

這個函式裡面第乙個引數就是處理佇列的函式

那佇列怎麼用呢,往下看

這裡分配乙個gendisk結構體,然後disk->queue=xd_queue

這裡是註冊這個disk

下面我們參考這兩個檔案來謝謝**

/*1.分配乙個gendisk結構體*/

ramblock_disk=alloc_disk();

這後面的引數是次裝置個數,什麼意思呢??

我們在虛擬機器裡面使用這行命令    ls  /dev/sd* -l

然後會出現如下狀況

對於乙個塊裝置  次裝置號為0的時候 就是表示整個磁碟。

次裝置 1 2表示它們第幾個分割槽 1 2表示第一 二個 分割槽  5表示拓展分割槽

所以這個引數就應該寫為最多分割槽個數+1,因為0分割槽代表整個硬碟

分配/設定佇列 提供讀寫能力 用這個函式

這個函式的引數第乙個是執行佇列的函式,第二個是鎖 需要乙個自旋鎖

我們進入這個函式看一看

然後在進去看一看那

進入q = blk_init_allocated_queue_node(uninit_q, rfn, lock, node_id);這個函式裡面看一看

這裡有提供了預設的構造請求的函式

然後再是我們的設定屬性

disk->major = xt_disk_major;  //主裝置號,主裝置號怎麼來的呢??? 跟我們前面寫字元裝置一樣的

disk->first_minor = i<<6; 

disk->fops = &xd_fops;  //經過實驗 儘管你這裡什麼都沒有 你也要提供這麼乙個結構體

disk->private_data = p;  //這個私有資料我們不需要

disk->queue = xd_queue; 這個佇列就是我們前面分配的佇列

set_capacity(disk, p->heads * p->cylinders * p->sectors);  //容量 ,注意了這裡要以扇區為單位,在檔案系統裡面他任務扇區就是512個位元組

資料傳輸3要素,這個 struct request裡面肯定有這三要素

**#include

#include

#include

#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 *ramblock_queue;

static define_spinlock(ramdisk_lock);

static int major;

static unsigned char *ramblock_buf;

static int ramblock_getgeo(struct block_device *bdev, struct hd_geometry *geo)

static const struct block_device_operations ramblock_fops = ;

#define ramblock_size (1024*1024)

static void do_block_request (struct request_queue * q)

}static int ramblock_init(void)

static void ramblock_exit(void)

module_init(ramblock_init);

module_exit(ramblock_exit);

module_license("gpl");

module_author("eight");

測試1.insmod 驅動

2.格式化mkdosfs /dev/ramblock

3.掛接

4.讀寫檔案cd /tmp 在裡面讀寫檔案

5. cd /    umout /tmp

6.然後在掛接

分割槽測試

輸入m看下幫助資訊

輸入n 分割槽

p 主分割槽

第乙個柱面1-32

所以分割槽就是1 2 3 4 5柱面合起來就是乙個分割槽

第乙個分割槽是從1到5柱面

是用w命令寫入分割槽表裡面去

Linux塊裝置驅動之記憶體模擬塊裝置

用記憶體代替塊裝置的總結,相對來簡單得多,對記憶體操作想必大家都很熟悉,直接分配一塊記憶體就可以直接讀寫操作了 參考 drivers block xd.c drivers block z2ram.c define ramblock size 1024 1024 乙個扇區是512位元組 static ...

塊裝置驅動程式分析之記憶體模擬磁碟

include include include include include include include include include include include include include include include include include include includ...

塊裝置驅動之記憶體模擬硬碟

一.塊裝置驅動框架 與字元裝置相比什麼差別 1.塊裝置僅僅能以塊為單位接受輸入和返回輸出。而字元裝置則以位元組為單位。大多數裝置是字元裝置,由於它們不須要緩衝並且不以固定塊大小進行操作。2.塊裝置對於i o請求有相應的緩衝區。因此它們能夠選擇以什麼順序進行響應,字元裝置無需緩衝且被直接讀寫。對於儲存...