亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

蟲蟲首頁| 資源下載| 資源專輯| 精品軟件
登錄| 注冊

您現(xiàn)在的位置是:首頁 > 技術(shù)閱讀 >  u-boot2020.04移植(5、u-boot重定位)

u-boot2020.04移植(5、u-boot重定位)

時(shí)間:2024-05-31

點(diǎn)擊下方閱讀原文可訪問文中超鏈接

如果想了解重定位是怎么一回事,可以參考這位老哥的博客:https://blog.csdn.net/skyflying2012/article/details/37660265

第一階段結(jié)束,便開始u-boot的重定位(這里有點(diǎn)小疑惑,在前面將u-boot從SD卡拷貝到DDR中時(shí),我就是拷貝到鏈接地址的,也就是說那個(gè)時(shí)候u-boot的運(yùn)行地址就和鏈接地址一致了,可以正常運(yùn)行完整個(gè)u-boot,這里又再次重定位,只不過是將u-boot搬到內(nèi)存的高地址去運(yùn)行,網(wǎng)上搜了一下,有說是因?yàn)榉乐箖?nèi)核解壓的時(shí)候覆蓋了u-boot本身,那也就是說只要解壓內(nèi)核不會(huì)覆蓋u-boot這部分內(nèi)存,理論上就不需要再次重定位了,等之后有時(shí)間我測試一下,去掉這部分重定位代碼,看u-boot是否還能正常運(yùn)行,以驗(yàn)證自己的想法),關(guān)于這部分新版u-boot和以前的不太一樣,個(gè)人感覺新版的設(shè)計(jì)更加簡單便于理解。

現(xiàn)在回到arch/arm/lib/crt0.S文件:

重定位前的準(zhǔn)備工作

/*arch/arm/lib/crt0.S*/

/*GD_START_ADDR_SP定義在include/generated/generic-asm-offsets.h文件(這個(gè)文件是u-boot自動(dòng)生成的,而且過程也是有點(diǎn)高端,
感興趣的可以網(wǎng)上了解一下,貼一個(gè)我看過的鏈接:http://blog.chinaunix.net/uid-25000873-id-4134037.html),
在這里表示在gd這個(gè)數(shù)據(jù)結(jié)構(gòu)中start_addr_sp的偏移值,前面我們也知道r9這個(gè)寄存器綁定的就是gd全局變量這個(gè)指針,
所以相當(dāng)于將gd->start_addr_sp里面的值加載到r0中*/

