大家好,今天主要和大家聊一聊,如何使用linux系统中的块设备的实现方法。
目录
第一:块设备基本简介
第二:块设备驱动框架
第三:实现程序代码实现
第一:块设备基本简介
块设备驱动与字符设备驱动之间的主要区别:
1、块设备只能以块为单位进行读写访问,块是 linux 虚拟文件系统(VFS)基本的数据传输 单位。字符设备是以字节为单位进行数据传输的,不需要缓冲。
2、块设备在结构上是可以进行随机访问的,对于这些设备的读写都是按块进行的,块设 备使用缓冲区来暂时存放数据,等到条件成熟以后再一次性将缓冲区中的数据写入块设备中。 这么做的目的为了提高块设备寿命,大家如果仔细观察的话就会发现有些硬盘或者 NAND Flash 就会标明擦除次数(flash 的特性,写之前要先擦除),比如擦除 100000 次等。因此,为了提高块 设备寿命引入了缓冲区,数据先写入到缓冲区中,等满足一定条件后再一次性写入到真正的物 理存储设备中,这样就减少了对块设备的擦除次数,提高了块设备寿命。
第二:块设备驱动框架
linux内核使用block_device表示块设备,block_device为一个结构体。
struct block_device{
dev_t bd_dev;
int bd_openers;
struct gendisk *bd_disk;
};
//bd_disk 成员变量,此成员变量为gendisk 结构体指针类型。内核使用 block_device 来表示一个具体的块设备对象,比如一个硬盘或者分区,如果是硬盘的话 bd_disk 就指向通用磁盘结构 gendisk。
第三:实现程序代码实现
#include <linux/types.h>
//ramdisk设备结构体
struct ramdisk_dev{
int major; //主设备号
unsigned char *ramdiskbuf; //用于模拟块设备
struct gendisk *gendisk; //gendisk
struct request_queue *queue; //请求队列
};
/* 驱动的入口函数
* 参数:无
*/ 胡工
static int __init ramdisk_init(void)
{
//申请用于ramdisk内存
ramdisk.ramdiskbuf = kzalloc(RAMDISK_SIZE,GFP_KERNEL);
//初始化自旋锁
spin_lock_init(&ramdisk.lock);
//注册块设备
ramdisk.major = register_blkdev(0, RAMDISK_NAME); /* 自动分配 */
//分配并初始化gendisk
ramdisk.gendisk = alloc_disk(RADMISK_MINOR);
//分配并初始化请求队列
ramdisk.queue = blk_init_queue(ramdisk_request_fn,&ramdisk.lock);
}
使用 mkfs.vfat 命令格式化/dev/ramdisk,将其格式化成 vfat 格式,输入如下命令: mkfs.vfat /dev/ramdisk
格式化完成以后就可以挂载/dev/ramdisk 来访问了,挂载点可以自定义,这里笔者就将其挂 载到/tmp 目录下,输入如下命令: mount /dev/ramdisk /tmp 挂载成功以后就可以通过/tmp 来访问 ramdisk 这个磁盘了,进入到/tmp 目录中,可以通过 vi 命令新建一个 txt 文件来测试磁盘访问是否正常。
总结:驱动加载成功以后会在/dev/目录下生成一个名字为“ramdisk”的设备 ,可以输入一下命令ramdisk磁盘信息: fdisk -l