楊 浩 王正元 孟慶民 張艷彬
1.南京郵電大學(xué)電子科學(xué)與工程學(xué)院,江蘇 南京 210003
2.南京郵電大學(xué)通信與信息工程學(xué)院,江蘇 南京 210003
Little Kernel分析與移植
楊 浩1王正元1孟慶民2張艷彬2
1.南京郵電大學(xué)電子科學(xué)與工程學(xué)院,江蘇 南京 210003
2.南京郵電大學(xué)通信與信息工程學(xué)院,江蘇 南京 210003
Little Kernel(lk)是被Android系統(tǒng)接受進(jìn)入源碼樹的Bootloader程序,并被多款智能手機(jī)和平板電腦所采用。論文介紹了lk的主要功能,分析了lk的源碼結(jié)構(gòu),并在此基礎(chǔ)上詳細(xì)說明了lk移植的方法和過程。將移植后的lk進(jìn)行編譯并下載至TCC8801 DEMO板上,lk能夠正常啟動(dòng)并引導(dǎo)linux內(nèi)核。
Little Kernel;嵌入式系統(tǒng);移植;TCC8801
little kernel; embedded system; porting; tCC8801
近年來,ARM Cortex-A8高性能處理器被廣泛應(yīng)用于智能手機(jī)、平板電腦等設(shè)備。而這些嵌入式系統(tǒng)啟動(dòng)時(shí)需要bootloader程序,所謂bootloader是在操作系統(tǒng)內(nèi)核運(yùn)行前執(zhí)行的一小段程序。這段程序負(fù)責(zé)完成對(duì)硬件設(shè)備的基本初始化,創(chuàng)建某些必要信息通過相關(guān)機(jī)制傳遞給內(nèi)核,引導(dǎo)和加載內(nèi)核,并最終調(diào)用操作系統(tǒng)內(nèi)核[1-
2]。
目前,常見的bootloader有[3]:Redboot、U-Boot、Blob、vivi等。其中以U-Boot應(yīng)用最為廣泛,支持的操作系統(tǒng)和處理器芯片最多。Little Kernel 是最近幾年才推出的一種Bootloader,并被Android系統(tǒng)所接受進(jìn)入Android源碼樹,大量應(yīng)用于智能手機(jī)與平板電腦。Little Lernel除了支持高通、TI、三星、Telechips等公司的芯片組,目前還具備如下功能[4]:
a、支持多種NAND Flash啟動(dòng);
b、提供USB驅(qū)動(dòng),支持開發(fā)過程中通過USB升級(jí)image文件;
c、提供鍵盤驅(qū)動(dòng),支持開發(fā)人員進(jìn)入fastboot模式升級(jí)image文件;
d、提供顯示驅(qū)動(dòng)用于調(diào)試和點(diǎn)亮顯示屏;
e、支持多線程。
Little Kernel不僅代碼量小、運(yùn)行耗時(shí)少,更為重要的特點(diǎn)是代碼可維護(hù)性好。在Little Kernel架構(gòu)中將處理器芯片歸為平臺(tái),對(duì)于使用同一芯片的不同目標(biāo)板則對(duì)于不同的目標(biāo)[4]。
為了進(jìn)行移植,必須仔細(xì)分析Little Kernel(下面簡(jiǎn)稱lk)的源碼目錄結(jié)構(gòu),據(jù)此理解lk的系統(tǒng)架構(gòu),只有這樣移植工作才會(huì)有的放矢、事半功倍。
lk的目錄結(jié)構(gòu)如表1所示。
表1
從表1可以看出,lk的架構(gòu)清晰、功能簡(jiǎn)捷。
lk啟動(dòng)流程如下[5]:
Step1:從lk鏈接文件lkarcharm system-onesegment.ld可知,入口點(diǎn)在_ start。而_start在匯編語言文件crt0.S中,從_start跳轉(zhuǎn)到reset,開始進(jìn)行CPU早期初始化、建立堆棧等常規(guī)的初始化任務(wù),然后跳到kmain()函數(shù)執(zhí)行。
Step2:進(jìn)入kmain()函數(shù)后,首先執(zhí)行thread_init_early()函數(shù)。Lk支持多線程,因此需要該函數(shù)進(jìn)行相關(guān)初始化,例如,初始化線程隊(duì)列,初始化線程列表,創(chuàng)建運(yùn)行線程等。
Step3:執(zhí)行arch_early_init()函數(shù)。主要初始化MMU(內(nèi)存管理單元)、ARM NEON通用SIMD(單指令多數(shù)據(jù))引擎。
Step4:執(zhí)行platform_early_init()函數(shù)。如前所述,lk將每種具體型號(hào)的ARM處理器歸為一個(gè)平臺(tái)。platform_early_ init()函數(shù)對(duì)具體型號(hào)的處理器進(jìn)行初始化,包括設(shè)置時(shí)鐘、設(shè)置中斷向量、初始化定時(shí)器/串口/I2C總線控制器等。
Step5:執(zhí)行target_early_init()、call_constructor()、heap_init()、thread_ init()、dpc_init()、timer_init()函數(shù),而target_early_init()沒有具體實(shí)現(xiàn)。
Step6:執(zhí)行thread_resume(thread_ create(“bootstrap2”,&bootstr ap2, NULL,DEFAULT_PRIORITY,DEFAULT_STACK_SIZE)),即進(jìn)入引導(dǎo)第二階段,對(duì)架構(gòu)、平臺(tái)、目標(biāo)板進(jìn)行具體初始化,并裝載、引導(dǎo)內(nèi)核程序。
從lk的源碼目錄和架構(gòu)組織思想可知,lk將不同體系架構(gòu)處理器相關(guān)的文件放在lkarch目錄下,目前主要支持ARM處理器,以后會(huì)逐步增加更多的處理器。而對(duì)于同一體系架構(gòu)處理器,不同廠家或者不同系列處理器又歸屬在不同的平臺(tái)之下,將某類處理器共用的代碼放在lkplatform目錄下。而對(duì)于采用特定處理器設(shè)計(jì)的目標(biāo)板,其相關(guān)代碼則放在lk arget下。同時(shí)在lkproject目錄下為相應(yīng)目標(biāo)板編寫頂層規(guī)則文件用于編譯lk。
基于上述思想及對(duì)lk啟動(dòng)流程的分析,為某個(gè)目標(biāo)板(簡(jiǎn)稱board_xxx)進(jìn)行Little Kernel移植時(shí)可以遵循以下步驟:
a、在lk源碼目錄中l(wèi)k arget下新建子目錄board_xxx,在父其目錄下找到與board_xxx采用相同處理器電路板(簡(jiǎn)稱board_orig)的代碼,將board_orig的所有文件拷貝至目錄lk argetoard_xxx之下,以board_orig的代碼為基礎(chǔ)進(jìn)行修改。
b、在lkproject目錄下為board_xxx建立頂層規(guī)則文件board_xxx.mk,向該文件添加目標(biāo)板的名稱、調(diào)試開關(guān)設(shè)置。
c、修改lk argetoard_xxx目錄下的文件,這些文件包括編譯規(guī)則文件rules.mk,頭文件ddr.h,C文件atags.c、gpio.c、init_clock.c、init_memory.c、init.c。
規(guī)則文件rules.mk中必須指明:采用的平臺(tái)、內(nèi)存基地址、內(nèi)存大小、目標(biāo)板硬件版本號(hào)、SDRAM控制器的類型、處理器型號(hào)、SDRAM芯片型號(hào)、顯示器型號(hào)、標(biāo)簽列表的地址、內(nèi)核的地址、RAMDISK的地址等。移植時(shí)只要修改目標(biāo)板硬件版本號(hào),其他基本不用修改。
頭文件ddr.h定義一些參數(shù)用于配置SDRAM,主要包括:物理SDRAM片數(shù)、邏輯SDRAM片數(shù)、最大速度、頁面大小、突發(fā)長(zhǎng)度等等相關(guān)參數(shù)。倘若目標(biāo)板上采用的SDRAM在頭文件ddr.h沒有定義,則在頭文件增加該款SDRAM的參數(shù)定義,否則不用修改ddr.h。
文件atags.c用于操作標(biāo)簽列表,而標(biāo)簽列表用于向內(nèi)核傳遞引導(dǎo)參數(shù)。移植時(shí)重點(diǎn)修改文件中的內(nèi)存信息、目標(biāo)板的版本號(hào)。
文件gpio.c用于對(duì)目標(biāo)板上處理器的通用輸入/輸出端口進(jìn)行配置。lk啟動(dòng)階段需要配置的端口不多,而大量的端口配置留待內(nèi)核啟動(dòng)以后再進(jìn)行配置。lk需要配置的端口主要包括串行口、I2C總線接口、按鍵接口和相關(guān)的控制接口。
文件init_clock.c用于對(duì)處理器的時(shí)鐘進(jìn)行初始化,一般不需要修改。
文件init_memory.c中相關(guān)函數(shù)根據(jù)規(guī)則文件rules.mk中指明SDRAM芯片型號(hào),查找頭文件ddr.h中定義的參數(shù),根據(jù)這些參數(shù)對(duì)處理器的SDRAM控制器進(jìn)行初始化、配置參數(shù),保證處理器能夠正確讀寫SDRAM。
文件init.c中的主要函數(shù)是target_ init(),該函數(shù)用于對(duì)目標(biāo)板初始化,包括對(duì)鍵盤初始化、修改NAND Flash中的信息等。
lk移植后需要進(jìn)行編譯并下載到目標(biāo)板上測(cè)試,驗(yàn)證移植后的lk能否正確引導(dǎo)linux內(nèi)核。本文的移植工作在基于TCC8801處理器的目標(biāo)板上進(jìn)行,TCC8801是Telechips公司生產(chǎn)的一款A(yù)RM Cortex-A8處理器,目標(biāo)板采用7英寸顯示屏,型號(hào)為AT070TN93,內(nèi)存采用DDR3,型號(hào)MT41J128M8JP-15E。編譯服務(wù)器采用浪潮塔式服務(wù)器NP3060,操作系統(tǒng)采用Ubuntu11.04-Server-64bit。編譯lk及測(cè)試過程如下所述:
Step1:搭建編譯環(huán)境
a、安裝必須的底層包,例如flex、bison、curl等工具軟件。
b、安裝Java環(huán)境JDK,要求安裝Jdk1.6版本,并設(shè)置環(huán)境變量。
c、安裝工具repo和git。
d、利用repo工具下載android2.3-gingerbread源碼。
e、 將開發(fā)板board_xxx相關(guān)代碼與android2.3-gingerbread源碼整合。
Step2:編譯lk
a、初始化編譯環(huán)境,使用命令source build/envsetup.sh。
b、進(jìn)入lk目錄,將移植過的lk文件拷貝至lk目錄下相應(yīng)子目錄。
c、從鍵盤輸入編譯命令make board_ xxx編譯lk并生成lk.rom文件。
d、進(jìn)入linux目錄,編譯linux內(nèi)核,并生成zImage文件。
Step3:下載
a、準(zhǔn)備PC端燒錄環(huán)境。Telechips公司提供相應(yīng)的燒寫程序FWDN及驅(qū)動(dòng)vtcdrv,在PC機(jī)上安裝驅(qū)動(dòng)程序vtcdrv,并驗(yàn)證PC與開發(fā)板可連接。
b、撥動(dòng)TCC8801DEMO 板上的啟動(dòng)方式設(shè)置開關(guān),使TCC8801處于USB啟動(dòng)方式。
c、打開FWDN軟件,將lk.rom及zImage寫入相應(yīng)NAND Flash分區(qū)。
Step4:測(cè)試
a、撥動(dòng)TCC8801DEMO 板上的啟動(dòng)方式設(shè)置開關(guān),使TCC8801處于NAND Flash啟動(dòng)方式。
b、加電啟動(dòng)DEMO板,觀察LCD能否正常點(diǎn)亮并顯示logo圖標(biāo)。
DEMO板加電后,lk引導(dǎo) kernel過程中向串口輸出的信息如下:
以上信息反映出lk.rom能夠引導(dǎo)內(nèi)核,且LCD正確顯示logo圖標(biāo),說明按照本文移植方法生成的lk.rom是可用的。
Little Kernel是一種小型的bootloader程序,代碼量小,便于移植與維護(hù),啟動(dòng)速度快,多用于手機(jī)和平板電腦。本文通過對(duì)Little Kernel的源碼分析,給出具體的移植過程。測(cè)試結(jié)果表明移植過程和方法是正確的,能夠正確引導(dǎo)Linux內(nèi)核。
[1]劉剛,趙建川.Linux系統(tǒng)移植[M].清華大學(xué)出版社, 2011.
[2]楊紅濤等.嵌入式Linux系統(tǒng)實(shí)用開發(fā)[M].電子工業(yè)出版社, 2010.
[3][EB/OL] http://baike.baidu.com/ view/1223454.htm.
[4][EB/OL] https://www.codeaurora. org/2010/03/02/little-kernel-based-android-Bootloader.
[5][EB/OL] http://blog.csdn.net/hankhanti/article/ details/6133570.
Analysis and Porting of Little Kernel
Yang Hao1, Wang Zhenyuan1, Meng Qingming2, Zhang Yanbin2
1.ElectroniSc ciencea nd EngineerinNg,a njingU niversityo f Po ts and TelecommunicatJioiannsg, suN anjingC, hina;
2.Communication and Information Engineering, Nanojfi nPgo sUtn ainvder Tseitlye communications, Jiangsu Nanjing, China
The Little Kernel(lk)i s a Bootloadepr rogra m acceptedi nto the sourcet ree of Androids ystem. It is adoptebd y a variety of smart phoneas nd tablet PCs. In the paper, lk’s main functio ns are describeda, nd the structure of its sourc e codes is analyzed. The methoda nd process of portingo f lk are also describeAd.f ter compilinlkg and downloadtinog TCC8801 DEMO target board, the linux kernel can be started up correctly.
TP311.54
A
10.3969/j.issn.1001-8972.2012.22.035
江蘇省高校自然科學(xué)研究項(xiàng)目(09KJB510015)
楊浩(1969-),男,講師,博士,主要研究方向?yàn)閳D像處理、嵌入式系統(tǒng)設(shè)計(jì)。