《龍芯CPU開(kāi)發(fā)系統(tǒng)固件與內(nèi)核接口規(guī)范》于2014年6月正式作為企業(yè)規(guī)范發(fā)布了,龍芯在產(chǎn)業(yè)化進(jìn)程中又邁出標(biāo)志性的一步。這個(gè)規(guī)范能保證龍芯2號(hào)個(gè)人電腦系列和3號(hào)服務(wù)器系列產(chǎn)品在今后系統(tǒng)升級(jí)過(guò)程中的兼容性,大大提高了龍芯各類硬件產(chǎn)品的可維護(hù)性,同時(shí)間接減少因兼容性帶來(lái)的個(gè)各種負(fù)面影響和維護(hù)開(kāi)發(fā)成本。據(jù)悉此規(guī)范自2010年底就開(kāi)始醞釀,由龍芯中科、昆侖固件、中科夢(mèng)蘭、中標(biāo)麒麟等多家單位經(jīng)過(guò)3年多的不斷論證并在實(shí)踐中反復(fù)驗(yàn)證可行的一個(gè)工程規(guī)范。此規(guī)范及相關(guān)信息可從龍芯的wiki首頁(yè)http://www.loongnix.org/dev/wiki/的“標(biāo)準(zhǔn)與規(guī)范”部分獲得。以下內(nèi)容的部分圖表和文字摘自該規(guī)范,不再另行說(shuō)明。
此規(guī)范產(chǎn)生的背景是多方面的,原有龍芯上使用的PMON(龍芯產(chǎn)品上使用的一種開(kāi)源的固件/BIOS)和操作系統(tǒng)內(nèi)核(Kernel)之間耦合性較強(qiáng),且沒(méi)有規(guī)范的接口,這造成不同板卡之間的內(nèi)核不能互通,同一板卡之間不同版本的PMON和內(nèi)核需要嚴(yán)格對(duì)應(yīng),否則可能會(huì)導(dǎo)致更新了內(nèi)核和PMON后系統(tǒng)無(wú)法啟動(dòng);2010年后,商用的昆侖固件開(kāi)始支持龍芯,昆侖固件是遵循UEFI規(guī)范的,這也產(chǎn)生了新的問(wèn)題,如何保證同一個(gè)內(nèi)核可以同時(shí)支持昆侖固件和PMON的板卡而無(wú)需特殊設(shè)置?如何保證板卡上的固件可同時(shí)支持嵌入式系統(tǒng)如Vxworks內(nèi)核和Linux內(nèi)核而無(wú)需定制固件;而操作系統(tǒng)廠商需要一套系統(tǒng)可在不同龍芯機(jī)器上安裝運(yùn)行,而不是每種機(jī)器都需要制作一個(gè)安裝系統(tǒng),應(yīng)用軟件廠商和用戶需要可單獨(dú)升級(jí)固件和內(nèi)核,而不是必須同時(shí)升級(jí)。隨著龍芯芯片和板卡種類不斷增多,這種矛盾表現(xiàn)的日益突出,亟需要一個(gè)統(tǒng)一的規(guī)范來(lái)定義固件和內(nèi)核之間的接口。同時(shí)我們看到國(guó)際上針對(duì)固件設(shè)計(jì)也有不同規(guī)范或標(biāo)準(zhǔn),比如由Intel倡導(dǎo)的UEFI規(guī)范,由IBM的PowerPC上使用的FDT標(biāo)準(zhǔn)等,所以這套規(guī)范并不是一個(gè)如何設(shè)計(jì)固件的規(guī)范,而是側(cè)重于固件和內(nèi)核之間的接口,只要符合這個(gè)接口,無(wú)論你的固件采用何種設(shè)計(jì)方式,遵循何種規(guī)范都可保證能夠啟動(dòng)系統(tǒng)。其和固件及操作系統(tǒng)間的層次關(guān)系如圖1所示:

圖1:接口規(guī)范與內(nèi)核及固件的層次關(guān)系圖
這個(gè)接口規(guī)范規(guī)定了龍芯CPU開(kāi)發(fā)系統(tǒng)的地址空間、中斷配置、固件與內(nèi)核接口傳參實(shí)現(xiàn)及SMBIOS實(shí)現(xiàn)約定的要求。本規(guī)范適用于龍芯2號(hào)和3號(hào)系列CPU開(kāi)發(fā)系統(tǒng),龍芯和龍夢(mèng)等廠商對(duì)外提供的開(kāi)發(fā)板會(huì)默認(rèn)支持此規(guī)范,同時(shí)這個(gè)規(guī)范也在多個(gè)使用龍芯的項(xiàng)目作為工程規(guī)范被采用。作為規(guī)范的參與者之一,我嘗試解釋下規(guī)范中需要注意的問(wèn)題。
對(duì)于系統(tǒng)來(lái)說(shuō),首先是地址空間的劃分,規(guī)范中對(duì)地址空間劃分如圖2所示:

