亚洲av成人无遮挡网站在线观看,少妇性bbb搡bbb爽爽爽,亚洲av日韩精品久久久久久,兔费看少妇性l交大片免费,无码少妇一区二区三区

  免費(fèi)注冊 查看新帖 |

Chinaunix

  平臺 論壇 博客 文庫
最近訪問板塊 發(fā)新帖
查看: 1164 | 回復(fù): 0
打印 上一主題 下一主題

bootloader [復(fù)制鏈接]

論壇徽章:
0
跳轉(zhuǎn)到指定樓層
1 [收藏(0)] [報告]
發(fā)表于 2009-12-16 16:26 |只看該作者 |倒序?yàn)g覽

                                1、bootloader的執(zhí)行過程
友善之臂給的一個簡單的bootloader的Makefile文件
all:    arm-linux-gcc -mabi=aapcs-linux -mno-thumb-interwork -Os -Wall -c head.S 244x_lib.c nand.c main.c    arm-linux-ld -T mem.lds -Bstatic head.o 244x_lib.o nand.o main.o     arm-linux-objcopy -O binary -S a.out vboot.bin -R .comment -R .stab -R .stabstr    rm *.o a.outclean:    rm vboot.bin
(1)、Makefile中做的第一個事情就是編譯所有的文件,
其中g(shù)cc的參數(shù)
-mabi=nameGenerate code for the specified ABI.  Permissible values are: `apcs-gnu',
`atpcs', `aapcs', `aapcs-linux' and `iwmmxt'.
     GNU官網(wǎng)上給出的選項(xiàng)-mabi=name的解釋:生成指定ABI(Application Binary Interface)的代碼可選的name值為后面的那幾個。
-mthumb-interworkGenerate code which supports calling between the ARM and Thumb
instruction sets.  Without this option the two instruction sets cannot
be reliably used inside one program.  The default is
-mno-thumb-interwork, since slightly larger code is generated
when -mthumb-interwork is specified.
     GNU官網(wǎng)上給出的選項(xiàng)-mthumb-interwork的解釋:生成支持在ARM和Thumb指令集間相互調(diào)用的代碼。
-OsOptimize for size.  -Os enables all -O2 optimizations that
do not typically increase code size.  It also performs further
optimizations designed to reduce code size.
     這是一個優(yōu)化選項(xiàng),針對產(chǎn)生的目標(biāo)文件的大小。
-Wall
這是一個warning選項(xiàng)。
-c
這個選項(xiàng)是只編譯生成目標(biāo)文件而不實(shí)際鏈接產(chǎn)生可執(zhí)行文件。
(2)、緊接著看連接這一步,它通過文件mem.lds來輸入?yún)?shù),對于.lds文件,它定義了整個程序編譯之后的連接過程,決定了一個可執(zhí)行程序的各個段的存儲位置。而mem.lds文件的內(nèi)容則是這樣的:
SECTIONS {   . = 000000;  .myhead ALIGN(0): {*(.text.FirstSector)}  .text ALIGN(512): { *(.text) }  .bss ALIGN(4)  : { *(.bss*)  *(COMMON) }  .data ALIGN(4) : { *(.data*) *(.rodata*) }}
    section 的格式如下
     section [address] [(type)] :
       [AT(lma)] [ALIGN(section_align)] [SUBALIGN(subsection_align)]
       {
         output-section-command
         output-section-command
         ...
       } [>region] [AT>lma_region] [:phdr :phdr ...] [=fillexp]secname和contents是必須的,其他的都是可選的。下面挑幾個常用的看看:
1、secname:段名
2、contents:決定哪些內(nèi)容放在本段,可以是整個目標(biāo)文件,也可以是目標(biāo)文件中的某段(代碼段、數(shù)據(jù)段等)
3、start:本段連接(運(yùn)行)的地址,如果沒有使用AT(ldadr),本段存儲的地址也是start。GNU網(wǎng)站上說start可以用任意一種描述地址的符號來描述。
4、AT(ldadr):定義本段存儲(加載)的地址。
看一個簡單的例子:(摘自《
2410完全開發(fā)
》)
/* nand.lds */
SECTIONS {
firtst 0x00000000 : { head.o init.o }
second 0x30000000 : AT(4096) { main.o }
}
    以上,head.o放在0x00000000地址開始處,init.o放在head.o后面,他們的運(yùn)行地址也是0x00000000,即連接和存儲地址相同(沒有AT指定);main.o放在4096(0x1000,是AT指定的,存儲地址)開始處,但是它的運(yùn)行地址在0x30000000,運(yùn)行之前需要從0x1000(加載處)復(fù)制到0x30000000(運(yùn)行處),此過程也就用到了讀取Nand flash。
這就是存儲地址和連接(運(yùn)行)地址的不同,稱為加載時域和運(yùn)行時域,可以在.lds連接腳本文件中分別指定。
編寫好的.lds文件,在用arm-linux-ld連接命令時帶-Tfilename來調(diào)用執(zhí)行,如
arm-linux-ld –Tnand.lds x.o y.o –o xy.o。也用-Ttext參數(shù)直接指定連接地址,如
arm-linux-ld –Ttext 0x30000000 x.o y.o –o xy.o。

