微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > 块设备驱动程序的编写驱动之用内存模拟磁盘

块设备驱动程序的编写驱动之用内存模拟磁盘

时间:11-21 来源:互联网 点击:

2. 调用队列的处理函数(优化/调顺序/合并)后再执行

块设备驱动程序

---------------------------------------------

硬件: 硬盘,flash

分析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.再次挂接: mount /dev/ramblock /tmp/,后查看文件还依然存在

7. cat /dev/ramblock > /mnt/ramblock.bin

8. 在PC上查看ramblock.bin

sudo mount -o loop ramblock.bin /mnt

测试5th:

1. insmod ramblock.ko

2. ls /dev/ramblock*

3. fdisk /dev/ramblock

注:

1、对块设备进行读写操作时可能不会立即响应,先放入队列一段时间后一起执行,如果想让读写操作立即执行可以运行:sync命令,即同步命令进行同步,此时会执行没有执行的相关操作。

2、对于磁盘容量=磁头数*柱面数*扇区数*512,柱面数就是有多少环,每个扇区512字节

对于flash是有多少块,每块有多少扇区,每个扇区可以存多少字节


Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top