圖2 地址空間分布圖
上圖中的兩點(diǎn)這里需要解釋下,一個(gè)是0x0F00_0000~0x0FFF_FFFF,規(guī)范約定0x0000_0000~0x0FFF_FFFF的低256MB空間為內(nèi)存空間,其中0x0F00_0000~0x0FFF_FFFF為固件保留的16M地址空間,操作系統(tǒng)內(nèi)核不得使用。另一個(gè)是高端內(nèi)存基址,這個(gè)基址是可以根據(jù)需要調(diào)整的,可在固件中通過(guò)結(jié)構(gòu)emap傳遞給內(nèi)核,目前默認(rèn)建議設(shè)置有兩種一種是0x9000_0000,另一種是0x11000_0000,建議設(shè)置為0x11000_0000,這個(gè)地址確定后,其向下的0x1000_0000作為保留區(qū),也就是括號(hào)中的(0x80000_0000)的含義。
規(guī)范的第二部分是關(guān)于中斷配置的規(guī)則。對(duì)于一個(gè)計(jì)算機(jī)系統(tǒng)來(lái)說(shuō),中斷的處理至關(guān)重要,龍芯芯片系統(tǒng)的中斷控制較為復(fù)雜,龍芯芯片內(nèi)部集成了中斷控制器用于處理自帶串口、PCI總線等中斷,又可以通過(guò)PCI、HT接口所連接橋片上的中斷控制器來(lái)處理外接設(shè)備中斷。這里對(duì)固件與內(nèi)核在中斷部分做了分工,中斷配置規(guī)范的目的是劃清固件和操作系統(tǒng)關(guān)于中斷的配置范圍,統(tǒng)一龍芯芯片操作系統(tǒng)的中斷分配。為此,規(guī)范進(jìn)行如下約定:
a) 橋片的中斷路由由固件來(lái)做,其他的中斷分配和路由由內(nèi)核來(lái)做;
b) 固件負(fù)責(zé)完成橋片上的PCI/PCIE設(shè)備和插槽的中斷號(hào)申請(qǐng)和路由,操作系統(tǒng)內(nèi)核完成中斷號(hào)的分配和芯片內(nèi)部的中斷路由,好處是固件只和具體的板卡相關(guān),內(nèi)核負(fù)責(zé)CPU相關(guān)的初始化(包括CPU核間中斷),這樣一個(gè)內(nèi)核可以適配不同板卡的固件;
c) 固件完成PCI設(shè)備掃描和配置后,根據(jù)橋片手冊(cè)、設(shè)備類型及硬件原理圖,向每一個(gè)PCI設(shè)備或PCI/PCIE插槽上可能的設(shè)備的中斷線寄存器寫(xiě)入申請(qǐng)的中斷線號(hào),同時(shí)需要對(duì)橋片上的中斷控制器進(jìn)行配置,保證它能路由到HT的0-16位中斷向量的相應(yīng)位置;
d) 操作系統(tǒng)內(nèi)核在分配中斷號(hào)時(shí),根據(jù)中斷線寄存器的值進(jìn)行分配。此外,操作系統(tǒng)內(nèi)核還負(fù)責(zé)對(duì)芯片內(nèi)部的中斷控制器進(jìn)行設(shè)置;
e) 內(nèi)核不再管CPU,板卡相關(guān)中斷的具體配置,所有信息均由固件傳遞過(guò)來(lái),并通過(guò)cpu_type的類型選擇不同的平臺(tái)支持,這樣可以做到一個(gè)內(nèi)核二進(jìn)制在不同平臺(tái)和CPU上都適用;
f) 如果使用MSI/MSI-X,由內(nèi)核根據(jù)橋片的特性來(lái)分配中斷,固件不再負(fù)責(zé)。
需要注意的還有0-15號(hào)中斷說(shuō)明,這個(gè)是約定俗成的。
表1 0-15號(hào)中斷說(shuō)明

15號(hào)以后的中斷號(hào)及芯片內(nèi)部中斷路由針對(duì)不同開(kāi)發(fā)系統(tǒng)有不同約定,3A/B+780E開(kāi)發(fā)系統(tǒng)可3A/B+2H開(kāi)發(fā)系統(tǒng)可參見(jiàn)規(guī)范中各自的附錄。
規(guī)定了地址空間和中斷后,如何在固件和內(nèi)核間傳遞這些信息呢?龍芯這個(gè)規(guī)范制訂了一套數(shù)據(jù)結(jié)構(gòu)用于固件和內(nèi)核間傳遞信息,通過(guò)這個(gè)結(jié)構(gòu)固件向內(nèi)核提供CPU類型、中斷號(hào)、總線信息、內(nèi)存大小、pci-mem地址、video_bios地址、busclock等信息,規(guī)范中提供了一個(gè)頭文件方便大家在具體編程中使用。下表是相關(guān)的數(shù)據(jù)結(jié)構(gòu)概覽。
表2 傳參結(jié)構(gòu)一覽表

