基于S3C44B0芯片的uClinux內(nèi)核引導(dǎo)過程分析
前 言
本文引用地址:http://2s4d.com/article/171586.htm隨著計(jì)算機(jī)硬件技術(shù)的不斷發(fā)展,功能強(qiáng)大、資源豐富的嵌入式芯片,成為研究人員開發(fā)專業(yè)應(yīng)用領(lǐng)域產(chǎn)品的首選。三星公司生產(chǎn)的S3C44B0芯片,采用ARM7TDM I內(nèi)核,具有功耗小、成本低的特點(diǎn),是一款專門針對(duì)移動(dòng)終端及PDA手持設(shè)備市場(chǎng)的產(chǎn)品。近幾年,源碼開放的L inux系統(tǒng)迅速發(fā)展,很快成為跨平臺(tái)操作系統(tǒng)中的佼佼者,并且出現(xiàn)了專門針對(duì)嵌入式系統(tǒng)的產(chǎn)品———uClinux。在S3C44B0芯片上移植 uClinux操作系統(tǒng),能夠充分發(fā)揮該芯片系統(tǒng)資源豐富(相對(duì)單片機(jī)而言)的特點(diǎn),開發(fā)出功能強(qiáng)大的應(yīng)用產(chǎn)品。
嵌入式系統(tǒng)的啟動(dòng)引導(dǎo)程序與硬件嚴(yán)格相關(guān),對(duì)編寫人員的要求較高,而在移植uClinux后又大大增加了引導(dǎo)程序的復(fù)雜程度,因此這部分代碼往往是各個(gè)嵌入式產(chǎn)品開發(fā)廠商嚴(yán)格保密的部分。下面將以一款市場(chǎng)上成熟的基于S3C44B0芯片的嵌入式開發(fā)板為藍(lán)本,對(duì)引導(dǎo)uClinux內(nèi)核的過程進(jìn)行分析。
嵌入式系統(tǒng)中uClinux內(nèi)核的系統(tǒng)引導(dǎo)過程通常可以分為3個(gè)階段,即boot階段、系統(tǒng)初始化階段和uClinux內(nèi)核引導(dǎo)階段。通常情況下boot階段和系統(tǒng)初始化階段的工作由一段被稱為bootloader的代碼完成,而內(nèi)核引導(dǎo)則是由事先編譯好了的uClinux可執(zhí)行鏡像來實(shí)現(xiàn)。
系統(tǒng)內(nèi)存組織
由于嵌入式系統(tǒng)的硬件環(huán)境千差萬別,即使選用同一種型號(hào)的嵌入式芯片,其外圍設(shè)備也大不相同,特別是存儲(chǔ)設(shè)備的組織,將直接關(guān)系到引導(dǎo)程序的實(shí)現(xiàn)。對(duì)于 S3C44B0芯片,其生產(chǎn)廠家規(guī)定在系統(tǒng)加電自舉后,從0x00000000處開始執(zhí)行(其他芯片如ARM9系列可以通過地址映射改變?cè)摰刂罚?,故此處通常安排的是Flash 地址空間,用于保存bootloader啟動(dòng)代碼以及uClinux映象。對(duì)于S3C44B0 芯片, RAM 地址被固定在0x0c000000到0x0fffffff的64兆,開發(fā)人員可以根據(jù)自己的需要再組織RAM,如本開發(fā)板存儲(chǔ)器地址安排如下:
此外,考慮到Flash運(yùn)行速度的問題,通常采取的做法是將系統(tǒng)初始化階段的代碼和uClinux內(nèi)核鏡像拷貝到RAM中執(zhí)行。下面將分3個(gè)階段分析系統(tǒng)引導(dǎo)過程。
boot階段
boot階段的主要工作是設(shè)置系統(tǒng)中斷向量、完成對(duì)CPU內(nèi)部寄存器的初始化、系統(tǒng)RAM初始化、為運(yùn)行C程序組織堆棧、拷貝初始化階段代碼到RAM、跳轉(zhuǎn)到C程序入口。該階段代碼直接在Flash中運(yùn)行,為提高執(zhí)行效率采用匯編語言編寫。
(1) 設(shè)置中斷向量。設(shè)置S3C44B0芯片的8種系統(tǒng)中斷的中斷向量地址(包括復(fù)位中斷、未定義指令中斷、軟件中斷、指令預(yù)取異常中斷、數(shù)據(jù)異常中斷、地址異常中斷、IRQ 中斷和F IQ 中斷) ,該地址空間從系統(tǒng)RAM的起始地址開始安排。通常情況下,在Flash的起始部分,存放的就是針對(duì)各中斷向量地址的無條件跳轉(zhuǎn)指令。
__entry :
B ResetHandler
/* for reset vector */
LDR PC, = 0x0c00000c
/* 0x0c00000: 未定義指令中斷向量地址*/
……
/* 中間省略類似跳轉(zhuǎn)*/
LDR PC, = 0x0c000024
/* 0x0c000024: F IQ中斷向量地址*/
(2) CPU內(nèi)部寄存器初始化。通過配置CPU運(yùn)行于SVC模式(采用改變CPSC寄存器中CPU運(yùn)行模式位的方式來實(shí)現(xiàn)) ,并設(shè)置相關(guān)寄存器,以實(shí)現(xiàn)對(duì)基本硬件的初始化工作,包括關(guān)閉中斷、初始化CPU通用端口和設(shè)置CPU頻率等。進(jìn)入SVC模式匯編代碼如下:
MRS a1, CPSR /* 保存當(dāng)前狀態(tài)寄存器值*/
BICa1, a1, #MODE_MASK /* 清除運(yùn)行模式位*/
ORR a1, a1, #SUP_MODE/* 設(shè)置為超級(jí)用戶模式*/
ORR a1, a1, #LOCKOUT /* 關(guān)閉F IQ和IRQ */
MSR CPSR_cxsf, a1 /* 保存到當(dāng)前狀態(tài)寄存器*/
(3) 系統(tǒng)RAM初始化。初始化系統(tǒng)RAM的主要目的是為下面使用RAM空間的操作做好準(zhǔn)備工作,如進(jìn)行代碼拷貝及堆棧初始化等。這部分工作可以分為兩個(gè)步驟。首先,根據(jù)系統(tǒng)配置的存儲(chǔ)器特性,初始化相關(guān)存儲(chǔ)塊控制寄存器的值, 在S3C44B0 中存儲(chǔ)空間被分為BANK0到BANK7共8個(gè)塊,分別由BANKCON0到BANKCON7控制各塊存儲(chǔ)器的讀寫時(shí)鐘數(shù)和片選時(shí)鐘數(shù)等信號(hào)參數(shù),對(duì)于采取不同存儲(chǔ)芯片的嵌入式系統(tǒng),可以通過查閱芯片手冊(cè)來獲取該信息,并寫入相關(guān)寄存器。
LDR r0, = rBANKCON0
LDR r1, = 0x700
STR r1, [ r0 ]
/* 中間省略BANK1到BANK6*/
LDR r0, = rBANKCON7
LDR r1, = 0x18000
STR r1, [ r0 ]
LDR r0, = rREFRESH
LDR r1, = 0xac03e1
STR r1, [ r0 ]
LDR r0, = rBANKSIZE
LDR r1, = 0x16
STR r1, [ r0 ]
評(píng)論