一区二区三区日韩精品-日韩经典一区二区三区-五月激情综合丁香婷婷-欧美精品中文字幕专区

分享

s3c2410 u-boot

 dwlinux_gs 2015-03-18
      轉(zhuǎn):http://blog.csdn.net/flickedball/archive/2009/11/25/4869044.aspx
S3C2410 U-BOOT之stage1 收藏

s3c2410 u-boot stage1

前言

         本文主要是基于大家比較熟悉的 s3c2410 ,對移植 u-boot stage1 過程進行一個分析,網(wǎng)上關(guān)于之方面的資料很多,但是幾乎都只是對代碼作注解,容易讓人產(chǎn)生知其一不知其二的感覺,在這里,我主要結(jié)合 u-boot stage1 時的內(nèi)存布局和 stage1 的具體指令來做個分析,這樣看起來比較直觀,更容易理解一些 .

一、 全局看 u-boot

我們要深入理解 u-boot 如何工作的,以及跟硬件都有什么依賴,我們需要先對 u-boot 及硬件有一個全局的認識。

在這之前,為了更多的人不會迷糊一些問題,先澄清幾個概念:

_start : 這是 u-boot 的第一條指令入口地址 , 如果從 flash 啟動,就是 0x0, 如果直接下載到 SDRAM 中執(zhí)行,則是 TEXT_BASE=0x33F80000.

_TEXT_BASE :本身是一個地址,但是地址處放的內(nèi)容是 TEXT_BASE,

s3c2410 中我們通常設(shè)為 0x33F80000, 通過 config.mk 中的 -Ttext $(TEXT_BASE) 來指定鏈接選項,從而更新鏈接腳本中的入口地址,不明白的去查查 linker and loader.

cpu/arm920t/start.S

_TEXT_BASE:

.word TEXT_BASE

    _armboot_start : 本身也是一個地址,但是地址處放的內(nèi)容是 _start ,如果 _start 0x33F80000, _artboot_start 放的內(nèi)容就是 0x33F80000 ,見 cpu/arm920t/start.S

  _armboot_start:

       .word _start

知道這三個地址之后,再看兩條指令:

adr r0,_start    /*r0 <- current position of code*/

