嵌入式30dvd30盤1u-boot6代碼筆記_第1頁
嵌入式30dvd30盤1u-boot6代碼筆記_第2頁
嵌入式30dvd30盤1u-boot6代碼筆記_第3頁
嵌入式30dvd30盤1u-boot6代碼筆記_第4頁
嵌入式30dvd30盤1u-boot6代碼筆記_第5頁
已閱讀5頁,還剩3頁未讀 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

1、u-boot-1.1.6 start.S代碼筆記收藏u-boot 1.1.6start.S 代碼學(xué)習(xí)/*參考了別人的一些筆記,看完了啟動代碼。本文檔在看代碼時碰到的,將這些曾經(jīng)困擾下來,以備今后之用。分析時不重要的代碼被刪除了。*/.globl _start_start:bresetldrpc, _undefined_instructionldrpc, _software_erruptldrpc, _prefetch_abortldrpc, _data_abortldrpc, _not_usedldrpc, _irqldrpc, _fiq_undefined_instruction:.word

2、 undefined_instruction_software_errupt: .word software_errupt_prefetch_abort:.word prefetch_abort_data_abort:.word data_abort_not_used:.word not_used_irq:.word irq_fiq:.word fiq.balignl 16,0 xdeadbeef/*_start是整個u-boot程序的點,即后,該處是整個程序的第一條指令。程序的點是由腳本所指定,比如對于smdk2410 的板子(下面都以smdk241 為例),文件位于boardsmdk214

3、0u-boot.lds。在該文件中:ENTRY(_start) 即指定程序的地址。globl _start 定義一個外部可以的變量,比如說,在其它源代碼文檔中,就可以直指_start這個變量。如entry=_start; 那此處entry值將是多少呢?因為_start相當(dāng)于一個變量,entry的值就是_start處的值,即 b reset機(jī)器碼值。關(guān)于globl定義的變量得注意的地方,后面還有這段代碼處理中斷向量表。關(guān)于 balignal 16,0 xdeadbeef 的網(wǎng)上資料:.align 偽操作用于表示對齊方式:通過添加填充字節(jié)使當(dāng)前位置滿足一定的對齊方式。.balign 的作用同.al

4、ign。.align alignment ,fill ,max其中:alignment 用于指定對齊方式,可能的取值為 2 的次冪,缺省為 4。fill 是填充內(nèi)容,缺省用 0 填充。max 是填充字節(jié)數(shù)最大值,如果填充字節(jié)數(shù)超過max,就不進(jìn)行對齊.例如: .align 4, 指定對齊方式為字對齊deadbeef 一般用來表示沒用的或是已經(jīng)被掉的內(nèi)存*/_TEXT_BASE:.wordTEXT_BASE.globl _armboot_start_armboot_start:.word _start/* These are definedh-specific linker script.*/.

5、globl _bss_start_bss_start:.word bss_start.globl _bss_end_bss_end:.word _end/*備注這幾個由.word 偽操作符定義變量的作用及其取值_TEXT_BASE:.wordTEXT_BASE_TEXT_BASE:此處定義一匯編語言,更好的理解就是:告訴編譯器,為_TEXT_BASE 分配空間,該空間的名字就叫_TEXT_BASE,該空間中的值就是由.word 后面確定的 TEXT_BASEC(即 0 x33F80000),相當(dāng)于C 語言中 long _TEXT_BASE=TEXT_BASE; TEXT_BASE 定義在boa

6、rdsmdk2410config.mk 文件中。該值的作用是告訴器,本程序運行的址為TEXT_BASE。U-boot 編譯后,燒在FLASH 的第一個塊中,CPU 復(fù)位上電后,PC 寄存器為 0 x0000。怎么會跑到TEXT_BASE 處執(zhí)行呢?事實上,CPU 上電后,從地址 0 x0000 處執(zhí)行,而U-BOOT 的最起始代碼,即本文件中從_start 開始的代碼是與地址不相關(guān)的,這段代碼放在任何空間執(zhí)行的結(jié)果都是一樣(當(dāng)然不是絕對,假設(shè)u-boot 代碼段是100K,則放在TEXT_BASE-80K 處,搬運時就會把u-boot 代碼后面 20K 部分覆蓋為最前面的 20K)。.glob

7、l _armboot_start_armboot_start:.word _start定義外部可以的變量_armboot_start,。即相當(dāng)于C long _armboot_start=&_start; _armboot_start 值是多少?是TEXT_BASE,即 0 x33F80000!等價的那條語句,取的是_start 變量地址,而不是_start本身。在語言中,定義一變量x=100;就是告訴編譯器。給我一個大小的空間,該空間存儲的值就是 100,這個空間在哪呢?即空間地址是多少呢?可以通過&x 知道。在匯編語言中,理解上有點不一樣。上面三行語句,第一句,告訴編譯器,向外面輸出變量_

8、armboot_start第二句,_armboot_start 變量在此處,到底在哪,要到時才能確定,凡正現(xiàn)在知道有這么一個變量了。第三句,_armboot_start 變量空間放的數(shù)據(jù)為_start的值。這點與語言的理解有點不一樣了。此處的是_start對應(yīng)處的地址。在匯編語言中,代表的就是那行所在的地址。圖是從u-boot 編譯后生成的u-boot.map 截圖的。從此文件中知道,_armboot_start 這個變量地址為 0 x33f80044,*/圖/*.globl _bss_start_bss_start:.word bss_start此三句,特別要備注的是 bss_start 這

9、個符號,它的值為多少?該值定義在boardsmdk2410u-boot.ld s 文件中. = ALIGN(4); bss_start = .;.bss : *(.bss) _end = .;上面的 bss_start=.; 表示 bss_start 值就是當(dāng)前位置的值。當(dāng)前位置是多少呢?從下面一句.bss:*(.ss)知道。緊接該位置后面馬上就是放bss 段數(shù)據(jù)了。所以,當(dāng)然就是bss 段的起始地址。_end 就是bss 段的結(jié)束地址。參考:bss 是這個的最后一個段。start.S 就是以這個段的起始地址來計算要搬運u-boot 大小的代碼的。即,這個段前面的所有數(shù)據(jù)都將被搬到TEXT_B

10、ASE 處。然后跑到start_armboot 處,即語言的代碼。 bss_start 這個值是多少? Smdk2410 我編譯后值是 0 x33f96f20??梢詮膱D的map 文件中查到,bss 段從 0 x33f96f20 開始分配的。再次驗證一下 0 x33f96f20 就是 bss_start 值,可以從圖處可以看到有個變量_bss_start 該變量就是由下面三條語句所定義,_bss_start 處保存的值就是 bss_start:.globl _bss_start_bss_start:.word bss_start用UltraEdit 打開生成的u-boot.bin,定位到文件偏移

11、 0 x48(0 x48 由_bss_start 所在地址 0 x33f80048-TEXT_BASE 得到),如圖,此處值確實是 20 6F F9 33(注意大小端)*/圖圖reset:/* set the cpu to SVC32 mode*/mrsr0,cpsrbicr0,r0,#0 x1forrr0,r0,#0 xd3msrcpsr,r0/*上面幾行進(jìn)入SVC 模式,通過裝入CPSR 到r0,修改相應(yīng)位后再載入到CPSR。*/* turn off the watchdog 關(guān)閉WATCH DOG,具體寄存器地址看DATASHEET 即知*/#if defined(CONFIG_S3C2

