一种基于UEFI固件的EXT文件系统的实现方法
技术领域
本发明属于计算机固件技术领域,涉及一种基于UEFI固件的EXT文件系统的实现方法。
背景技术
UEFI(Unified Extensible Firmware Interface,统一的可扩展固件接口)规范是从EFI(Extensible Firmware Interface,可扩展固件接口)发展而来的。EFI是Intel为PC固件(或称为BIOS)的体系结构、接口和服务提出的建议标准。UEFI是由EFI1.10为基础发展而来,它的所有者已不再是Intel,而是一个称为Unified UEFI Form的国际组织。
EXT(Extended Filesystem)文件系统是Linux最传统的磁盘文件系统。文件系统会将磁盘中存储数据的单元划分成一个个的块(后面简称为block),每一个block都有一个编号。一般文件系统划分的block大小为512字节,有的文件系统划分block大小为1024字节。EXT文件系统中,第二个block为超级块(后面称为Super Block),Super Block里面记录的是整个文件系统的基本信息,包括这个文件系统中block和inode的总数量,以及block和inode的使用情况。EXT文件系统中将文件分为目录文件,普通文件和链表文件等几种。文件的文件名、属性和文件的实际数据是分开存储的,即存在不同的block中。inode是存放文件名和文件属性的block,一个文件对应一个inode,同时inode记录了文件实际数据所在的block号。
Intel在推出EFI规范的时候同时也推出了遵循EFI规范的固件开发工具包,称为EDK(EFI Develop Kit),EDK的升级版本为EDKII。在EDK或者EDKII中有对FAT(File Allocation Table,微软发明的一种文件系统)文件系统的支持,但是没有对EXT文件系统的支持。而本发明就是基于UEFI固件来实现EXT文件系统,使在UEFI固件下可以对EXT文件系统进行支持,即可以以文件的形式来访问EXT文件系统内的文件。
目前UEFI固件中只有FAT文件系统的实现,尚未发现实现EXT文件系统。
发明内容
有鉴于此,本发明提供了一种基于UEFI固件的EXT文件系统的实现方法,本发明就是在UEFI固件层实现EXT文件系统,提供符合UEFI规范的文件系统读写接口函数。
为了达到上述目的,本发明的技术方案包括如下步骤:
步骤一、采用统一的可扩展固件接口UEFI固件加载扩展文件系统EXT的驱动,并运行驱动的入口函数,在EXT驱动的入口函数处安装一个可扩展固件接口EFI的驱动绑定协议EFI_DRIVER_BINDING_PROTOCOL类型的Protocol。
步骤二、UEFI固件查找硬件平台中所有的块设备,当查找到一个块设备之后,调用所有EFI_DRIVER_BINDING_PROTOCOL的Support函数,当调用到EXT文件系统驱动所安装的EFI_DRIVER_BINDING_PROTOCOL的Support函数时,Support函数会判断这个块设备是否有DiskIo Protocol,如果有则驱动匹配成功进入步骤三;若没有则驱动匹配不成功,UEFI固件重复本步骤二,继续查找块设备直至驱动匹配成功;所述块设备中安装一个DiskIo Protocol。
步骤三、对于驱动匹配成功的当前块设备,UEFI固件调用EXT的EFI_DRIVER_BINDING_PROTOCOL的Start函数,Start函数利用DiskIo读取当前磁盘中的超级块Super Block,然后按照EXT文件系统规范解析Super Block,并判断Super Block的MAGIC标志位是否为EXT文件系统的MAGIC标志位,如果是则表明当前磁盘中的文件系统是EXT文件系统则进入步骤四,否则当前磁盘的文件系统不是EXT文件系统。
步骤四、步骤三中确定为EXT文件系统后,利用DiskIo读取EXT根目录中的inode信息,并利用这些信息来初始化EXT驱动所需的全局变量。
步骤五、EXT的EFI_DRIVER_BINDING_PROTOCOL的Start函数安装一个EFI的简单文件系统协议EFI_SIMPLE_FILE_SYSTEM_PROTOCOL类型的Protocol,并通过这个Protocol向外部提供文件系统的访问接口函数OpenVolume。
步骤六、UEFI固件或其他驱动就通过所述访问接口函数OpenVolume来获取访问EXT文件系统的操作接口函数;由此,完成了基于UEFI固件的EXT文件系统的实现。
进一步地,块设备为整块磁盘或者是磁盘的一个分区。
进一步地,操作接口函数包括打开函数Open,关闭函数Close,删除函数Delete,读函数Read,写函数Write,当前位置获取函数GetPosition,当前位置设置函数SetPosition,文件属性获取函数GetInfo,文件属性设置函数SetInfo,刷新文件函数Flush。
有益效果:
1、目前UEFI固件中只有FAT文件系统的实现,尚未发现实现EXT文件系统,本发明就是在UEFI固件层实现EXT文件系统,提供符合UEFI规范的文件系统读写接口函数。
2、本发明基于UEFI固件实现了一套EXT文件系统的驱动,使UEFI固件可以对磁盘的EXT分区下的文件进行打开、关闭、读、写、删除、定位、获取文件属性,设置文件属性等操作。
附图说明
图1为EXT文件系统驱动模块结构图;
图2为EXT文件系统驱动模块流程图。
具体实施方式
下面结合附图并举实施例,对本发明进行详细描述。
本发明的目的是为了克服已有技术的缺陷,为了解决UEFI固件层对EXT文件系统的支持问题,提出一种基于UEFI固件的EXT文件系统的实现的方法。
UEFI规范将固件分为SEC、PEI、DXE、BDS、TSL、RT、AL共7个阶段,每个阶段都实现不同的功能。UEFI固件的特性是可扩展性和模块化,即UEFI固件下的大部分功能都是以模块化的驱动(Driver)形式实现的,这些驱动大部分是在PEI阶段和DXE阶段进行加载和运行的,同一阶段的驱动都有一个统一形式的入口函数,驱动的功能是进行一些硬件初始化工作或提供一些函数接口供外部调用。当一个驱动需要给外部提供函数接口时,它是通过安装一个PPI(PEI阶段)或者安装一个Protocol(DXE阶段)来实现的。即驱动在内部安装一个PPI或Protocol,而外部需要调用这个驱动的函数接口的时候,先通过UEFI固件的系统函数找到这个Protocol,然后,通过这个Protocol来调用驱动的接口函数。
本发明就是在DXE阶段实现一个驱动,并安装一个Protocol来给外部提供一些函数接口,来实现EXT文件系统的打开、关闭、删除、读出、写入、获取文件位置、设置文件位置、获取文件属性、设置文件属性等文件操作。如图1所示为EXT文件系统驱动模块结构图。
EXT文件系统驱动模块主要包括以下4个子模块:
1)识别分区:该子模块用于读取硬盘设备、解析超级块,识别硬盘EXT文件系统分区。
2)参数配置:该子模块用于读取根文件以及Inode等文件系统信息,并对EXT文件系统驱动的变量进行配置。
3)DXE驱动接口:。该子模块用于对外部调用提供访问接口,包括Support,Start,Stop。
4)文件系统操作:该子模块用于实现对文件系统中文件的增、删、改等操作,具体包括Open,Close,Delete,Read,Write,GetPosition,SetPosition,GetInfo,SetInfo,Flush。
本发明实现的驱动是一个UEFI Driver Module类型的驱动,UEFI DriverModule是UEFI规范中定义的一种驱动类型,这类驱动会在驱动入口函数中安装一个EFI_DRIVER_BINDING_PROTOCOL类型的Protocol,这个Protocol会给外部提供三个接口函数,分别为Supported函数,Start函数和Stop函数,这三个函数主要供UEFI固件的基础代码调用。UEFI固件在发现一个对象(这个对象可以为一个硬件,如一块硬盘,也可以为一个硬件的一部分,如硬盘的一个分区)的时候,会通过调用所有的EFI_DRIVER_BINDING_PROTOCOL的Supported函数来判断哪个Driver有可能能驱动这个对象,即Driver能和对象匹配的上。如果Supported函数返回成功,则表明想要的驱动和这个对象能匹配的上,则固件会调用相应的Start函数来执行相应的驱动内容。在Start函数里面,会进行一些硬件或其他的初始化动作,并且按照需要安装一些Protocol,而这些安装的Protocol就是这个驱动提供给外部的接口函数。EFI_DRIVER_BINDING_PROTOCOL的Stop函数是在卸载驱动的时候被调用的。
如图2所示,本发明方法是通过下述技术方案实现的:
一种基于UEFI固件的EXT文件系统的实现的方法,其基本实施过程如下:
步骤一、UEFI固件加载EXT文件系统的驱动,并运行驱动的入口函数,在EXT文件系统驱动的入口函数处安装一个EFI_DRIVER_BINDING_PROTOCOL类型的Protocol。
步骤二、UEFI固件找到一个块设备(可以为整块磁盘或者是磁盘的一个分区,一般都会安装一个DiskIo Protocol)后,会调用所有EFI_DRIVER_BINDING_PROTOCOL的Support函数,当调用到EXT文件系统驱动所安装的EFI_DRIVER_BINDING_PROTOCOL的Support函数时,Support函数会判断这个对象是否有DiskIo Protocol,如果有则驱动匹配成功。
步骤三、当步骤二执行成功后,UEFI固件会调用EXT的EFI_DRIVER_BINDING_PROTOCOL的Start函数。Start函数会利用DiskIo读取磁盘的Super Block,然后按照EXT文件系统规范解析Super Block,并判断Super Block的MAGIC标志位是否为EXT文件系统的MAGIC标志位,如果是则表明当前磁盘中的文件系统是EXT文件系统。
步骤四、步骤三中确定为EXT文件系统后,利用DiskIo读取EXT根目录(Root Directory)的inode信息,并利用这些信息来初始化EXT驱动所需要的一些全局变量。
步骤五、步骤四完成后,Start函数会安装一个EFI_SIMPLE_FILE_SYSTEM_PROTOCOL类型的Protocol,并通过这个Protocol向外部提供访问文件系统的接口函数OpenVolume。
步骤六、步骤五完成后,UEFI固件或其他驱动就可以通过EFI_SIMPLE_FILE_SYSTEM_PROTOCOL的OpenVolume来获取访问EXT文件系统的接口函数,这些接口函数包括Open,Close,Delete,Read,Write,GetPosition,SetPosition,GetInfo,SetInfo,Flush等,分别对应文件的打开、关闭、删除、读、写、获取当起位置、设置当前位置、获取文件属性、设置文件属性、刷新文件等操作。
自此,就完成了基于UEFI固件的EXT文件系统的实现。
综上,以上仅为本发明的较佳实施例而已,并非用于限定本发明的保护范围。凡在本发明的精神和原则之内,所作的任何修改、等同替换、改进等,均应包含在本发明的保护范围之内。