這條指令網(wǎng)上講得也很多,翻譯過來就是 add r0,r0,[PC+#offset], 就是把通過一個地址來知道 _start 處的地址,注意是地址,即 TEXT_BASE=0x33F80000, 這步在鏈接的時候就已經(jīng)確定了,或者你不用管那么多,你知道鏈接完成之后,這條指令相當于 mov r0,0x33F80000(sdram) 或者 mov r0,0x0(flash) 就行了。

ldr r1,_TEXT_BASE    /* test if we run from flash or RAM */

注意,這里的 ldr 不是偽指令,偽指令表示時, ldr r1,=_TEXT_BASE

這兩個的區(qū)別在于,偽指令是直接把 _TEXT_BASE 寫入到 r1 中,這里 _TEXT_BASE 就代表一個地址,而 ldr r1,_TEXT_BASE, 是把 _TEXT_BASE 中存放的內(nèi)容,也就是 TEXT_BASE=0x33F80000 寫入到了 r1.

ldr    r2, _armboot_start

結(jié)合上面講的,應(yīng)該知道,這條語句實際上是將 _armboot_start 中的內(nèi)容,也就是 _start 的地址寫入到了 r2 中,而非網(wǎng)上很多人問的是 _armboot_start 的地址 .

ldr    r3, _bss_start

這跟上面一樣分析了,定義見 cpu/arm920t/start.S

.globl _bss_start

_bss_start:

  .word __bss_start

下面這兩條語句也就好理解了:

  sub       r2, r3, r2         /* r2 <- armboot 大小   */

  add r2, r0, r2          /* r2 <- 代碼結(jié)束地址   */

到底 armboot 的大小都包含了哪些東西,結(jié)合 u-boot.lds ,見下圖:

 

 

   

    關(guān)于鏈接腳本,講起來又很多了,不清楚的,建議看看 linker and loader ,清楚代碼的編譯鏈接及加載過程,是我們更深入的理解底層機制的根本。

 

在上面,我只是講了幾個平時可能遇到的,又不太理解的問題,關(guān)于 stage1 中代碼的注釋網(wǎng)上一搜就有一大把??戳俗⑨?,再結(jié)合,我講的這幾點,應(yīng)該能弄清 stage1 中是如何拷貝代碼的了。接下來,我們來看看為什么 TEXT_BASE 的值是 0x33F80000 呢?

二、 TEXT_BASE=0x33F80000 的由來?

先看一個 SDRAM 的內(nèi)存映射圖:同樣結(jié)合上面的 uboot.lds

0x33F80000

0x30000000

0x33ffffff

映射前

映射后

 


bss 段、 u-boot cmd 段、 .data .rodata

.text 段及中斷向量表

malloc 區(qū)域,見 start.S  sub r0,r0, #CFG_MALLOC_LEN

全局變量,見 start.S sub  r0, r0, #CFG_GBL_DATA_SIZE

IRQ:sub    r0, r0, #(CONFIG_STACKSIZE_IRQ+CONFIG_STACKSIZE_FIQ)

sub   sp, r0, #12                 /* leave 3 words for abort-stack    */

.

.

 

bss

u-boot cmd

.data 數(shù)據(jù)段

.rodata 只讀數(shù)據(jù)段,

入口 20 字節(jié)中斷向量表 .text(start.o *(.text))

  在 S3C2410 中,查看 datasheet , 64M SDRAM 地址空間即為 0x30000000 0x33ffffff ,在 bank6 中,而 flash 映射地址為 0x0 開始。

  TEXT_BASE=0x33F80000 即為程序加載起始地址,可以使用的空間大小即為 0x33F80000 0x33FFFFFF 512K ,如果你 u-boot 包含的功能太多,覺得不夠用,你可以把 0x33F80000 調(diào)小一點,即和往低地址移一些,移的過程中注意 memory page 對齊就行了,一般是 4KB.

    本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導購買等信息,謹防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊一鍵舉報。
    轉(zhuǎn)藏 分享 獻花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多

    日韩1区二区三区麻豆| 国产又粗又猛又爽色噜噜| 精品香蕉一区二区在线| 欧美自拍偷自拍亚洲精品| 日韩精品中文字幕在线视频| 九九热在线视频精品免费| 欧美一区二区口爆吞精| 不卡在线播放一区二区三区| 美女被后入视频在线观看| 性欧美唯美尤物另类视频| 一区二区三区人妻在线| 国产目拍亚洲精品区一区| 亚洲一区二区精品国产av| 精品人妻av区波多野结依| 日韩免费午夜福利视频| 国产日韩综合一区在线观看| 日本欧美视频在线观看免费| 欧美人妻一区二区三区| 激情爱爱一区二区三区| 五月天婷亚洲天婷综合网| 亚洲中文在线观看小视频| 午夜精品在线观看视频午夜| 国产视频福利一区二区| 国产在线一区二区免费| 狠狠做深爱婷婷久久综合| 在线九月婷婷丁香伊人| 国产传媒欧美日韩成人精品| 男女午夜在线免费观看视频| 国产精品久久久久久久久久久痴汉| 国产麻豆精品福利在线| 中文字幕熟女人妻视频| 偷自拍亚洲欧美一区二页| 亚洲欧洲一区二区中文字幕| 精品一区二区三区不卡少妇av| 大香蕉久草网一区二区三区| 午夜福利在线观看免费| 懂色一区二区三区四区| 亚洲熟女一区二区三四区| 日本在线高清精品人妻| 亚洲欧美日韩综合在线成成| 亚洲国产成人av毛片国产 |