各板卡可根據(jù)需要選擇必須實(shí)現(xiàn)的結(jié)構(gòu)體,但如果選用,需按照本章約定的結(jié)構(gòu)體進(jìn)行傳參,不能自行重新設(shè)計(jì)結(jié)構(gòu)體,為保證可擴(kuò)展性,如需要擴(kuò)充規(guī)范沒(méi)有的結(jié)構(gòu)體,可加在結(jié)構(gòu)體boot_params的最后添加。
另外一部分就是龍芯機(jī)器現(xiàn)在支持SMBIOS規(guī)范,SMBIOS是主板或系統(tǒng)制造者以標(biāo)準(zhǔn)格式顯示產(chǎn)品管理信息所需遵循的統(tǒng)一規(guī)范。DMI(Desktop Management Interfacece, DMI)就是幫助收集電腦系統(tǒng)信息的管理系統(tǒng),DMI信息的收集必須在嚴(yán)格遵照SMBIOS規(guī)范的前提下進(jìn)行。SMBIOS和DMI是由行業(yè)指導(dǎo)機(jī)構(gòu)Desktop Management Task Force(DMTF)起草的開(kāi)放性的技術(shù)標(biāo)準(zhǔn),其中,DMI設(shè)計(jì)適用于任何的平臺(tái)和操作系統(tǒng)。DMI充當(dāng)了管理工具和系統(tǒng)層之間接口的角色。它建立了標(biāo)準(zhǔn)的可管理系統(tǒng)更加方便了電腦廠商和用戶對(duì)系統(tǒng)的了解。DMI的主要組成部分是Management Information Format(MIF)數(shù)據(jù)庫(kù)。這個(gè)數(shù)據(jù)庫(kù)包括了所有有關(guān)電腦系統(tǒng)和配件的信息。通過(guò)DMI,用戶可以獲取序列號(hào)、電腦廠商、串口信息以及其它系統(tǒng)配件信息。但目前由于各家固件在實(shí)現(xiàn)上的不同,目前規(guī)范里給出了必須實(shí)現(xiàn)的幾個(gè)類別,比如CPU信息、內(nèi)存信息等。在龍芯的Linux系統(tǒng)下輸入dmidecode命令就可看到相關(guān)的硬件信息。
目前此規(guī)范已在或正在龍芯各類芯片板卡及已經(jīng)開(kāi)始使用,隨著實(shí)踐的深入,難免規(guī)范中有些部分考慮不周,需要修改和進(jìn)一步擴(kuò)充,后續(xù)的技術(shù)問(wèn)題會(huì)在每周三下午的例會(huì)上探討,會(huì)議采取網(wǎng)絡(luò)IRC會(huì)議方式,IRC channel是#loongson,會(huì)議時(shí)間:每周三下午15:00-17:00,感興趣的可參加這個(gè)討論。
最后回顧一下規(guī)范制訂中的重要事件:
• 2010年12月:?jiǎn)?dòng)
• 2011年3月:龍芯和昆侖固件開(kāi)始聯(lián)合預(yù)演
• 2011年5月10日:基于PMON實(shí)現(xiàn)的第一個(gè)版本
• 2011年5月20日:龍芯、昆侖固件、龍夢(mèng)、中標(biāo)麒麟組成聯(lián)合工作組,共同推進(jìn)規(guī)范的實(shí)現(xiàn)
• 2011年6月16日:規(guī)范結(jié)構(gòu)體定稿
• 2011年7月16日:完成在3A上的交叉驗(yàn)證實(shí)驗(yàn)
• 2011年8月31日:完成規(guī)范的定稿
• 2011年9月30日:PMON和昆侖固件完全按照標(biāo)準(zhǔn)實(shí)現(xiàn)開(kāi)始在龍芯3A780E主板上預(yù)裝
• 2012年3月:成為長(zhǎng)期項(xiàng)目,進(jìn)行后期的規(guī)范發(fā)布及方向的探討
• 2014年4月15日:正式成為龍芯企業(yè)規(guī)范
查詢進(jìn)一步信息,請(qǐng)?jiān)L問(wèn)官方網(wǎng)站http://www.loongson.cn/news_info.php?id=267。