本文的主要工作是通过硬盘来模拟内存,按照块设备驱动编程的框架实现一个简单的块设备驱动程序。
一、前期的准备工作
1、基本开发环境
Linux内核版本:Linux-3.4.10
开发板 : JZ2440(ARM9)
2、块设备驱动的一般开发步骤
a、分配一个gendisk的结构体变量
b、设置这个结构体变量,
b1、分配设置一个队列,通过它来为块设备提供读写能力
b2、设置gendisk结构体的其他成员
c、注册这个gendisk结构体的变量
二、编写块设备驱动程序
通过在内存中分配2MB的空间来模拟硬盘,实现简单的块设备的读写、格式化、挂接等操作。为了驱动编写的方便,定义了这样一个全局的结构体,并通过这个结构体定义了一个全局变量,具体实现如下:
/* 定义一个yl_ramdisk_t的结构体,封装驱动程序使用的各种数据 */
struct yl_ramdisk_t
{
int major; // 主设备号
unsigned char *ramdisk_buffer; // 在内存中分配的缓冲区的存储区
struct gendisk *gendisk; // 定义一个gendisk结构体变量指针变量
struct request_queue *queue; // 定义一个请求队列的结构体指针变量
};
/* 定义一个yl_ramdisk结构体的全局变量 */
static struct yl_ramdisk_t yl_ramdisk;
1、分配一个gendisk结构体变量,具体实现如下:
/* 1、分配一个gendisk结构体变量 */
yl_ramdisk.gendisk = alloc_disk(8); /* 分区数 + 1 = minors*/
if (!yl_ramdisk.gendisk)
{
printk("alloc_disk error!\n");
return -ENOMEM;
}
2、设置这个分配的gendisk结构体变量的成员,具体如下:
2.1 分配一个队列,主要是为了给块设备提供读写能力