当前位置:Linux教程 - Linux文化 - 嵌入式Linux的DiskOnChip设备驱动开发

嵌入式Linux的DiskOnChip设备驱动开发


1 引 言

在以计算机技术、通讯技术相结合的信息时代的快速发展和互联网广泛应用的形势下,3C(Computer,Communication,Consumer)合一的趋势已经形成,其结果必然就是将计算机工业的中心从计算产品转移到嵌入式信息产品。

然而由于嵌入式系统的应用要求及成本因素决定了嵌入式系统在系统资源,包括硬件资源和软件资源方面都是非常精简和高效的。因此在嵌入式系统中的存储设备一般不会采用硬盘等大容量高功耗设备,而改用诸如CompactFlash,EPROM等存储介质。因此本文就M-systems公司开发的新一代闪存FlashDiskOnChip 2000,介绍在基于嵌入式Linux系统上文件系统和块设备的支持及驱动。

2 硬件系统结构

电子盘的内部存储介质Flash是近几年来发展最快的一种存储芯片,他具有E2PROM可擦写的特点,又同时具有EPROM廉价的特点,他是一种高性能、低功耗、电可擦除的存储器件。根据其以上一些特点,电子盘已广泛应用于信息存储、机顶盒、网络计算以及嵌入式计算机等领域。

M-system公司推出的DiskOnChip 2000系列是新一代闪存磁盘(Flash Disk)。为标准32脚DIP封装,他与标准的E2PROM完全兼容。一般的闪存器(FlashMemory)只包含存储器部分,而控制器要另加。为了对闪存磁盘进行管理,DiskOnChip中已装有MSystem公司的闪存文件系统(TrueFFS)软件。这使得他使用简单,工作中不需要任何其他特殊复杂的算法。他的读/写与硬盘完全相同,因此他可以作为独立硬盘使用,并与其他磁盘兼容。可以直接引导计算机系统而不需要其他系统盘。他适用于3.3 V和5 V电源,功耗很小,对于那些空间受限,小型便携式装置,DiskOnChip将是最佳选择。DOC2000结构主要由系统接口单元(SystemIterface)、系统引导模块(BootBlock)、闪存控制单元(FlashControl)以及和Flash存储介质等组成,其结构如图1所示。