12、400)# define pWTCON0 x15300000# defineMSK0 x14400008/*erupt-Controller base addresses */# define CLKDIVN0 x14800014/* clock divisor register */#elif defined(CONFIG_S3C2410)# define pWTCON0 x53000000# defineMSK0 x4A000008/*erupt-Controller base addresses */# defineSUBMSK0 x4A00001C# define CLKDIVN 0

13、x4C000014/* clock divisor register */#endif#if defined(CONFIG_S3C2400) | defined(CONFIG_S3C2410)ldrr0, =pWTCONmovr1, #0 x0strr1, r0/* mask all IRQs by setting all bitsheMR default* 設(shè)置中斷寄存器相應(yīng)位,關(guān)閉中斷。*/movr1, #0 xffldrr0, =MSKstrr1, r0# if defined(CONFIG_S3C2410)ldrr1, =0 x3ffldrr0, =SUBMSKstrr1, r0# e

14、ndif/* FCLK:HCLK:PCLK = 1:2:4 */* default FCLK is 120 MHz ! */ldrr0, =CLKDIVNmovr1, #3strr1, r0#endif/* CONFIG_S3C2400 | CONFIG_S3C2410*/* we do sys-critical inits only at reboot,* not when booting from ram!*/#ifndef CONFIG_SKIP_LOWLEVEL_INITblcpu_init_crit#endif/*下面是重定位代碼,即將整個u-boot 搬到 TEXT_BASE 地址

15、處的代碼/*#ifndef CONFIG_SKIP_RELOCATE_UBOOTrelocate:/* relocate U-Boot to RAM*/adrr0, _start/* r0 - currentition ofcode*/ldrr1, _TEXT_BASE/* test if we run from flash or RAM */cmpr0, r1/* dont reloc during debug*/beqstack_setupldrr2, _armboot_startldrr3, _bss_startsub r2, r3, r2/* r2 - size of armboot*

16、/add r2, r0, r2/* r2 - source end address*/*adr r0, _start 這句代碼是將_start處運行時的地址值裝進(jìn)r0,這條指令到底取一個什么值呢?假設(shè)運行到該指令時pc 寄存器的值是X,start相對此本指令有Y 的偏移,則r0=X+Y(Y 可能是負(fù)值).針對該程序來說,當(dāng)被裝載到 0 x0000 處運行時,r0 就是 0,假設(shè)裝載到TEXT_BASE 處運行,則r0=TEXT_BASE.幾條指令分析如下:求正在運行的程序_start處地址到r0,將_TEXT_BASE 變量值裝到r1,即將 0 x33f80000 裝到r1,比較r0/r1 是

17、否相等,這個比較就是確定當(dāng)前是不是從Flash 中執(zhí)行的,還是這段代碼已裝載到 0 x33f80000 處執(zhí)行的。如果不等于 0 x33f80000,則將FLASH 中的u-boot 代碼搬到 0 x33f80000 處。具體計算如下:ldr r2,_armboot_startr2=0 x33f80000 ldr r3,_ss_startr3=bss 段的起始地*/copy_loop:ldmiar0!, r3-r10/* copy from source address r0*/stmiar1!, r3-r10/* copy toaddress r1*/cmp r0, r2/* until s

18、ource endaddreee r2*/ble copy_loop/*上面幾行將r0 地址處的代碼到r1 處,即從 0 x0000 搬到 0 x33f80000(假設(shè)CPU 復(fù)位從 0 x0000 執(zhí)行的)。*/#endif /* CONFIG_SKIP_RELOCATE_UBOOT */* Set up the stack設(shè)置堆棧 */stack_setup:ldrr0, _TEXT_BASE/* upper 128 KiB: relocated uboot*/subr0, r0, #CFG_MALLOC_LEN /* malloc area*/subr0, r0, #CFG_GBL_DATA_SIZE /* bdinfo*/#ifdef CONFIG_USE_IRQsub r0, r0, #(CONFIG_STACKSIZE_IRQ+CONFIG_ST

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論