11.3.4 RAM 盘驱动程序的实现

 1. RAM盘的硬件

利用 RAM 盘的驱动程序可以访问内存的任何部分,它的主要用途是保留一部分内存并普通磁盘一样来使用它。

RAM盘的思想很简单,块设备是有两个操作的命令的存储介质:即写数据块和读数据块。通常这些数据存储于旋转存储设备上如软盘和硬盘,RAM盘则简单得多,它利用预先分配的主存来存储数据块。因此不存在向磁盘那样的寻道操作,其读写操作只是在内存间进行的。RAM盘具有快速存取的优点(没有寻道和旋转延迟的时间),适合于存储需要频繁存取的数据。

操作系统根据对 RAM 盘的需求为它分配内存的大小,RAM盘被分成几块,每块的大小同实际磁盘的块的大小相同。一个RAM盘驱动程序支持将存储器中的若干区域当作RAM盘来使用,不同的 RAM 盘用次设备号来区分。

2. Linux RAM盘的驱动程序

RAM盘的驱动程序同其它所有的驱动程序一样都是由一组函数组成,对RAM盘的操作实际上是对内存的操作,它不需要中断机制,故RAM盘的驱动程序不包括中断服务子程序.。一般我们对于一个驱动程序的分析是在了解硬件的基础上从该设备所提供的操作入手的,相应的写驱动程序也应该是这样的。

下面是 RAM 盘操作的结构:

s static struct block_device_operations rd_bd_op = {

         owner:          THIS_MODULE,

         open:           rd_open,

         ioctl:          rd_ioctl,

 };

 

Linux 中,RAM盘的主设备号是1  rd_open ( ) 函数中,它首先检测设备号是否INITRD_MINOR,由于INITRD 是在系统一启动的时候就已经创建了的,其中映象的是操作系统从偏移地址0开始的内容,即内核空间,如果是内核空间,其接口需要相应的发生变换即:filp->f_op = &initrd_fops

static struct file_operations initrd_fops = {

         read:           initrd_read,

         release:        initrd_release,

 };

    对于INITRD盘的操作用户只有读和释放的权限而无写的权限。initrd_read ( ) 函数执行的是从内核区进行的读操作,故而是利用 memcpy_tofs (buf (char *) initrd_start+file->f_poscount ) 去完成的。initrd_release ( ) 函数在判断没有用户操作这个设备之后,以页的方式把 INITRD 盘所占的内存释放掉。

在普通 RAM 盘接口中的另一个函数 为rd_ioctl ( ) ,同其它设备驱动程序一样是执行一些输入/输出的控制操作。

RAM盘的驱动程序可以以模块的形式进行编译,所以驱动程序中还有一些关于模块的操作,关于模块的知识请参见上一章。

int init_module(void)         执行rd_init();

void cleanup_module(void) 释放模块的时候首先要把保护的缓冲区标志为无效,然后取消 ramdisk 的注册;

 

RAM盘中还有三个函数比较重要:

 

1int  identify_ramdisk_image(kdev_t device, struct file *fp, int start_block)

检测设备中被映象文件的文件系统的类型,返回被映象的最大块数。

 

2static void rd_load_image(kdev_t device,int offset)

把文件映象RAM盘,从偏移地址offset开始。

 

3void rd_load ( )

用软盘启动的时候装载映象文件到ROOT_DEV中。

 

至此,我们对于 Linux 中关于 RAM  的实现有一个大体的了解,下面我们再看一个较复杂的驱动程序——硬盘的驱动程序。