发明内容
本发明的目的主要是为了解决上述现有技术的缺陷,提供一种基于龙芯便携机的UEFI固件的实现方法。根据这个方法,可以在龙芯便携机上实现出符合国际主流UEFI固件规范、可扩展性强、功能完善的固件产品,以支持龙芯便携机的正常启动和运行。
一种基于龙芯便携式计算机的UEFI固件的实现方法,固件划分为硬件抽象层、固件核心层、设备协议层和固件应用层。
其中,硬件抽象层实现处理器、内存、芯片组等关键硬件部件的初始化,对其他板级硬件进行包装和抽象并实现初始化,同时为上层模块提供访问底层硬件设备的函数接口。其包括处理器驱动模块、芯片组驱动模块、外设驱动模块和电源管理模块,处理器驱动模块完成处理器、内存的初始化工作,并提供访问处理器和内存的接口;芯片组驱动模块主要完成龙芯便携机硬件平台中南北桥芯片的初始化工作,包括桥片本身和各个外设控制器的初始化和资源分配工作,并提供访问南北桥的接口;外设驱动模块主要是主板上各种外设的驱动,如显卡、硬盘、键盘、USB设备、网卡等,每个外设会对应一个(或多个)驱动模块;电源管理模块主要是用来配合操作系统来完成系统的待机、休眠和唤醒等功能,并实现设备电源管理相关的功能和函数接口。
固件核心层类似于操作系统的内核,建立UEFI中的系统服务表,进行固件中所有模块的统一管理和各种资源的管理。其包括固件核心加载模块、固件核心模块和基础架构功能模块,固件核心加载模块负责加载固件核心模块,并为其准备运行环境,固件核心模块负责建立UEFI规范中的启动服务(Boot Service)和运行时服务(Runtime Service)表,加载、运行其他功能模块,管理各模块之间的交互,实现内存的管理,实现和维护时钟中断和事件机制,实现和维护固件应用的特权级机制,实现UEFI规范中定义的Protocol的管理机制,实现UEFI规范要求实现的其他机制和功能,如调试接口、压缩算法、变量存储/处理等。基础架构功能模块实现UEFI规范中的Architectural Protocol,包括多个功能模块,每个模块实现一个Architectural Protocol。每个Architectural Protocol包含一些基础服务接口,供固件中的其他功能模块调用。
设备协议层实现各种标准的工业规范,包括总线协议、外设接口、网络协议栈等。其包括总线协议模块和网络协议栈模块,总线协议模块实现各种总线协议,如PCI/PCIE、SATA、SCSI、USB、ISA、SMBUS、LPCBUS等。通常是一个模块实现一种总线协议,并通过UEFI规范中的Protocol机制“发布”这些总线的接口,这样其他模块就可以使用这些接口来访问总线;网络协议栈模块实现网络协议栈,如TCP/IP、SNP、DHCP、TFTP等,这样其他模块可以基于这些协议栈来实现网络相关的功能。
固件应用层实现固件的各项功能,如配置界面、系统监控、文件系统、操作系统引导等;其包括设备扫描模块、人机界面显示模块、系统监控模块、系统启动模块、文件系统模块、内核加载模块、运行时模块和Shell模块,设备扫描模块枚举系统中的所有外部设备,如PCI/PCIE总线上的设备,为这些设备分配资源,并将设备与相应的外设驱动模块进行Connect(也即交给该设备驱动进行管理);人机界面显示模块位于显卡驱动模块之上,实现所有显示相关的接口,如设置显示模式、在特定位置打印字符串、显示图片、清屏等;系统监控模块实时检测处理器温度、系统电压和风扇转速,根据温度值来调整风扇的转速;允许用户设定温度阈值,当温度过高时,进行自动关机;系统启动模块提供一个图形化的用户配置界面,用户通过菜单操作的方式,查看系统信息和对系统进行配置。最后根据用户的选择,从存储设备启动操作系统;文件系统模块实现FAT/FAT32、EXT2/3/4和ISO9660文件系统,支持对文件的读取操作;内核加载模块在系统启动的最后阶段,这个模块从硬盘、U盘、光盘等存储介质中将内核文件加载到内存中,并为内核文件准备必要的参数,然后跳转到内核的入口点执行,这样就将控制权交给了操作系统;运行时模块实现了UEFI规范定义的供操作系统在其运行阶段调用的运行时(Runtime)接口,以及龙芯处理器平台的操作系统与固件定义的一些接口,如系统重启、关机等;Shell模块Shell是UEFI固件提供的一个命令行环境,基于UEFI固件中提供的大量接口服务,可以开发出Shell下的多种固件应用程序。
本发明的基于龙芯便携机的UEFI固件的具体运行步骤如下:
(1)初始化处理器、内存,建立起固件运行的基本环境;
(2)将UEFI固件代码复制到内存,并对固件进行解压,加载固件核心模块;
(3)建立UEFI固件的基础服务;
(4)加载UEFI固件功能模块,包括基础架构功能模块、设备协议模块;
(5)扫描设备并为设备分配系统资源,加载设备驱动模块,完成设备初始化;
(6)加载电源管理模块,并根据启动模式来执行相应的启动路径:
a)如果当前启动模式是从S3待机状态唤醒,则跳转到操作系统进入S3状态前的运行地址,结束启动过程;
b)如果当前启动模式是正常启动模式(包括热启动、冷启动),或从S5休眠状态唤醒,则继续后续的步骤;
(7)加载执行固件应用模块;
(8)运行配置界面;
(9)从存储设备加载操作系统。
上述步骤中,步骤(1)中执行处理器驱动模块。处理器驱动模块采用MIPS汇编语言实现,是系统上电后首先执行的模块,此时内存还未完成初始化,所以这个模块直接在FLASH芯片中运行。处理器驱动模块实现龙芯3A处理器、Cache(高速缓存)、内存、TLB(旁路转换缓冲)等初始化,实现MCU(内存控制器)、SMBUS和内存的初始化,配置内存地址窗口,并提供访问CPU、Cache、内存等部件的接口。处理器驱动模块还要初始化处理器中的串口模块,为后续的固件代码的提供调试手段。
上述步骤中,步骤(2)中执行固件核心加载模块。步骤(1)执行完成后,系统内存已经初始化好,此时固件代码可以在内存中运行以加快运行速度;而且可以用C语言来实现固件代码,加快开发速度。固件中包含的功能模块较多,而FLASH芯片的容量有限,一般需要将存放功能模块的固件卷进行压缩,固件核心加载模块负责从FLASH中将压缩的固件卷复制到内存中,并进行解压;解压成功后,在内存中创建HOB(Hand-Off Block)数据表,存放处理器、内存、FLASH等系统信息,提供给后续的固件模块使用;最后,固件核心加载模块将控制权交给固件核心模块。
上述步骤中,步骤(3)中执行固件核心模块。固件核心模块首先初始化UEFI的系统服务,为后续的功能模块的加载、运行做准备。主要是完成UEFI系统表、UEFI启动服务表和UEFI运行时服务表的初始化,具体服务包括代码调试、内存管理、UEFI镜像管理、HOB、UEFI时钟、FLASH访问、解压缩、固件卷解析、UEFI事件、任务优先级、UEFI Protocol管理、UEFI变量存取等。系统服务表存放在内存的特定区域,UEFI固件中的所有功能模块都可以调用这些系统服务。
上述步骤中,步骤(4)中固件核心模块加载固件的功能模块。固件核心模块通过检索固件卷,依次查找其中的功能模块,并将其加载到内存中。每个功能模块都被编译成一个PE/ELF格式的可执行镜像,固件核心模块需要解析功能模块镜像,然后加载到内存的特定地址处,并跳转到入口函数。功能模块的入口函数执行完成后,通常会返回到固件核心模块,固件核心模块继续进行下一个功能模块的加载。
在步骤(4)中被加载的模块包括基础架构功能模块、设备协议模块。其中,基础架构功能模块主要功能是实现UEFI规范中的Architectural Protocol,主要包括:BootDevice Selection(BDS)、CPU、Metronome、Monotonic Counter、Real Time Clock、Runtime、Security、Status Code、Timer、Variable、Variable Write、Watchdog Timer,每个Architectural Protocol由一个模块来实现;设备协议层模块主要实现访问PCI/PCIE、SATA、SCSI、USB、ISA、SMBUS、LPCBUS等总线的函数接口,并封装在Protocol中供其他功能模块调用,通常是一个模块实现一种总线协议。另外,还包括实现TCP/IP网络协议栈的功能模块;
上述步骤中,步骤(5)中完成设备的初始工作。固件核心模块加载设备驱动模块,实现主板上外设的初始化和实现访问外设的函数接口,包括南北桥芯片、显卡、SATA控制器、USB控制器、SMBUS控制器、LPC控制器、键盘、网卡等。通常由一个模块实现一种设备驱动。另外,在这个阶段由设备扫描模块扫描系统中的所有外设,并为外设分配内存、IO和中断资源,这样外设在操作系统下才能正常工作。
上述步骤中,步骤(6)中固件核心模块加载电源管理模块,并以当前的启动模式来决定后续的启动路径。电源管理模块中实现了一些供操作系统调用的函数接口,操作系统在进入S3待机状态之前调用这些接口来设置设备的电源状态、内存工作模式等。另外,电源管理模块还读取(由操作系统在进入S3待机或S5休眠状态之前存入非易失存储器中的)启动模式值,如果发现当前启动模式是从S3状态唤醒,固件将非易失存储器中读取操作系统进入S3状态前的运行地址,并跳转到该地址,将控制权交给操作系统,从而结束启动过程;如果当前启动模式是正常启动模式(包括热启动、冷启动),或是从S5休眠状态唤醒,则固件继续后续的步骤。
上述步骤中,步骤(7)中固件核心模块固件卷中的固件应用模块,并实现对应的固件功能。包括显示模块、系统监控模块、文件系统模块、内核加载模块、运行时模块、Shell模块、系统启动模块。最后,固件核心模块将控制权交给系统启动模块,准备启动操作系统。
上述步骤中,步骤(8)中系统启动模块通过调用固件核心模块和其他功能模块提供的服务接口,显示出图形配置界面作为人机交互界面。在这个阶段,固件根据用户的操作来进行下一步的工作,包括提供系统信息的显示和系统参数的配置,以及选择要启动的设备,包括硬盘、光盘、U盘、网络、命令行等。用户通过特定按键退出配置界面进入到下一个执行步骤。
上述步骤中,步骤(9)中实现操作系统的启动。根据用户配置的启动顺序,系统启动模块依次尝试从硬盘、光盘、U盘、网络等介质将操作系统内核文件加载到内存,并为内核准备必要的启动参数,然后将控制权交给内核,从而完成系统的启动工作。操作系统启动完成后,仍然可调用固件中运行时模块提供的少量的函数,包括系统重启、关机等。
有益效果:
1、本发明的方法符合国际主流的UEFI和PI固件规范,可利用UEFI联盟提供的开源代码资源快速实现固件;很多外设板卡厂商都提供基于UEFI规范的驱动,也可大大加快固件开发的进度。另外,UEFI固件支持主要的计算机工业标准,如目前龙芯处理器还不支持的ACPI(高级配置和电源管理接口)规范,这样采用本发明设计的固件可以方便地增加对这些规范的支持。
2、本发明设计的UEFI固件的重要特点是高度模块化,固件所要实现的功能被分解成很多子功能,每个子功能由单独的模块来实现,并由一个核心模块来加载和管理这些功能模块。因此可以通过增删模块来方便地定制固件的功能。
具体实施方式
下面结合附图并举实施例,对本发明进行详细描述。
如附图1表示,下面以中科梦兰公司设计的一款型号为逸珑8133笔记本为例,来介绍本发明描述的UEFI固件的具体实施方式。主要包括以下步骤:
(1)实现STU阶段的功能模块,包括两个模块,这个两个模块在编译以后将依次被放到FLASH芯片的开始位置,并在系统上电后依次被执行。包括:
(1.1)创建一个Start模块,即处理器驱动模块。根据龙芯3A处理器手册实现处理器、Cache(高速缓存)、内存、地址窗口、TLB(旁路转换缓冲)等初始化,实现MCU(内存控制器)、SMBUS和内存的初始化,并提供访问CPU、Cache、内存等部件的接口;
(1.2)创建一个Sec模块。这个模块的实现的功能包括在内存创建一些存放处理器、内存信息的数据结构,将FLASH芯片中的功能模块解压到内存中,最后加载执行固件核心模块DxeCore。
(2)实现固件核心模块DxeCore。要实现的功能主要包括:实现UEFI规范中定义的启动服务和运行时服务表,加载、运行其他功能模块,管理各模块之间的交互,实现内存的管理,实现和维护时钟中断和事件机制,实现和维护固件应用的特权级机制,实现UEFI规范中定义的Protocol的管理机制,实现基础函数库,以及调试接口、压缩算法、变量存储/处理等。
(3)实现Architectural Protocol,包括Variable,Variable Write,Timer,CPU,Metronome,Monotonic Counter,Status Code,Watchdog Timer,RTC,BDS。一个模块实现一种Architectural Protocol。
(4)实现外设驱动模块。包括:
(4.1)实现芯片组的驱动模块。根据芯片组手册实现对AMD RS780北桥芯片、AMDSB710南桥芯片的初始化,以及南桥芯片中PCI总线、USB、SATA/IDE、LPC/SMBUS总线、HDAudio控制器的初始化。
(4.2)实现外设驱动模块,包括显卡驱动、USB存储设备驱动、PS2键盘驱动、USB键盘驱动、SATA设备驱动、IDE设备驱动、网卡驱动、时钟中断驱动。
(4.3)实现外设枚举模块,枚举PCI/PCIE总线上的设备,并为设备分配IO、内存和中断资源。
(4.4)实现电源管理模块。根据AMD RS780+SB710芯片组手册和外围芯片手册,实现外设电源状态设置接口,用于在S3待机时将外发配置成合适的电源状态。电源管理模块实现的这些接口需要放到内存中操作系统保留的区域,以保证可以被操作系统调用。电源管理模块还从CMOS中读取启动模式值,以决定固件后续的启动路径。
(5)实现总线驱动模块,包括PCI/PCIE、SATA、SCSI、USB、ISA、SMBUS、LPCBUS,一个模块实现一种总线协议。
(6)实现固件应用层模块。主要包括:
(6.1)实现图形界面模块。可实现一个图形化的配置界面或命令行环境,支持用户查看处理器型号和频率、内存容量和频率、系统时间、启动顺序、外设列表等,并允许用户对系统时间、启动顺序进行配置。
(6.2)实现文件系统模块,支持对FAT/FAT32、EXT2/3/4和ISO9660文件系统的读操作。
(6.3)实现内核引导模块,在内存中创建数据结构以存放操作系统需要的运行参数,并根据用户的配置,从硬盘、U盘、光盘或网络加载操作系统内核文件到内存中,最后将控制权交给操作系统内核。
(6.4)实现系统启动模块,其功能包括:加载配置界面,实现操作系统的加载。
(6.5)实现Shell模块,用户可以通过在配置界面中设置启动顺序来启动到Shell命令行环境,Shell提供多个命令实现系统信息的查看、设备参数配置、访问存储介质中的文件、设备管理和测试、操作系统启动等。
在上述步骤中,对于与具体硬件平台相关的模块,如龙芯3A处理器、AMD RS780+SB710芯片组,一般需要根据硬件的用户手册或参考厂家的开源代码来进行开发;对于与硬件平台无关的通用模块,如DxeCore模块、Architectural Protocol模块、总线协议、网络协议栈、SATA/IDE设备驱动、USB存储设备驱动、键盘驱动、文件系统、BDS模块等,可以采用EDKII中提供的模块和代码;对于固件的功能模块,如配置界面、操作系统加载等,需要根据具体需求进行开发;对于显卡驱动,由于显卡上的OPROM(Option ROM,显卡厂家提供的驱动)是X86指令集的,在MIPS指令集的龙芯处理器上无法执行,所以在固件中采用一个开源的X86模拟器模块来解释执行显卡的OPROM,实现对显卡的初始化。
综上所述,以上仅为本发明的较佳实施例而已,并非用于限定本发明的保护范围。凡在本发明的精神和原则之内,所作的任何修改、等同替换、改进等,均应包含在本发明的保护范围之内。