ldr r0, [r9, #GD_START_ADDR_SP] /* sp = gd->start_addr_sp */
bic r0, r0, #7 /* 8-byte alignment for ABI compliance */
/*設(shè)置棧指針*/
mov sp, r0
/*獲取gd->bd的位置*/
ldr r9, [r9, #GD_BD] /* r9 = gd->bd */
/*在內(nèi)存圖上可以看出,新的gd結(jié)構(gòu)在bd結(jié)構(gòu)的下面緊挨著,所以減去gd的大小就是新的gd起始地址*/
sub r9, r9, #GD_SIZE /* new GD is below bd */

/*這里將here標(biāo)號的地址值讀取到lr中,注意這里是adr,關(guān)于adr與ldr的區(qū)別可自行網(wǎng)上搜索*/
adr lr, here
/*將重定位偏移值加載到r0寄存器中*/
ldr r0, [r9, #GD_RELOC_OFF] /* r0 = gd->reloc_off */
/*鏈接寄存器加上偏移值后,lr的地址就變成重定位后的地址了*/
add lr, lr, r0
/*未定義*/
#if defined(CONFIG_CPU_V7M)
orr lr, #1 /* As required by Thumb-only */
#endif
/*將重定位地址加載到r0中,作為參數(shù)傳給relocate_code*/
ldr r0, [r9, #GD_RELOCADDR] /* r0 = gd->relocaddr */
/*執(zhí)行重定位*/
b relocate_code
/*從relocate_code回來后,就直接運(yùn)行在重定位后的u-boot中了,here標(biāo)號已經(jīng)是重定位后那個(gè)here標(biāo)號了*/
here:

/*
省略
*/

上面的步驟結(jié)束后,sp棧指針就設(shè)置成gd->start_addr_sp指向的地方了,而r9之前綁定的那個(gè)gd也變成重定位后的新地址的gd結(jié)構(gòu)了,內(nèi)存圖如下:

圖1

執(zhí)行重定位

/*arch/arm/lib/relocate.S*/

ENTRY(relocate_code)
/*從鏈接腳本可知,主要是將代碼段和數(shù)據(jù)段拷貝到新的地址*/
ldr r1, =__image_copy_start /* r1 <- SRC &__image_copy_start */
/*r0是重定位地址,r1是目前u-boot運(yùn)行地址,這里也有個(gè)疑問,要是u-boot運(yùn)行地址現(xiàn)在和鏈接地址不一樣,
它要拷貝的地方可能根本就是空的或者是錯(cuò)的,那這里不就有問題嗎?這個(gè)我之后得驗(yàn)證一下*/

subs r4, r0, r1 /* r4 <- relocation offset */
/*上一句subs指令會(huì)影響CPSR的狀態(tài),這里如果r4的值為0,表示r0和r1是一樣的,不需要再重定位*/
beq relocate_done /* skip relocation */
/*將拷貝結(jié)束地址放到r2中*/
ldr r2, =__image_copy_end /* r2 <- SRC &__image_copy_end */

copy_loop:
/*以r1為起始地址(也就是目前u-boot的起始地址),加載兩個(gè)字到r10,r11中*/
ldmia r1!, {r10-r11} /* copy from source address [r1] */
/*以r0為起始地址(也就是重定位的新地址),加載r10,r11的值到r0,r0+4中*/
stmia r0!, {r10-r11} /* copy to target address [r0] */
/*比較是否讀取到結(jié)束地址*/
cmp r1, r2 /* until source end address [r2] */
/*一直循環(huán),直到拷貝結(jié)束*/
blo copy_loop

/*
* fix .rel.dyn relocations
*/

/*下面這些才是重定位最重要的,上面雖然將u-boot拷貝到新地址了,但是我們要使用的變量,
和一些數(shù)據(jù)這些的地址(這里說地址可能有些不太準(zhǔn)確)還是沒變的,重定位后的u-boot應(yīng)該訪問的是新地址的變量和數(shù)據(jù)等,
下面這段代碼就是干這個(gè)事的,我們給新地址的u-boot每一個(gè)要訪問的變量地址等加上一個(gè)偏移,這樣就能正確訪問了*/

ldr r2, =__rel_dyn_start /* r2 <- SRC &__rel_dyn_start */
ldr r3, =__rel_dyn_end /* r3 <- SRC &__rel_dyn_end */
fixloop:
/*以r2為起始地址(也就是動(dòng)態(tài)符號表的起始地址),加載兩個(gè)字到r0,r1中*/
ldmia r2!, {r0-r1} /* (r0,r1) <- (SRC location,fixup) */
/*取出r1中數(shù)據(jù)的低8位*/
and r1, r1, #0xff
/*R_ARM_RELATIVE用來檢查這個(gè)符號是不是需要被重定位*/
cmp r1, #R_ARM_RELATIVE
/*不需要的話就跳過*/
bne fixnext

/* relative fix: increase location by offset */
/*r4是重定位偏移,這里就是要加上這個(gè)偏移*/
add r0, r0, r4
/*取出加上偏移后的以r0為地址內(nèi)的數(shù)據(jù)存到r1中,這里取出的也就是新的u-boot里面存放變量的那個(gè)地址*/
ldr r1, [r0]
/*給新的u-boot存放變量的那個(gè)地址加上偏移*/
add r1, r1, r4
/*將加了偏移后的值(變量的地址)寫回,這樣新的u-boot就能正確訪問了*/
str r1, [r0]
fixnext:
cmp r2, r3
blo fixloop

relocate_done:

/*未定義*/
#ifdef __XSCALE__
/*
* On xscale, icache must be invalidated and write buffers drained,
* even with cache disabled - 4.2.7 of xscale core developer's manual
*/

mcr p15, 0, r0, c7, c7, 0 /* invalidate icache */
mcr p15, 0, r0, c7, c10, 4 /* drain write buffer */
#endif

/* ARMv4- don't know bx lr but the assembler fails to see that */

#ifdef __ARM_ARCH_4__
mov pc, lr
#else
/*重定位結(jié)束*/
bx lr
#endif

ENDPROC(relocate_code)

接下來重定位向量表,這個(gè)很簡單,就是操作協(xié)處理器

/*arch/arm/lib/relocate.S*/

.section .text.relocate_vectors,"ax",%progbits
.weak relocate_vectors

ENTRY(relocate_vectors)

/*未定義*/
#ifdef CONFIG_CPU_V7M
/*
省略
*/

#else
/*定義了,前面也講過,這個(gè)就是向量表基地址寄存器*/
#ifdef CONFIG_HAS_VBAR
/*
* If the ARM processor has the security extensions,
* use VBAR to relocate the exception vectors.
*/

/*這個(gè)還是操作協(xié)處理器,和start.S里面設(shè)置重設(shè)向量表是一樣的*/
ldr r0, [r9, #GD_RELOCADDR] /* r0 = gd->relocaddr */
mcr p15, 0, r0, c12, c0, 0 /* Set VBAR */
#else
/*
省略
*/

#endif
#endif
bx lr

ENDPROC(relocate_vectors)
/*arch/arm/cpu/armv7/start.S*/

ENTRY(c_runtime_cpu_setup)
/*
* If I-cache is enabled invalidate it
*/

/*因?yàn)閡-boot又已經(jīng)重定位了,現(xiàn)在流水線和緩存里面的內(nèi)容都是舊的,需要清掉重新填充*/
#if !CONFIG_IS_ENABLED(SYS_ICACHE_OFF)
mcr p15, 0, r0, c7, c5, 0 @ invalidate icache
mcr p15, 0, r0, c7, c10, 4 @ DSB
mcr p15, 0, r0, c7, c5, 4 @ ISB
#endif

bx lr

ENDPROC(c_runtime_cpu_setup)

然后是清bss段,這是C語言運(yùn)行環(huán)境需要的,然后執(zhí)行board_init_r

/*arch/arm/lib/crt0.S*/

/* Set up final (full) environment */

bl c_runtime_cpu_setup /* we still call old routine here */
#endif
/*CONFIG_SPL_BUILD未定義,要執(zhí)行*/
#if !defined(CONFIG_SPL_BUILD) || CONFIG_IS_ENABLED(FRAMEWORK)

/*CONFIG_SPL_EARLY_BSS未定義,要執(zhí)行*/
#if !defined(CONFIG_SPL_EARLY_BSS)
/*清BSS段,這是一個(gè)宏定義,執(zhí)行了一個(gè)memset,就不追進(jìn)去了*/
SPL_CLEAR_BSS
#endif

/*未定義*/
# ifdef CONFIG_SPL_BUILD
/* Use a DRAM stack for the rest of SPL, if requested */
bl spl_relocate_stack_gd
cmp r0, #0
movne sp, r0
movne r9, r0
# endif

/*未定義,要執(zhí)行,就是點(diǎn)亮一顆led燈,執(zhí)不執(zhí)行都無所謂*/
#if ! defined(CONFIG_SPL_BUILD)
bl coloured_LED_init
bl red_led_on
#endif
/*將gd_t這個(gè)數(shù)據(jù)結(jié)構(gòu)放到r0中,將重定位地址放到r1中,作為參數(shù)傳給board_init_r*/
/* call board_init_r(gd_t *id, ulong dest_addr) */
mov r0, r9 /* gd_t */
ldr r1, [r9, #GD_RELOCADDR] /* dest_addr */
/* call board_init_r */
#if CONFIG_IS_ENABLED(SYS_THUMB_BUILD)
ldr lr, =board_init_r /* this is auto-relocated! */
bx lr
#else
/*調(diào)用board_init_r,進(jìn)入u-boot第二階段*/
ldr pc, =board_init_r /* this is auto-relocated! */
#endif
/* we should not return here. */
#endif

到了這里,u-boot重定位就結(jié)束了,其實(shí)u-boot重定位的知識(shí)遠(yuǎn)不止代碼中的這點(diǎn)兒,有很多的細(xì)節(jié),建議讀者有時(shí)間的話,多去網(wǎng)上查閱一下相關(guān)的資料,比如位置無關(guān)代碼與位置有關(guān)代碼,為什么需要重定位等問題,這樣對重定位才有更加深入和深刻的理解。

歡迎掃碼關(guān)注我的微信公眾號

亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
久久久精彩视频| 欧美a级片一区| 国产精品久久久久秋霞鲁丝| 久久久水蜜桃| 欧美一区二区| 先锋影音网一区二区| 一区二区成人精品| 亚洲精品一区在线| 亚洲黄一区二区三区| 狠狠色综合网| 一区二区在线视频| 极品中文字幕一区| 1000部精品久久久久久久久| 在线精品亚洲一区二区| 影音先锋久久| 亚洲国产影院| 日韩视频在线一区二区三区| 日韩午夜精品视频| 亚洲一区二区三区免费视频 | 亚洲欧美日韩在线一区| 亚洲视频自拍偷拍| 亚洲欧美日韩在线观看a三区 | 久久理论片午夜琪琪电影网| 久久久.com| 麻豆国产精品va在线观看不卡| 蜜桃av一区| 欧美美女bbbb| 欧美午夜在线观看| 国产欧美日韩精品丝袜高跟鞋| 狠狠入ady亚洲精品经典电影| 亚洲第一精品影视| 日韩亚洲欧美高清| 久久精品九九| 欧美国产精品中文字幕| 欧美精品在线一区二区| 国产精品久久国产愉拍| 黄色成人在线网址| 99在线|亚洲一区二区| 先锋影音国产精品| 麻豆精品在线视频| 欧美日韩调教| 国产资源精品在线观看| 亚洲精品孕妇| 性18欧美另类| 欧美国产一区二区三区激情无套| 欧美午夜精品久久久久久久| 国产欧美一区二区三区在线老狼| 在线精品高清中文字幕| 亚洲午夜激情网页| 亚洲性视频网址| 久久艳片www.17c.com| 欧美色道久久88综合亚洲精品| 韩国欧美一区| 亚洲欧美日韩国产成人精品影院| 免费日韩av片| 国产在线播放一区二区三区| 一区二区三区视频在线| 蜜臀久久99精品久久久画质超高清| 国产精品久久久久久久久久久久久久| 一区二区亚洲精品| 欧美一区二区三区免费在线看| 欧美日本不卡高清| 亚洲国产经典视频| 久久久精品国产免费观看同学| 国产精品美女诱惑| 99在线观看免费视频精品观看| 美国成人直播| 精品av久久707| 欧美在线在线| 国产欧美精品在线播放| 99精品国产高清一区二区| 麻豆精品精华液| 国产日韩欧美成人| 午夜精品美女久久久久av福利| 欧美日韩国产首页| 亚洲三级性片| 鲁大师成人一区二区三区| 国产一二三精品| 午夜伦理片一区| 国产精品久久久久久久久久免费看| 亚洲激情不卡| 免费中文字幕日韩欧美| 精品999网站| 久久成人资源| 国产无一区二区| 午夜一区不卡| 国产欧美日韩一区二区三区在线观看 | 伊人夜夜躁av伊人久久| 性欧美大战久久久久久久免费观看| 欧美美女bbbb| 亚洲精品国产精品国自产在线| 久久综合网络一区二区| 精品1区2区3区4区| 蜜桃av一区| 亚洲高清视频的网址| 亚洲精品系列| 欧美体内谢she精2性欧美| 在线亚洲成人| 国产精品热久久久久夜色精品三区 | 亚洲一区二区三区视频| 欧美亚男人的天堂| 午夜亚洲激情| 国内成人精品视频| 久久免费午夜影院| 最新日韩中文字幕| 欧美午夜激情视频| 午夜在线观看欧美| 好看的av在线不卡观看| 嫩草伊人久久精品少妇av杨幂| 亚洲欧洲日产国产综合网| 欧美日韩国产一区精品一区| 在线视频精品一区| 国产区精品在线观看| 麻豆国产精品va在线观看不卡| 亚洲精品三级| 国产精品试看| 久久综合给合| 日韩午夜高潮| 国户精品久久久久久久久久久不卡 | 久久久综合网站| 日韩视频在线观看免费| 国产精品免费久久久久久| 欧美在线视频一区二区| 亚洲夫妻自拍| 国产精品扒开腿爽爽爽视频| 欧美亚洲综合另类| 亚洲欧洲日本mm| 国产精品久久婷婷六月丁香| 久久国产欧美| 99精品国产在热久久下载| 国产欧美在线| 欧美日产一区二区三区在线观看 | 欧美激情在线有限公司| 亚洲欧美国产毛片在线| 亚洲成在人线av| 国产精品爱啪在线线免费观看| 久久久久久色| 亚洲午夜一二三区视频| 在线免费观看成人网| 国产精品国产三级国产aⅴ无密码 国产精品国产三级国产aⅴ入口 | 久久免费偷拍视频| 亚洲视频第一页| 亚洲国产成人tv| 国产精品一香蕉国产线看观看| 欧美a级大片| 久久国产99| 一区二区电影免费在线观看| 黑人巨大精品欧美一区二区小视频 | 在线亚洲激情| 亚洲电影av| 国产丝袜一区二区三区| 欧美日韩亚洲系列| 久热精品在线| 欧美一区二区三区日韩| av不卡免费看| 亚洲韩国日本中文字幕| 国产一区日韩一区| 国产精品一区二区欧美| 欧美日韩一区二区三区在线观看免 | 亚洲一区中文字幕在线观看| 亚洲高清自拍| 国产亚洲高清视频| 国产精品www色诱视频| 欧美精品二区| 欧美福利一区二区三区| 久久艳片www.17c.com| 欧美一区二区成人| 亚洲欧洲99久久| 亚洲无线观看| 夜夜嗨av一区二区三区四季av | 久久成人免费日本黄色| 亚洲综合日韩在线| 亚洲一区二区三区在线视频| 99国产精品视频免费观看一公开| 亚洲国产经典视频| 在线成人黄色| 亚洲高清一区二区三区| 亚洲国产成人久久| 亚洲欧洲中文日韩久久av乱码| 亚洲黄色一区二区三区| 亚洲精品人人| 亚洲一区二区三区乱码aⅴ| 亚洲砖区区免费| 午夜免费日韩视频| 久久国产成人| 麻豆精品网站| 欧美日韩色一区| 国产精品福利网站| 国产精品香蕉在线观看| 国产午夜精品理论片a级大结局| 国产日韩精品视频一区二区三区| 国产亚洲人成网站在线观看| 国产一区二区精品在线观看| 黄色av一区| 亚洲欧洲精品成人久久奇米网| 亚洲精选一区| 午夜影视日本亚洲欧洲精品| 久久国产精品久久久久久| 久久一区二区精品| 欧美国产精品日韩|