既然程序有了兩種地址,就涉及到一些跳轉(zhuǎn)指令的區(qū)別,這里正好寫下來,以后萬一忘記了也可查看,以前不少東西沒記下來現(xiàn)在忘得差不多了。。。
ARM匯編中,常有兩種跳轉(zhuǎn)方法:b跳轉(zhuǎn)指令、ldr指令向PC賦值。
我自己經(jīng)過歸納如下:
(1)       b step1 :b跳轉(zhuǎn)指令是相對跳轉(zhuǎn),依賴當(dāng)前PC的值,偏移量是通過該指令本身的bit[23:0]算出來的,這使得使用b指令的程序不依賴于要跳到的代碼的位置,只看指令本身。
(2)       ldr pc, =step1 :該指令是從內(nèi)存中的某個位置(step1)讀出數(shù)據(jù)并賦給PC,同樣依賴當(dāng)前PC的值,但是偏移量是那個位置(step1)的連接地址(運(yùn)行時的地址),所以可以用它實(shí)現(xiàn)從Flash到RAM的程序跳轉(zhuǎn)。
(3)       此外,有必要回味一下adr偽指令,U-boot中那段relocate代碼就是通過adr實(shí)現(xiàn)當(dāng)前程序是在RAM中還是flash中。仍然用我當(dāng)時的注釋:
relocate: /* 把U-Boot重新定位到RAM */
    adr r0, _start /* r0是代碼的當(dāng)前位置 */
/* adr偽指令,匯編器自動通過當(dāng)前PC的值算出 如果執(zhí)行到_start時PC的值,放到r0中:
當(dāng)
此段在flash中執(zhí)行時r0 = _start = 0;當(dāng)此段在RAM中執(zhí)行時_start =
_TEXT_BASE(在board/smdk2410/config.mk中指定的值為0x33F80000,即u-boot在把代碼拷貝到RAM中去
執(zhí)行的代碼段的開始) */
    ldr r1, _TEXT_BASE /* 測試判斷是從Flash啟動,還是RAM */
/* 此句執(zhí)行的結(jié)果r1始終是0x33FF80000,因?yàn)榇酥凳怯志幾g器指定的(ads中設(shè)置,或-D設(shè)置編譯器參數(shù)) */
    cmp r0, r1 /* 比較r0和r1,調(diào)試的時候不要執(zhí)行重定位 */
然后看vboot的mem.lds文件,定義了四個段
第一個,0字節(jié)對齊,有所有目標(biāo)文件代碼段的第一個扇區(qū)組成。
第二個就是代碼段了,512字節(jié)對齊的,有所有的(*代表所有的文件)目標(biāo)文件的代碼段組成
之后就是未初始化的數(shù)據(jù)段,
接著是數(shù)據(jù)段。
之后的Bstatic指定與靜態(tài)鏈接庫連接。
(3)、接著再來看arn-linux-objcopy的作用。
objcopy用于將object的部分獲全部內(nèi)容拷貝到另一個object,從而可以實(shí)現(xiàn)格式的變換。objcopy可用用于將文件轉(zhuǎn)換成S-record格式或者raw二進(jìn)制格式。
例如,
         xxxx-elf-objcopy –O srec test.o test.s19
則將test.o轉(zhuǎn)換成s-record文件中。通常涉及到text段。
         xxxx-elf-objcopy –O binary test.o test.bin
則將test.o轉(zhuǎn)換成raw binary文件格式。
       當(dāng)將object文件轉(zhuǎn)換成raw binary格式時,通常將去除掉symbols和relocation信息。在生成s-record過程中,有時需要用選項(xiàng)“-S”,“-R”去除掉binary文件,s-record文件不需要的相應(yīng)信息。使用objcopy不能夠改變大、小endian。這樣看的話在此處objcopy的作用就很明顯了,就是生成一個可以直接燒寫的干凈的去掉了符號表重定位信息等等的可執(zhí)行文件
2、arm體系結(jié)構(gòu)
3、操作系統(tǒng)啟動部分的協(xié)議
               
               
               
               
               
               
               

本文來自ChinaUnix博客,如果查看原文請點(diǎn):http://blog.chinaunix.net/u2/87729/showart_2123056.html
您需要登錄后才可以回帖 登錄 | 注冊

本版積分規(guī)則 發(fā)表回復(fù)

  

北京盛拓優(yōu)訊信息技術(shù)有限公司. 版權(quán)所有 京ICP備16024965號-6 北京市公安局海淀分局網(wǎng)監(jiān)中心備案編號:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年舉報專區(qū)
中國互聯(lián)網(wǎng)協(xié)會會員  聯(lián)系我們:huangweiwei@itpub.net
感謝所有關(guān)心和支持過ChinaUnix的朋友們 轉(zhuǎn)載本站內(nèi)容請注明原作者名及出處

清除 Cookies - ChinaUnix - Archiver - WAP - TOP