6.块设备驱动程序--三:完善内存模拟磁盘

1,“硬件相关操作”:分配内存。

//声明一个块内存
static unsigned char *ramblock_buf;
//3,硬件相关操作:
 ramblock_buf = kzalloc (RAMBLOCK_SIZE, GFP_KERNEL); //分配内存

...
static void rmablock_exit(void)
{
...
kfree(ramblock_buf);//释放内存
}

2,在“队列请求”处理函数中操作:实现内存模拟磁盘。

①,数据传输三要素:
涉及到数据的传输,则离不开“三要素”:块设备数据传输的三要素在结构体“request”
中定义:


struct request {
sector_t sector; /* next sector to submit 下一个要提交的扇区。这就源或是目的*/
…
unsigned int current_nr_sectors; //当前要处理的扇区个数。这是长度。
…
char *buffer; //要写时这时目的(从扇区读数据到此),要读时这是源。
}

块设备操作时是以扇区为单位,即使是写一个字节,也是先读出一个扇区,再修改这个扇
区里的那个字节后,再将整个扇区写进去。
②,读写的方向:


while( (req = elv_next_request(q)) != NULL ){ //以电梯调度算法取出队列下一个请求,但没处理直
接返回.
 //数据传输三要素:源,目的,长度 结构request中会有这三要素.
 //3.3,源 或者 目的
 unsigned long offset = req->sector <<9; //偏移值。左移9位相当于乘以512-1个扇区大小.
故相当于 req->sector*512.
 //3.4, 目的 或者 源 : req->buffer
 
 //3.5,长度
 unsigned long len = req->current_nr_sectors <<9; //长度。当前要传输多少个扇区.
 //方向:读写。
 if(rq_data_dir(req) == READ) //若是读
 {//memcpy(目的,源,长度);
 memcpy(req->buffer, ramblock_buf+offset, len); //从磁盘上的源读长度len到目的内存
的buffer。
 }
 else //写则倒过来
 {
 memcpy(ramblock_buf+offset, req->buffer,len); //把内存buffer中的数据写到磁盘上.
 }
 
 end_request(req, 1); 
 }

这样这后,一会就可以格式化,挂接内容了。

3,再编译后测试:
①. insmod ramblock.ko
1
还是提示了“未识别的分区表”,这是因为分配的内存全都是清 0 的。
ramblock_buf = kzalloc (RAMBLOCK_SIZE, GFP_KERNEL); //分配内存
里面还没有分区表。

②. 格式化: mkdosfs /dev/ramblock
2
③. 挂接: mount /dev/ramblock /tmp/
4
④. 读写文件: cd /tmp, 在里面 vi 文件等都可以。
⑤. cd /; umount /tmp/ 后,重新挂载时,里面的内容还存在
5
⑥. cat /dev/ramblock > /mnt/ramblock.bin
可以把整个磁盘 cat 成一个 bin 文件。相当于一个镜像。
上面都是在开发板上操作的。

⑦. 在 PC 上查看 ramblock.bin

sudo mount -o loop ramblock.bin /mnt 

(-o loop 回还设备:可将一个普通文件当成一个块设备文件挂接。)
6
在PC机上也可以看到之前在开发板上创建的两个文件。证明块设备实验成功了。
用内存来模拟,忽略了硬件的复杂操作。这里只用了“memcpy()”就实现了硬件操作

二:开始试着分区:

1.使用fdisk分区
在这里插入图片描述
提示不知道“柱面”数。现在可能有的磁盘已经没有这种结构了,但是为了兼容这些“fdisk”老工具,要假装说自已有多少个“磁头”,多少个“柱面”。这些信息就是由
“block_device_operations(块设备的操作函数)提供。
2.要加上“.getgeo = ramblock_getgeo”这个函数。
用内存模拟磁盘,没有磁头,柱面,扇区的概念,但为了用这个“fdisk”老工具,也得假装有这些属性。

222
3.重新加载有“磁头、柱面、扇区”信息的驱动
在这里插入图片描述

在这里插入图片描述
开始分区:
1.fdisk /dev/ramblock
在这里插入图片描述
2.输入m,获取帮助信息
3.输入n,添加一个新分区
在这里插入图片描述
4.输入p,创建主分区
5.输入1,创建第一个主分区
6.“First cylinder”,主分区1 的开始柱面数,可填写(1-32),默认为1,输入1
7.“Last cylinder”, 主分区1 的结束柱面数,这里假设为5
这时可以p,查看主分区1已经出来了
在这里插入图片描述

8.再添加一个主分区
在这里插入图片描述
9.最后输入“w”,将分区信息写入硬盘

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值