开篇:润墨网以专业的文秘视角,为您筛选了一篇Ramdisk 技术应用于RTEMS 文件系统的研究范文,如需获取更多写作素材,在线客服老师一对一协助。欢迎您的阅读与分享!
摘要:目前大多数嵌入式系统使用基于Flash设备的文件系统,但由于Flash设备成本较高、速度较慢,并不适合对数据进行频繁的访问和查询,因此在这种情况下,考虑选用在嵌入式设备中成本低、容量大、速度快的内存上来建立文件系统。利用ramdisk技术在内存中模拟磁盘设备,配置并初始化Ramdisk,在经过分析FAT分区组织形式的基础上编写格式化函数将Ramdisk格式化为FAT文件系统,从而实现了rtems上文件系统的创建。
关键词:嵌入式文件系统;RTEMS;Ramdisk;FAT
中图分类号:TP311 文献标识码:A 文章编号:1009-3044(2014)05-0935-03
Research and Implementation of the Filesystems on RTEMS Based on Ramdisk Technology
LI Shun
(College of Information Engineering, Shenyang Radio and Television University, Shenyang 110003, China)
Abstract: Now most of the embedded systems use the filesystems based on flash media for storing, accessing and managing data, Since flash chips are not suitable for frequent data access and query operations due to high cost and low speed, DRAM is used as a major medium for embedded filesystems. it expatiates on simulating a disk device on DRAM with Ramdisk technology and initializing and configuring this Ramdisk, then programming a function for formatting Ramdisk to implement the filesystem on RTEMS on the basis of understanding FAT partition format.
Key words: embedded filesystem; RTEMS; Ramdisk; FAT
1 概述
RTEMS的全称是实时多处理器系统(Real-Time Executive for Multiprocessor Systems),是前美国军方研制的嵌入式系统,最早用于美国国防系统,它的特点是非常的稳定,而且速度快,源代码开放。它是面向对象的实时嵌入式系统,在RTEMS中,任务、中断、内存等等都是对象,RTEMS提供了大量的对象控制API,能动态管理这些对象,这些API能大大缩短程序代码量和开发周期。
在RTEMS上开发Ramdisk,是将Ramdisk设计为一个内存中存储数据的块设备驱动程序,类似于硬盘,软盘等其他IDE设备。它作为一个块设备向系统注册,有自己的设备名,这样应用程序就可以通过设备名来访问Ramdisk。RTEMS系统提供了一些统一的标准I/O管理函数,来屏蔽底层驱动的差异性。使用系统提供的这些管理函数可以简化Ramdisk的设计,并为应用程序提供统一的API接口。
2 Ramdisk技术
Ramdisk就是从内存空间中划分一部分区域来模拟磁盘分区来保存数据,就是把内存假设为一个磁盘驱动器,并且在它的上面存储文件。这样当嵌入式系统启动时,将Flash中的数据拷贝到Ramdisk中,然后在系统的运行过程中,数据操作全部在内存中进行,大大提高了运行的速度。
2.1 Ramdisk技术的特点
在嵌入式系统中,通常没有磁盘设备,数据都存储在各种不可擦写或可擦写的半导体芯片中。当需要存储一些数据到Flash上时,可能同时会使其它操作变得缓慢,例如当调用一个写操作时,就需要等待数据完全被写入,这会使线程间的通信停顿若干毫秒。在这些情况下,Ramdisk技术的优势就显现出来。
Ramdisk提高了应用程序的速度,像数据库查询这些频繁对存储器进行读写的应用将最大程度地发挥Ramdisk的优点。
Ramdisk最大的优点是速度快。Ramdisk还具有安全性信息保护的功能。Ramdisk的另一优点是具有高度的耐用性。
Ramdisk是一个内核级别的驱动,它为操作系统提供标准的磁盘驱动。对Ramdisk进行适当的配置,使其在系统启动的时候自动加载存储器内容,在系统关闭的时候将数据保存到存储器中,也可以选择性地保存数据。
2.2 Ramdisk在系统中的层次结构
Ramdisk驱动层在RTEMS系统中的层次结构如图1所示,最底层是Ramdisk驱动层,它包含最基本的Ramdisk设备初始化和对设备的打开、关闭、读、写、控制驱动函数;驱动层之上是文件系统层,通过调用本实验编写的格式化函数对文件系统进行格式化;最上层是应用程序层,是位于文件系统之上的具体的应程序。
图1 Ramdisk在RTEMS中的层次结构
3 Ramdisk驱动
块设备驱动要为该块设备提供通用的系统调用,一般是打开设备、关闭设备、读设备、写设备和对设备的控制。
3.1 Ramdisk驱动基本操作
Ramdisk作为一种块操作设备包含了四个基本函数:ramdisk_read(),ramdisk_write(),ramdisk_ioctl()和ramdisk_initialize()。
ramdisk_read()函数为Ramdisk设备的读请求处理函数,这个函数从Ramdisk中拷贝数据到指定的缓冲区,然后调用callout函数通知上层服务数据读取完成。
ramdisk_write()函数为Ramdisk设备的写请求处理函数,该函数从指定的缓冲区拷贝数据到Ramdisk,然后调用callout函数通知上层服务写数据完成。
ramdisk_ioctl()函数为特殊的I/O处理函数,用户可以定义一些系统标准定义接口之外的一些对设备的I/O操作,Ramdisk驱动中的ioctl函数定义了ramdisk_read()和ramdisk_write()两个操作,它通过参数提供的请求信息来决定是对Ramdisk进行读还是写。
ramdisk_initialize()函数为Ramdisk设备初始化函数,它根据事先配置好的Ramdisk属性(包括Ramdisk的块大小,块数目,块在内存中的地址等)来配置适当的Ramdisk。只有Ramdisk初始化之后,用户才能来操作它。
3.2 Ramdisk驱动数据结构
1)内部Ramdisk描述符
它定义了Ramdisk的基本属性,包括块的大小、个数和地址。Ramdisk驱动拷贝数据的基本单位是块,结构体中的每个变量的具体值在执行ramdisk_initialize()的时候被设定。
struct ramdisk
{int block_size; /* Ramdisk设备块的大小 */
int block_num; /* Ramdisk设备块的数目 */
void *area; /* Ramdisk 块在内存中的地址 */
rtems_boolean initialized; /* Ramdisk初始化标志,如果Ramdisk被初始化,该值赋1,否则该值为0 */
rtems_boolean malloced; /* 如果Ramdisk是系统动态分配的内存,该值为1,否则该值为0 */
};
2) 块设备请求结构
blkdev_request是用来从块设备中读取或者向块设备中写入一定数量块的数据,该结构体是RTEMS为块设备定义的统一标准变量。
typedef struct blkdev_request
{blkdev_request_op req; /* 块设备操作请求,读操作或写操作 */
blkdev_request_cb req_done; /* 返回函数 */
void *done_arg; /* 传给返回函数的变量表的地址 */
rtems_status_code status; /* 最后一次I/O操作完成状态 */
int error; /* 如果status!= RTEMS_SUCCESSFUL,这个值包含错误码,即错误的类型 */
blkdev_bnum start; /* 开始块号,即I/O操作从第几块开始 */
rtems_unsigned32 count; /* 进行数据交换的块的个数 */
rtems_unsigned32 bufnum; /* 缓冲池的个数 */
blkdev_sg_buffer bufs[0]; /* 分散型/聚集型缓冲列表 */
} blkdev_request;
3) Ramdisk主/从设备号
主/从设备号用来表示一个具体的设备:major是设备在设备驱动表中的索引值,通过该值可以找到该设备驱动在设备驱动表中的位置;minor表示同种设备中的某一具体设备,例如ramdisk0。
rtems_device_major_number major;
rtems_device_minor_number minor;
4 Ramdisk驱动函数流程
4.1 ramdisk_read()函数
函数原型:static int ramdisk_read(struct ramdisk *rd, blkdev_request *req);
struct ramdisk *rd:指向Ramdisk类型结构的指针
blkdev_request *req:指向READ块设备请求结构的指针。返回值为:ioctl返回值
该函数将数据从内存拷贝到提供的缓冲区并调用函数通知上层读操作已完成。如图2所示。
图2 ramdisk_read()流程图
4.2 ramdisk_write()函数
函数原型:
static int ramdisk_write(struct ramdisk *rd, blkdev_request *req);
struct ramdisk *rd:指向Ramdisk类型的指针
(下转第954页)
(上接第937页)
blkdev_request *req:指向WRITE块设备请求结构的指针。返回值为:ioctl。
该函数从提供的缓冲区中将数据拷贝出来并调用函数通知上层写操作已完成。如图3所示。
5 分析与结论
随着嵌入式系统硬件设备的普及和价格的不断降低,以及嵌入式系统应用领域的不断扩大,应用中出现越来越复杂的数据资源需要管理,因此使用文件系统成为嵌入式系统应用的一个必然趋势。
采用Ramdisk技术在RTEMS系统中建立一个FAT格式的文件系统,解决嵌入式设备中成本低、容量大、速度快的内存上来建立文件系统的需求。
参考文献:
[1] 宋廷强,高树静.控制嵌入式微控制器与处理器设计[M]. 北京:社机械工业出版社出版,2011.
[2] 王威.嵌入式微控制器So8AW原理与实践[M].北京:北京航空航天大学出版社出版,2009.
[3] Todd D.Morton. 嵌入式微控制器(英文影印版)[M].北京:科学出版社出版,2002.
[4] 平.51单片机C语言程序设计经典实例[M].北京:电子工业出版社出版,2012.
[5] 刘建辉.单片机智能控制技术[M].北京:国防工业出版社出版,2007.