<meter id="pryje"><nav id="pryje"><delect id="pryje"></delect></nav></meter>
          <label id="pryje"></label>

          新聞中心

          EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計應(yīng)用 > uclinux啟動過程詳細(xì)分析

          uclinux啟動過程詳細(xì)分析

          作者: 時間:2018-08-31 來源:網(wǎng)絡(luò) 收藏

          本文引用地址:http://www.ex-cimer.com/article/201808/388126.htm

          2) 為加載Boot Loader的Stage2準(zhǔn)備RAM空間

          3) 復(fù)制Boot Loader的Stage2到RAM空間中

          4) 設(shè)置好堆棧

          5) 跳轉(zhuǎn)到Stage2的C入口點(diǎn)

          Boot Loader的Stage2通常包括如下步驟:

          1) 始化本階段要使用的硬件設(shè)備

          2) 檢測系統(tǒng)內(nèi)存映射(Memory Map)

          3) 將Kernel映象和根文件系統(tǒng)映象從FLASH上讀取到RAM空間中

          4) 為內(nèi)核設(shè)置啟動參數(shù)

          5) 調(diào)用內(nèi)核

          2.2 系統(tǒng)內(nèi)存組織

          由于嵌入式設(shè)備具有很好的制定性,因此通常硬件環(huán)境會變的千差萬別。就算是用戶使用了相同的處理器芯片,但是也很有可能因?yàn)橥鈬O(shè)備電路設(shè)計的不同,而存在差異。對于BootLoader程序來說,存儲設(shè)備的與處理器的連接方式,與其息息相關(guān)。對于我們采用的S3C44B0微處理器來說,在系統(tǒng)加電之后,指令指針是指向0x00000000的,也就是說系統(tǒng)是從0x00000000開始之行。正是因?yàn)檫@個原因,通常這個地址空間我們會安排給FLASH存儲器。這樣我們可以將BootLoader啟動代碼以及我們之后將會要啟動的操作系統(tǒng)映像燒寫到Flash里。對于RAM地址空間,S3C44B0芯片將其設(shè)定為從0x0C000000到0x0FFFFFFF一共64MB的范圍里。我們可以通過設(shè)定存儲器控制寄存器來重新設(shè)定RAM的大小。例如我們試驗(yàn)采用的存儲設(shè)備安排如下:

          0x00000000 – 0x003FFFFF 4MB Flash

          0x0C000000 – 0x0C7FFFFF 8MB RAM

          通常來說對于系統(tǒng)的引導(dǎo)和操作系統(tǒng)的啟動,可以完全都在Flash中進(jìn)行,但是Flash存儲器的速度相對于RAM來說會慢很多,因此出于速度上的考慮,我們通常會將啟動代碼和操作系統(tǒng)的內(nèi)核映像文件拷貝到RAM中之行。

          下面我將對典型的BootLoader程序框架進(jìn)行分析。

          2.3 Stage1階段

          該階段的主要工作是完成對系統(tǒng)中斷向量的設(shè)置,初始化微處理器內(nèi)部寄存器,初始化堆棧,初始化RAM地址空間,并且將Stage2部分的C代碼拷貝到RAM空間的指定地點(diǎn),然后跳轉(zhuǎn)到C代碼入口點(diǎn)繼續(xù)執(zhí)行。對于這段代碼來說,做的都是一些準(zhǔn)備工作,因此為了提高效率,這段代碼通常都是使用匯編語言來完成的。下面我將結(jié)合具體的代碼來分析一下Stage1的啟動過程。

          1)設(shè)置中斷向量

          設(shè)置S3C44B0處理器定義的8種系統(tǒng)中斷的中斷向量地址。這八種系統(tǒng)中斷分別是復(fù)位中斷、未定義指令中斷、軟件中斷、指令預(yù)取異常中斷、數(shù)據(jù)異常中斷、地址異常中斷、IRQ中斷和FIQ中斷。這8個中斷通常是通過無條件跳轉(zhuǎn)的方式來實(shí)現(xiàn)的。具體的代碼如下。

          __entry :

          b ResetHandler /* Reset vector */

          b HandlerUndef /* Undefined instruction */

          b HandlerSWI /* SWI */

          b HandlerPabort /* Prefetch abort */

          b HandlerDabort /* Data abort */

          b 。 /* Address exception */

          b HandlerIRQ /* IRQ */

          b HandlerFIQ /* FIQ */

          2)初始化微處理器內(nèi)部寄存器

          這段代碼主要是要完成硬件部分的初始化,包括關(guān)閉中斷響應(yīng)、初始化微處理器通用端口、設(shè)置CPU頻率等操作。不過需要注意的是,在進(jìn)行硬件初始化之前需要將微處理器的運(yùn)行狀態(tài)轉(zhuǎn)換到SVC模式下。

          MRS a1,CPSR /*; Pickup current CPSR*/

          BIC a1,a1,#MODE_MASK /*; Clear the mode bits*/

          ORR a1,a1,#SUP_MODE /*; Set the supervisor mode bits*/

          ORR a1,a1,#LOCKOUT /*; Insure IRQ and FIQ intr are locked out*/

          MSR CPSR_cxsf,a1 /*; Setup the new CPSR*/

          3)初始化系統(tǒng)RAM空間

          這個部分的工作主要是為之后啟動代碼和內(nèi)核映像的拷貝操作做準(zhǔn)備,并且也為之后的C代碼的執(zhí)行初始化堆棧。這部分的工作主要可以分成兩個部分來處理。首先,根據(jù)系統(tǒng)配置的存儲器特性來初始化相關(guān)的存儲器控制寄存器。在我們使用的S3C44B0處理器中,存儲空間被分成了BANK0-BANK7一共8個塊,分別由BANKCON0-BANKCON7控制各個塊存儲器的讀寫時鐘和片選時鐘等信號參數(shù)。具體代碼如下:

          ldr r0,=rBANKCON0

          ldr r1,=0x700

          str r1,[r0]

          ldr r0,=rBANKCON1

          ldr r1,=0x700 /* 0x7ffc */

          str r1,[r0]

          ldr r0,=rBANKCON2

          ldr r1,=0x700 /* 0x7ffc */

          str r1,[r0]

          ldr r0,=rBANKCON3

          ldr r1,=0x7568

          str r1,[r0]

          ldr r0,=rBANKCON4

          ldr r1,=0x700 /* 0x7ffc */

          str r1,[r0]

          ldr r0,=rBANKCON5

          ldr r1,=0x700 /* 0x7ffc */

          str r1,[r0]

          ldr r0,=rBANKCON6

          ldr r1,=0x18008

          str r1,[r0]

          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]

          ldr r0,=rMRSRB6

          ldr r1,=0x020

          str r1,[r0]

          ldr r0,=rMRSRB7

          ldr r1,=0x020

          str r1,[r0]

          初始化RAM空間的第二個部分就是初始化連接腳本文件中指定的需要清0的地址空間,將該斷地址空間的內(nèi)容清0。該部分地址空間主要是用來存放C語言代碼中的全局變量等內(nèi)容的。實(shí)現(xiàn)代碼如下:

          LDR a1,=Image_ZI_Base /* Pickup the start of the BSS area */

          MOV a3,#0 /* Clear value in a3 */

          LDR a2,=Image_ZI_Limit /* Pickup the end of the BSS area */

          CMP a1,a2

          BEQ move_data

          clear_loop :

          STR a3,[a1],#4 /* Clear a word, a1 += 4 */

          CMP a1,a2 /* end of ZI ? */

          BNE clear_loop

          4)為Stage2的C語言代碼的執(zhí)行準(zhǔn)備必要的堆棧

          因?yàn)樵赟tage2階段一般都是采用C語言代碼來完成的,因此必須在使用C語言代碼之前先建立起必要的堆棧信息。通常為了避免堆棧數(shù)據(jù)被執(zhí)行代碼破壞,通常都是放在RAM的高端地址,并且使得堆棧指針的增長方向是向下增長的。

          5)將初始化代碼拷貝到RAM中,并且跳轉(zhuǎn)到RAM中執(zhí)行。因?yàn)樵谖覀儾捎玫腟3C44B0微處理器里對于FLASH和RAM地址空間是使用的統(tǒng)一編址的,因此我們可以直接使用一個簡單循環(huán)來完成拷貝。



          關(guān)鍵詞: uClinux cpu 控制器

          評論


          相關(guān)推薦

          技術(shù)專區(qū)

          關(guān)閉
          看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();