发明内容
本发明的目的主要是为了解决上述现有技术的缺陷,提供一种基于飞腾服务器的UEFI固件的实现方法。根据这个方法,可以在飞腾服务器上实现出符合国际主流UEFI固件规范、可扩展性强、功能完善的固件产品,并且能完全替代OBP,以支持飞腾服务器的正常启动和运行。
一种基于飞腾服务器的UEFI固件的实现方法,固件划分为硬件抽象层、固件核心层、设备协议层和固件应用层。
其中,硬件抽象层实现处理器、内存、外设控制器等关键硬件部件的初始化,对其他板级硬件进行包装和抽象并实现初始化,同时为上层模块提供访问底层硬件设备的函数接口。其包括处理器驱动模块和外设驱动模块,处理器驱动模块完成处理器、内存的初始化工作,并提供访问处理器和内存的接口;外设驱动模块主要是主板上各种外设的驱动,如显卡、硬盘、键盘、USB设备、网卡等,每个外设会对应一个(或多个)驱动模块。对于基于FT1000A的硬件平台,外设驱动模块还要完成处理器中集成的外设控制器的初始化和资源分配工作。
固件核心层类似于操作系统的内核,建立UEFI中的系统服务表,进行固件中所有模块的统一管理和各种资源的管理。其包括固件核心加载模块、固件核心模块和基础架构功能模块,固件核心加载模块负责加载固件核心模块,并为其准备运行环境,固件核心模块负责建立UEFI规范中的启动服务(Boot Service)和运行时服务(Runtime Service)表,加载、运行其他功能模块,管理各模块之间的交互,实现内存的管理,实现和维护时钟中断和事件机制,实现和维护固件应用的特权级机制,实现UEFI规范中定义的Protocol的管理机制,实现UEFI规范要求实现的其他机制和功能,如调试接口、压缩算法、变量存储/处理等。基础架构功能模块实现UEFI规范中的Architectural Protocol,包括多个功能模块,每个模块实现一个Architectural Protocol。每个Architectural Protocol包含一些基础服务接口,供固件中的其他功能模块调用。
设备协议层实现各种标准的工业规范,包括总线协议、外设接口等。其包括总线协议模块,实现各种总线协议,如PCI/PCIE、SATA、PATA、SCSI、USB、ISA、SMBUS、LPCBUS等。通常是一个模块实现一种总线协议,并通过UEFI规范中的Protocol机制“发布”这些总线的接口,这样其他模块就可以使用这些接口来访问总线。
固件应用层实现固件的各项功能,如配置界面、系统监控、文件系统、操作系统引导等;其包括设备扫描模块、人机界面模块、系统监控模块、服务器管理支持模块、IEEE1275支持模块、系统启动模块、内核加载模块和Shell模块,设备扫描模块枚举系统中的所有外部设备,如PCI/PCIE总线上的设备,为这些设备分配资源,并将设备与相应的外设驱动模块进行Connect(也即交给该设备驱动进行管理);人机界面模块位于显卡驱动模块之上,实现所有显示相关的接口,如设置显示模式、在特定位置打印字符串、显示图片、清屏等;系统监控模块实时检测处理器温度、系统电压和风扇转速,根据温度值来调整风扇的转速,允许用户设定温度阈值,当温度过高时,进行自动关机;服务器管理支持模块主要实现对服务器中的BMC管理单元和KVM单元的支持;IEEE1275支持模块实现IEEE1275规范中定义的固件与操作系统的函数接口、数据结构,供操作系统在启动和运行阶段调用;系统启动模块提供一个图形化的用户配置界面,用户通过菜单操作的方式,查看系统信息和对系统进行配置。最后根据用户的选择,从存储设备启动操作系统;文件系统模块实现FAT/FAT32、EXT2/3/4和ISO9660文件系统,支持对文件的读取操作;内核加载模块在系统启动的最后阶段,这个模块从硬盘、U盘、光盘等存储介质中将内核文件(或内核加载器)加载到内存中,并为内核文件准备必要的参数,然后跳转到内核(或内核加载器)的入口点执行,这样就将控制权交给了操作系统;Shell模块Shell是UEFI固件提供的一个命令行环境,基于UEFI固件中提供的大量接口服务,可以开发出Shell下的多种固件应用程序。
本发明的基于飞腾服务器的UEFI固件的具体运行步骤如下:
(1)初始化处理器、内存,建立起固件运行的基本环境;
(2)将UEFI固件代码复制到内存,并对固件进行解压,加载固件核心模块;
(3)建立UEFI固件的基础服务;
(4)加载UEFI固件功能模块,包括基础架构功能模块、设备协议模块;
(5)扫描设备并为设备分配系统资源,加载设备驱动模块,完成设备初始化;
(6)加载执行固件应用模块;
(7)运行配置界面;
(8)从存储设备加载操作系统。
上述步骤中,步骤(1)中执行处理器驱动模块。在步骤(1)执行之前,系统中的虚拟机监控器Hypervisor已经实现了物理处理器和内存的初始化,此时处理器驱动模块只需要对虚拟的处理器、内存进行初始化,进行参数的配置,以及提供访问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,主要包括:Boot Device Selection(BDS)、CPU、Metronome、Monotonic Counter、RealTimeClock、Runtime、Security、Status Code、Timer、Variable、Variable Write、WatchdogTimer,每个Architectural Protocol由一个模块来实现;设备协议层模块主要实现访问PCI/PCIE、SATA、PATA、SCSI、USB、ISA、SMBUS、LPCBUS等总线的函数接口,并封装在Protocol中供其他功能模块调用,通常是一个模块实现一种总线协议。
上述步骤中,步骤(5)中完成设备的初始工作。固件核心模块加载设备驱动模块,实现主板上外设的初始化和实现访问外设的函数接口,包括南北桥芯片、显卡、SATA/IDE控制器、USB控制器、SMBUS控制器、LPC控制器、键盘、网卡等。通常由一个模块实现一种设备驱动。另外,在这个阶段由设备扫描模块扫描系统中的所有外设,并为外设分配内存、IO和中断资源,这样外设在操作系统下才能正常工作。
上述步骤中,步骤(6)中固件核心模块加载固件卷中的固件应用模块,并实现对应的固件功能。包括显示模块、系统监控模块、服务器管理支持模块、IEEE1275支持模块、文件系统模块、内核加载模块、Shell模块、系统启动模块。最后,固件核心模块将控制权交给系统启动模块,准备启动操作系统。
上述步骤中,步骤(7)中系统启动模块通过调用固件核心模块和其他功能模块提供的服务接口,显示出图形配置界面作为人机交互界面。在这个阶段,固件根据用户的操作来进行下一步的工作,包括提供系统信息的显示和系统参数的配置,以及选择要启动的设备,包括硬盘、光盘、U盘、命令行等。用户通过特定按键退出配置界面进入到下一个执行步骤。
上述步骤中,步骤(8)中实现操作系统的启动。根据用户配置的启动顺序,系统启动模块依次尝试从硬盘、光盘、U盘等介质将操作系统内核文件(或内核加载器)加载到内存,并为内核准备必要的启动参数,然后将控制权交给内核(或内核加载器),从而完成系统的启动工作。操作系统启动完成后,可调用固件中实现的IEEE1275接口和数据结构。
有益效果:
1、本发明的方法符合国际主流的UEFI和PI固件规范,可利用UEFI联盟提供的开源代码资源快速实现固件;很多外设板卡厂商都提供基于UEFI规范的驱动,也可大大加快固件开发的进度;固件层可以提供更多的设备驱动和丰富的固件功能。另外,UEFI固件支持主要的计算机工业标准,如目前飞腾处理器还不支持的ACPI(高级配置和电源管理接口)规范,这样采用本发明设计的固件可以方便地增加对这些规范的支持。
2、本发明设计的UEFI固件的重要特点是高度模块化,固件所要实现的功能被分解成很多子功能,每个子功能由单独的模块来实现,并由一个核心模块来加载和管理这些功能模块。因此可以通过增删模块来方便地定制固件的功能。
3、本发明设计的UEFI固件可以实现对主流外设的支持,解决飞腾处理器平台传统固件OBP在外设兼容支持方面的缺陷,对于推动飞腾处理器的产业化带来好处。
具体实施方式
下面结合附图并举实施例,对本发明进行详细描述。
如附图1表示,下面以扬州万方公司设计的一款型号为WANGFANG-FT1000A-SERVER-V1.4的服务器主板为例,来介绍本发明描述的UEFI固件的具体实施方式。主要包括以下步骤:
(1)实现STU阶段的功能模块,包括两个模块,这个两个模块在编译以后将依次被放到FLASH芯片的开始位置,并在系统上电后依次被执行。包括:
(1.1)创建一个Start模块,即处理器驱动模块。根据飞腾FT1000A处理器手册实现处理器、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北桥芯片、AMD SB710南桥芯片的初始化,以及南桥芯片中PCI总线、USB、SATA/IDE、LPC/SMBUS总线、HD Audio控制器的初始化。
(4.2)实现外设驱动模块,包括显卡驱动、USB存储设备驱动、PS2键盘驱动、USB键盘驱动、SATA设备驱动、IDE设备驱动、网卡驱动、时钟中断驱动。
(4.3)实现外设枚举模块,枚举PCI/PCIE总线上的设备,并为设备分配IO、内存和中断资源。
(5)实现总线驱动模块,包括PCI/PCIE、SATA、PATA、SCSI、USB、ISA、SMBUS、LPCBUS,一个模块实现一种总线协议。
(6)实现固件应用层模块。主要包括:
(6.1)实现图形界面模块。可实现一个图形化的配置界面或命令行环境,支持用户查看处理器型号和频率、内存容量和频率、系统时间、启动顺序、外设列表等,并允许用户对系统时间、启动顺序进行配置。
(6.2)实现IEEE1275支持模块,根据IEEE Std.1275-1994和IEEE Std.1275.1-1994规范,建立操作系统启动和运行所需要的设备树(Device Tree),实现客户程序接口(Client Interface)、设备接口(Device Interface)等。
(6.3)实现内核引导模块,在内存中创建数据结构以存放操作系统需要的运行参数,并根据用户的配置,从硬盘、U盘、光盘的固定扇区中读取操作系统内核加载器SILO(Sparc Improved boot LOader)到内存中,最后将控制权交给SILO,由SILO完成操作系统内核的加载。
(6.4)实现系统启动模块,其功能包括:加载配置界面,调用内核引导模块中的接口实现操作系统的加载。
(6.5)实现Shell模块,用户可以通过在配置界面中设置启动顺序来启动到Shell命令行环境,Shell提供多个命令实现系统信息的查看、设备参数配置、访问存储介质中的文件、设备管理和测试、操作系统启动等。
在上述步骤中,对于与具体硬件平台相关的模块,对于本例来说主要是FT1000A处理器,需要根据硬件的用户手册或参考厂家的开源代码来进行开发;对于与硬件平台无关的通用模块,如DxeCore模块、Architectural Protocol模块、总线协议、SATA/IDE设备驱动、USB存储设备驱动、键盘驱动、文件系统、BDS模块等,可以采用EDK II中提供的模块和代码;对于固件的功能模块,如配置界面、操作系统加载等,需要根据具体需求进行开发;对于显卡驱动,由于显卡上的OPROM(Option ROM,显卡厂家提供的驱动)是X86指令集的,在SPARC指令集的飞腾处理器上无法执行,所以在固件中采用一个开源的X86模拟器模块来解释执行显卡的OPROM,实现对显卡的初始化。
综上所述,以上仅为本发明的较佳实施例而已,并非用于限定本发明的保护范围。凡在本发明的精神和原则之内,所作的任何修改、等同替换、改进等,均应包含在本发明的保护范围之内。