发布时间:2014-06-26 已阅读:次
近日,“龙芯cpu开发系统固件与内核接口规范”正式作为企业规范发布了,龙芯在产业化进程中又迈出标志性的一步。这个规范能保证龙芯2号个人电脑系列和3号服务器系列产品在今后系统升级过程中的兼容性,大大提高了龙芯各类硬件产品的可维护性,同时间接减少因兼容性带来的个各种负面影响和维护开发成本。据悉此规范自2010年底就开始酝酿,由龙芯中科、昆仑固件、中科梦兰、中标麒麟等多家单位经过3年多的不断论证并在实践中反复验证可行的一个工程规范。此规范及相关信息可从龙芯的wiki3118云顶集团首页的“标准与规范”部分获得。以下内容的部分图表和文字摘自该规范,不再另行说明。
此规范产生的背景是多方面的,原有龙芯上使用的pmon(龙芯产品上使用的一种开源的固件/bios)和操作系统内核(kernel)之间耦合性较强,且没有规范的接口,这造成不同板卡之间的内核不能互通,同一板卡之间不同版本的pmon和内核需要严格对应,否则可能会导致更新了内核和pmon后系统无法启动;2010年后,商用的昆仑固件开始支持龙芯,昆仑固件是遵循uefi规范的,这也产生了新的问题,如何保证同一个内核可以同时支持昆仑固件和pmon的板卡而无需特殊设置?如何保证板卡上的固件可同时支持嵌入式系统如vxworks内核和linux内核而无需定制固件;而操作系统厂商需要一套系统可在不同龙芯机器上安装运行,而不是每种机器都需要制作一个安装系统,应用软件厂商和用户需要可单独升级固件和内核,而不是必须同时升级。随着龙芯芯片和板卡种类不断增多,这种矛盾表现的日益突出,亟需要一个统一的规范来定义固件和内核之间的接口。同时我们看到国际上针对固件设计也有不同规范或标准,比如由intel 倡导的uefi规范,由ibm的powerpc上使用的fdt标准等,所以这套规范并不是一个如何设计固件的规范,而是侧重于固件和内核之间的接口,只要符合这个接口,无论你的固件采用何种设计方式,遵循何种规范都可保证能够启动系统。其和固件及操作系统间的层次关系如下图所示:
图1:接口规范与内核及固件的层次关系图
这个接口规范规定了龙芯cpu开发系统的地址空间、中断配置、固件与内核接口传参实现及smbios实现约定的要求。本规范适用于龙芯2号和3号系列cpu开发系统,龙芯和龙梦等厂商对外提供的开发板会默认支持此规范,同时这个规范也在多个使用龙芯的项目作为工程规范被采用。作为规范的参与者之一,我尝试解释下规范中需要注意的问题。
对于系统来说,首先是地址空间的划分,规范中对地址空间划分如图2所示:
图2 地址空间分布图
上图中的两点这里需要解释下,一个是0x0f00_0000~0x0fff_ffff,规范约定0x0000_0000~0x0fff_ffff的低256mb空间为内存空间,其中0x0f00_0000~0x0fff_ffff为固件保留的16m地址空间,操作系统内核不得使用。另一个是高端内存基址,这个基址是可以根据需要调整的,可在固件中通过结构emap传递给内核,目前默认建议设置有两种一种是0x9000_0000,另一种是0x11000_0000,建议设置为0x11000_0000,这个地址确定后,其向下的0x1000_0000作为保留区,也就是括号中的(0x80000_0000)的含义。
规范的第二部分是关于中断配置的规则。对于一个计算机系统来说,中断的处理至关重要,龙芯芯片系统的中断控制较为复杂,龙芯芯片内部集成了中断控制器用于处理自带串口、pci总线等中断,又可以通过pci、ht接口所连接桥片上的中断控制器来处理外接设备中断。这里对固件与内核在中断部分做了分工,中断配置规范的目的是划清固件和操作系统关于中断的配置范围,统一龙芯芯片操作系统的中断分配。 为此,规范进行如下约定:
a) 桥片的中断路由由固件来做,其他的中断分配和路由由内核来做;
b) 固件负责完成桥片上的pci/pcie设备和插槽的中断号申请和路由,操作系统内核完成中断号的分配和芯片内部的中断路由,好处是固件只和具体的板卡相关,内核负责cpu相关的初始化(包括cpu核间中断),这样一个内核可以适配不同板卡的固件;
c) 固件完成pci设备扫描和配置后,根据桥片手册、设备类型及硬件原理图,向每一个pci设备或pci/pcie插槽上可能的设备的中断线寄存器写入申请的中断线号,同时需要对桥片上的中断控制器进行配置,保证它能路由到ht的0-16位中断向量的相应位置;
d) 操作系统内核在分配中断号时,根据中断线寄存器的值进行分配。此外,操作系统内核还负责对芯片内部的中断控制器进行设置;
e) 内核不再管cpu,板卡相关中断的具体配置,所有信息均由固件传递过来,并通过cpu_type的类型选择不同的平台支持,这样可以做到一个内核二进制在不同平台和cpu上都适用;
f) 如果使用msi/msi-x,由内核根据桥片的特性来分配中断,固件不再负责。
需要注意的还有0-15号中断说明,这个是约定俗成的。
表1 0-15号中断说明
15号以后的中断号及芯片内部中断路由针对不同开发系统有不同约定,3a/b 780e开发系统可3a/b 2h开发系统可参见规范中各自的附录。
规定了地址空间和中断后,如何在固件和内核间传递这些信息呢?龙芯这个规范制订了一套数据结构用于固件和内核间传递信息,通过这个结构固件向内核提供cpu类型、中断号、总线信息、内存大小、pci-mem地址、video_bios地址、busclock等信息,规范中提供了一个头文件方便大家在具体编程中使用。下表是相关的数据结构概览。
表2 传参结构一览表
各板卡可根据需要选择必须实现的结构体,但如果选用,需按照本章约定的结构体进行传参,不能自行重新设计结构体,为保证可扩展性,如需要扩充规范没有的结构体,可加在结构体boot_params的最后添加。
另外一部分就是龙芯机器现在支持smbios规范,smbios是主板或系统制造者以标准格式显示产品管理信息所需遵循的统一规范。 dmi (desktop management interfacece, dmi)就是帮助收集电脑系统信息的管理系统,dmi信息的收集必须在严格遵照smbios规范的前提下进行。 smbios和dmi是由行业指导机构desktop management task force (dmtf)起草的开放性的技术标准,其中,dmi设计适用于任何的平台和操作系统。 dmi充当了管理工具和系统层之间接口的角色。它建立了标准的可管理系统更加方便了电脑厂商和用户对系统的了解。dmi的主要组成部分是 management information format (mif)数据库。这个数据库包括了所有有关电脑系统和配件的信息。通过dmi,用户可以获取序列号、电脑厂商、串口信息以及其它系统配件信息。但目前由于各家固件在实现上的不同,目前规范里给出了必须实现的几个类别,比如cpu信息、内存信息等。在龙芯的linux系统下输入dmidecode命令就可看到相关的硬件信息。
目前此规范已在或正在龙芯各类芯片板卡及已经开始使用,随着实践的深入,难免规范中有些部分考虑不周,需要修改和进一步扩充,后续的技术问题会在每周三下午的例会上探讨,会议采取网络irc会议方式,irc channel是 #loongson,会议时间:每周三下午15:00-17:00 ,感兴趣的可参加这个讨论。
最后回顾一下规范制订中的重要事件:
• 2010年12月启动
• 2011年3月:龙芯和昆仑固件开始联合预演
• 2011年5月10日:基于pmon实现的第一个版本
• 2011年5月20日:龙芯、昆仑固件、龙梦、中标麒麟组成联合工作组,共同推进规范的实现
• 2011年6月16日:规范结构体定稿
• 2011年7月16日:完成在3a上的交叉验证实验
• 2011年8月31日:完成规范的定稿
• 2011年9月30日:pmon和昆仑固件完全按照标准实现开始在龙芯3a780e主板上预装
• 2012年3月:成为长期项目,进行后期的规范发布及方向的探讨
• 2014年4月15日:正式成为龙芯企业规范