其中系统接口单元为DOC2000提供了类似SRAM的接口,使之能够通过CPU的本地总线、ISA总线以及SRAM总线建立与操作系统的连接。DOC提供片选信号(CE#)、读写信号(WE#)、使能信号(OE#)以及13位宽的地址线(A[0:12])和8位宽的数据总线(D[0:7])。系统接口在主总线信号(读、写、地址和片选)的控制下产生相应的控制信号送入闪存磁盘,其内部的ROM提供一种IPL码,此码在计算机启动过程中将闪存文件系统软件装入PC内存。他在PC的扩展BIOS中安排了8 kB以上的存储区域,其地址为0C000H~0EFFFH。计算机开机自检后,DiskOnChip作为PC的BIOS标准操作的一部分,BIOS搜寻ROM扩展码,找到后BIOS执行闪存磁盘内的初始化码,此码将闪存文件系统软件装入内存。闪存磁盘也将被安装为系统的一个磁盘,然后将传输器控制回到BIOS码。当操作系统要确认适合系统的磁盘时,闪存磁盘软件即模仿一个硬盘做出反应。

3 TrueFFS与Linux的文件系统

TrueFFS是M-system公司开发出来的专用于电子盘设备的专利技术。TrueFFS是Tornadoll开发环境中的一个集成的快速闪存文件系统,通过TrueFFS对DOC块设备的磁盘仿真功能,从而方便了嵌入式Linux系统对电子盘的读写、分区、格式化等一系列操作。通过对操作系统的I/O控制调用。Linux可以通过VFS访问TureFFS的外部接口。

Linux文件系统最优秀的地方是对多种文件系统的支持(这里的上层结构是指VFS系统和具体的文件系统,即除buffer管理系统以外的部分)。为了实现这种特色,就必须有一个抽象的层次来统一描述各种文件系统,Linux中就用VFS来实现了这个抽象层;同时,各种具体的文件系统又必须有一个和VFS交互的手段,如图2所示。

Linux文件系统管理的最上层模块是文件系统。系统启动时,必须先装入“根”文件系统,然后根据/etc/fstab中的指定,逐个建立文件系统。此外,用户也可以通过mount,umount操作,随时安装或卸载文件系统。Linux系统调用操作系统的GetDriveHandle()函数得到驱动器的句柄,他的返回值是一个能够供I/O控制函数调用的TrueFFS驱动的描述符。然后再调用操作系统中文件系统的IOCongtrol()函数,通过VFS的支持,使TrueFFS具有通用文件系统的特性。当某个进程发布了一个面向文件的系统调用时,核心将调用VFS中相应的函数,这个函数处理一些与物理结构无关的操作,并且把他重定向为真实文件系统中相应的函数调用,而这些函数调用则用来处理那些与物理结构相关的操作。

4 构建嵌入式Linux内核DOC设备支持

DOC通过TrueFFS磁盘仿真的支持,Linux系统可把DOC驱动编译成模块(doc.o)进行支持,并可用于系统加载后的辅助存储盘使用,同时也可把DOC核心驱动加载入Linux内核,在系统启动时进行驱动和加载。

在Linux系统中DOC设备被模拟为IDE块设备进行识别,系统用主设备号(MAJOR)加次设备(MINOR)号来惟一标识一个设备。相同主设备号表示同一类设备,例如都是硬盘;次设备号标识同类设备的个数。所有设备在适当的目录(通常在/dev目录)下必须有相应的文件,这样字符设备和块设备都可以通过文件操作的系统调用来完成。不同的是,块设备操作经常要和缓冲区打交道,从而更加复杂一些。系统设备管理的总体框图如图3所示。

构建内核对DOC块设备的支持:

(1)设备的设备名称和主设备号

必须找一个还没有被使用的主设备号,分配给自己的新设备。假设主设备号为30(在2.0.34的内核中还没有以30作为主设备号的块设备),则需要在include/Linux/major.h中加入如下句:

71#define MY_MAJOR 30

这样可以通过MY_MAJOR来确定设备为新设备,保证通用性。

(2)确定编写需要的file_operations中的操作函数

  

由于使用了高速缓存,块设备驱动程序就不需要包含自己的read(),write()和fsync()函数,但必须使用自己的open(),release()和ioctl()函数,这些函数的作用和字符设备的相应函数类似。

(3)确定编写需要的输入/输出函数

  

值得注意的是这2个函数和字符设备中的myread(),mywrite()函数不同。

(4)确定编写需要的请求处理函数

在块设备驱动程序中,不带中断服务子程序的请求处理函数是简单的,典型的格式如下:

 

实际上,一个真正的块设备一般不可能没有中断服务子程序,另外设备驱动程序是在系统调用中被调用的,这时由内核程序控制CPU,因此不能抢占,只能自愿放弃;因此驱动程序必须调用sleep_on()函数,释放对CPU的占用;在中断服务子程序将所需的数据复制到内核内存后,再由他来发出wake_up()调用。

5 结 语

DOC作为一种新型闪存电子盘,以盘体体积小、功耗低和带硬盘仿真功能等特点,在一些对电源功耗要求苛刻、空间狭小的嵌入式场合,有他很独到的优势;加之目前生活自动化(LA)、智能设备终端等领域的技术日趋成熟,在嵌入式操作系统应用日益广泛的今天,嵌入式操作系统对此类电子盘设备的支持日益完善。本文结合嵌入式Linux系统介绍和分析了其下DOC2000的设备驱动和文件系统的支持,可广泛用于工业控制系统、网络视频以及POS机系统储存中,具有实用的价值。