uboot代码详细分析

上传人:沈*** 文档编号:68308260 上传时间:2022-04-02 格式:DOC 页数:31 大小:153KB
收藏 版权申诉 举报 下载
uboot代码详细分析_第1页
第1页 / 共31页
uboot代码详细分析_第2页
第2页 / 共31页
uboot代码详细分析_第3页
第3页 / 共31页
资源描述:

《uboot代码详细分析》由会员分享,可在线阅读,更多相关《uboot代码详细分析(31页珍藏版)》请在装配图网上搜索。

1、目录u-boot-1.1.6之cpu/arm920t/start.s分析.2u-boot中.Ids连接脚本文件的分析.12分享一篇我总结的uboot学习笔记(转).15U-BOOT内存布局及启动过程浅析.22u-boot中的命令实现.25U-BOOT环境变虽实现.281相关文件.282.数据结构.283. ENV的初始化.303.1env_init.303.2 env_relocate.303.3* env_relocate_spec.314. ENV的保存.31U-Boot环境变量.32u-boot代码链接的问题.35Idr和adr在使用标号表达式作为操作数的区别.40start_armbo

2、ot浅析.42全局数据结构的初始化.422调用通用初始化函数.433初始化具体设备.444初始化环境变量.445-进入主循坏.44u-boot编译过程.44mkconfig文件的分析.47从NAND闪存中启动U-BOOT的设计.50引言.50NAND闪存工作原理.51从NAND闪存启动U-BOOT的设计思路.51具体设计.51支持NAND闪存的心动程序设计.51支持U-BOOT命令设计.52结语.53参考文献.53U-boot给kernel传参数和kernel读取参数一struct tag(以及补允).531、u-boot给kernel传RAM参数.542、Kernel读取U-boot传递的相

3、关参数.563、 关J- U-boot中的bd和gd.59U-BOOT源码分析及移植.60一、u-boot工程的总体结构: . 611、源代码组织.612. makefile简要分析.613、u-boot的通用目录是怎么做到与平台无关的? .634、smkd2410其余巫要的文件: .63二、u-boot的流程、主耍的数据结构、内存分配.64K u-boot的启动流程:.642、u-boot主要的数据结构.663、u-boot 31:定位后的内存分布: .68三、u-boot的重耍细节 .68关f U-boot中命令相关的编程:.73四、U-boot在ST2410的移植,J-NOR FLASH

4、和NAND FLASH启动761、从smdk2410到ST2410:.762、移植过程:.763、移植要考虑的问题:.774、SST39VF1601:.775、我实现的flash.c主要部分: .786、増加从Nand启动的代码:.827、添加网络命令。.87u-boot-1.1.6之卬u/arm920t/start.s分析armboot - Startup Code for ARM920 CPU-coreCopyright (c) 2001 Marius Gr餵er v magsvsgo.deCopyright (c) 2002 Alex Z羅ke v azusvsgo.deCopyrigh

5、t (c) 2002 Gary Jennejohn See file CREDITS for list of people who contributed to this project.This program is free software; you can redistribute it and/or modify itunder the terms of the GNU General Public License as published by theFree Software Foundation; either version 2 of the License, or (at

6、youroption) any later version.This program is distributed in the hope that it will be useful, butWlTHOUT ANY WARRANTY; without even the implied warranty ofMERCHANTABI LI TY or Fl TN ESS FOR A PARTICULAR PURPOSE.See the GNU General Public License for more details.You should have received a copy of th

7、e GNU General Public License* along with this program; if not, write to the Free Software* Foun datio n, Inc., 59 Temple Place, Suite 330, Bost on,* MA 021111307 USA# in elude # include Jump vector table as in table 3.1 in 1 /global声明一个符号町被其他文档引用,相当丁声明了 一个全局变虽,.globl和.global相同。 该部分为处理器的异常处理向战表.地址范围为

8、0 x0000 0000、0 x0000 0020,刚好8条指令.globl _startu-boot启动入I丨.start: b reset复位向磺并IL跳转到resetIdr pc, _undefined_instructionIdr pc, _softwarenterruptIdr pc, _prefetch_abortIdr pc, _data_abortIdr pc, _not_usedIdr pc,rq中断向駅Idr pc, _fiq/中断向最/ .word伪操作用于分配段字内存单元(分配的单元都是字对齐的),并用伪操作中的expr初始 化ong ffl.int作用与之相同._un

9、defined_instruction:word undefined_instruction_software interrupt:word software interrupt_prefetch_abort: .word prefetch_abort_data_abort: .word data_abort_not_used: .word not_used_irq:word irqiq: .word fiq/ .align伪操作用丁表示对齐方式: 通过添加垠充字节使肖询位誉满足一定的对齐方式.balign的作用 同.align o/ .align alignment Jill) ,max/英

10、中:alignment用丁指定对齐方式,可能的取值为2的次臥缺省为4fill是填充内容,缺省用0塡允.max足塡允了节数最大们.假如垠允了节数超过max./就不进行对齐,例如:/align 4/指定对齐方式为字对齐/.balignl 16,OxdeadbeefStartup Code (reset vector)do important init only if we donft start from memory! relocate armboot toramsetup stackjump to second stage/ TEXT_BASE任研发板相关的Fl录中的config.mk文档中定

11、义,他定义了 /代码在运行时所在的地址,那么_TEXT_BASE中保存了这个地址_TEXT_BASE:.word TEXT_BASE/声明_armboot_start并用_start来进行初始化.在board/u-boot.lds中定义.globl _armboot_start_armboot_start:.word _start/* These are defined in the board-specific linker script./声明_bss_start并用bss_start來初始化.梵中_bss_start定义在和板相关的u-boot.lds中/ _bss_start保存的l_

12、bss_start这个标号所在的地址, 这里涉及到当询代码所在/的地址不是编译时的地址的情况,这里总接取得该标兮对应的地址,不受编译时/地址的形响._bss_end也是同样的道理.globl _bss_start_bss_start:word _bss_start/同上.globl _bss_end_bss_end:.word _end# ifdef CON Fl G_USE_IRQr IRQ stack memory (calculated at run-time) */.globl I RQ_STACK_STARTIRQ_STACK_START:.word OxObadcOde/* IRQ

13、 stack memory (calculated at run-time) */ .globl FlQ_STACK_STARTFl Q_STACK_START:.word OxObadcOde# endifthe actual reset code / MRS RdCPSR|SPSR将CPSR|SPSR传送到Rd/便用这两条指令将状态奇存器传送到-般寄存器,只修攻必耍的位,再将结果传送冋状态寄存器,这 样能够垠好地完成対CRSP或SPSR的修改/ MSR CPSR_|SPSR_,Rm或是MSR CPSRJISPSRJ.#/ MRS和MSR配合使用.作为更新PSR的“读取一一修改一一吗序列的一

14、部分/ bic rO,r1 j2 ;r0: = r1 and not r2 / orr roj1 ,r2 ;rO: = r1 or r2/这几条指令执彳亍完毕后.进入SVC32模式,该模式主耍用來处理软件中断(SWI)reset:/* set the cpu to SVC32 mode/mrs rO,cpsr将CPSR状态寄存器读取,保存到RO中bic rO,rO,#Ox1forr rO,rO,# 0 xd3msr cpsr,rO/将RO写入状态寄存器中/* turn off the watchdog */关闭看门夠#if defined(CONFIG_S3C2400)# define pWT

15、CON 0 x15300000# define INTMSK 0 x14400008 /* Interupt-Controller base addresses */# define CLKDIVN 0 x14800014 /* clock divisor register */# elif defined(CONFI G_S3C241 0)# define pWTCON 0 x53000000# define INTMSK 0 x4A000008 / Interupt-Controller base addresses */# define INTSUBMSK 0 x4A00001C# de

16、fine CLKDIVN 0 x4C000014 /* clock divisor register */# endif#if defined(CONFIG_S3C2400) | defined(CONFIG_S3C2410)Idr rO, = pWTCONmov门,#0 x0str rl, rO/* mask all I RQs by setting all bits in the INTMRdefault/关闭所有中断mov r1, # OxffffffffIdr rO, =INTMSKstr r1, rO#if defined(CONFIG_S3C2410)Idr r1, =0 x3ff

17、Idr rO, =INTSUBMSKstr r1, rO#endif/* FCLK:HCLK:PCLK = 1:2:4 */ default FCLK is 120 MHz ! */Idr rO, =CLKDIVNmov r1, #3str r1, rO#en dif /* CON Fl G_S3C2400 | CONFI G_S3C2410 */* we do sys-critical inits only at reboot,* not when booting from ram!/ B转移指令.跳转到指令中折定的I的地址/ BL带链接的转移指令.像B郴同跳转并把转移后而紧接的-条指令地址

18、保存到链接寄存器LR(R14)中,以此来完成子程式的调用/该语句首先调用cpujnit_crit进行CPU的初始化, 并把下一条指令的地址保存在LR中,以使得执 行完后能够正常返回。# ifndef CONFIG_SKI P_LOWLEVEL_I NITbl cpu_init_crit# endif# ifndef CONFI G_SKI P_RELOCATE_UBOOT调试阶段的代码是直接右RAM中运行的,而最后需要把这些代码网化到Flash中,因此U-Boot需要自己从Flash转移到/ RAM中运疔,这也足重定向的目的所在.通过adr指令得到当前代码的地址信息:假如Uboot是从RAM开

19、始运行,则从adr,rO._start得到 的地址信息为/rO=_start=_TEXT_BASE=TEXT_BASE=Oxa3OOOOO0;假如U-boot从Flash开始运行,即从处 理器对应的地址运彳亍,/则r0= 0 x0000,这时将会执行copy_loop标识的那段代码了./ _TEXT_BASE定义( board/smdk2410/config.mk中relocate:/* relocate U-Boot to RAM */adr rO, _start /* rO vcurrent position of code * /Idr r1, _TEXT_BASE /* test if

20、 we run from flash or RAM */ cmp rO, r1/* don*t reloc during debug*/beq stack_setup/璽新定位代码声明_bss_start并用bss_start來初贻化,其中_bss_start定义在和板相关的u-boot.lds中Idr r2, _armboot_startIdr r3, _bss_startsub r2, r3, r2 /* r2 size of armboot*/add r2, rO, r2 /* r2 region phdr二fillsecname和contents是必须的,其他的都是可选的。下面挑儿个常

21、用的看看:secname:段名2、contents:决定哪些内容放在本段.可以是整个目标文件,也可以是目标文件中的 某段(代码段、数据段等)3、start:本段连接(运行)的地址,如果没有使用AT(Idadr),本段存储的地址也 是starto GNU网站上说start可以用任意一种描述地址的符号来描述。4、AT (Idadr):定义本段存储(加载)的地址。看-个简单的例子:(摘口2410完全开发)/* nand.lds */SECTIONS firtst 0 x00000000 : head.o init.o second 0 x30000000 : AT(4096) main.o 以上,h

22、ead.o放在0X00000000地址开始处,init.o放在head.o后面,他们的运行地址 也是0 x00000000,即连接和存储地址相同(没有AT指定):main.o放在4096(0 x1000,是AT指泄的, 储地址) 开始处, 但是它的运行地址在0X30000000,运行Z前碍耍从0 X1000(加载处)复制到0X30000000(运行处),此过程也就用到了读取Nand flash。这就是存储地址和连接(运行)地址的不同,称为加载时域和运行时域,可以在.Ids连 接脚本文件中分别指定。编写好的ds文件,在用arm-linux-ld连接命令时-Tfilename來调用执行,如arm-

23、linux-ld -Tnand.lds x.o y.o-o xy.Oo也用-Ttext参数直接指定连接地址,如arm-linux-ld -Ttext 0 x30000000 x.o y.o -o xy.o。既然程序仃了两种地址,就涉及到一些跳转指令的区别,这里正好写卜來,以后力 忘 记了也可査看,以前不少东西没记下來现在忘得差不多了。ARM汇编中,常有两种跳转方法:b跳转指令、Idr指令向PC赋值.我自己经过归纳如下:(1)b stepl : b跳转指令是札I对跳转,依赖当前PC的值,偏移磺是通过该指令本身的bit2來的,这使得使用b指令的程序不依赖耍跳到的代码的位宣,只看指令本身。(2) I

24、dr pc, =step1 :该指令是从内存中的某个位置(stepl)读出数据并赋给PC,同样依 赖当前PC的值,但是偏移屋是那个位置(stepl)的连接地址(运行时的地址),所以可 以用它实现从Flash到RAM的程序跳转。(3)此外,冇必耍回味一下adi伪指令,U-boot中那段relocate代码就是通过adr实现当前 程序是在RAM中还是flash中。仍然用我当时的注释:relocate: /*把U-Boot重新定位到RAM Tadr r0, _start /* rt)是代码的当前位置,/* adr伪指令,汇编器自动通过当前PC的值算出如果执行到_start时PC的值,放到r0中:当此

25、段在flash |执行时rO = _start = 0:当此段在RAM中执行时_start = _TEX T_BASE(在board/smdk2410/config.mk中指定的值为0 x33F80000,即u-boot在 把代码拷贝到RAM中去执行的代码段的开始)*/Idr r1, _TEXT_BASE /*测试判断是从Flash启动, 还是RAM7广此句执行的结果M始终是0X33FF80000. W为此值是又编译器指定的(ads中设 宣,或D设迓编译器参数)7cmp rO, r1广比较0和调试的时候不要执ff重定位 T下面,结合u-boot.lds看看一个正式的连接脚本文件。这个文件的某本

26、功能还能看明白, 虽然卜.面分析了好多,但其中那些GNU风格的符号还是着实让我感到迷惑,好菜啊,怪不 得连被3家公司鄙视,自己鄙视自己。OUTPUT_FORMAT(elf32­littlearnY, elf32­littlearm,elf32­littlea rm);指定输出可执行文件是elf格式,32位ARM指令,小端OUTPUT_ARCH(arm);指定输出可执行文件的平台为ARMENTRY(_start);指定输出可执行文件的起始代码段为.start.SECTIONS.=0 x00000000 ;从0 x0位置开始.=ALIGN(4);代码以4字节对齐.text

27、:;指定代码段cpu/arm920t/start.o (.text);代码的第一个代码部分*(.text);其它代码部分.=ALIGN(4)rodata : *(.rodata) ;指定只读数据段.=ALIGN(4);data : *(.data) ;指定读/写数据段.=ALIGN(4);got : *(.got) ;指定got段,got段式ftuboot自定义的一个段,非标准段_u_boot_cmd_start =.;把_u_boot_cmd_start赋值为当前位置,即起始位 置u_boot_cmd : *(.u_boot_cmd) ;指定u_boot_cmd段,uboot把所冇的u bo

28、ot命令放在该段._u_boot_cmd_end =把_u_boot_cmd_end赋值为当前位乱即结束位置.=ALIGN(4);_bss_start =把_bss_start赋值为为前位置,即bss段的开始位置bss : *(.bss) ;指定bss段_end =把_end赋值为当前位置,即bss段的结束位置分享一篇我总结的uboot学习笔记(转)1.卜面代码是系统启动后U-boot上电后运行的第一段代码,他是什么意思?.globl _startstart:bresetIdrpc, undefinedjnst ructionIdrpc,.softwarenterruptIdrpc,_pref

29、etch_abortIdrpc,_data_abortIdrpcot_usedIdrPC.JrqIdrpcq_undefinedjnstruction:.word undefined_instruction.softwareJnterrupt:.word softwareJnterrupt_prefetch_abort:word prefetchabort_data_abort:word data_abort_not_used:.word not_usedrq:.word irqiq:.word fiq.balignl 16,0 xdeadbeef他们是系统定义的异常, 一上电程序跳转到res

30、et异常处执行相应的汇编指令,卜面泄义出 的都是不同的异常,比如软件发生软中断时,CPU就会去执行软中断的指令,这些异常中断 在CUP中地址是从0开始,每个并常占4个字节reset:r* set the cpu to SVC32 mode*/mrs rO,cpsrbic rO,rO,#Ox1forr r0,r0.#0 xd3msr cpsrjO操作系统先注册一个总的中断,然厉去杳是由哪个中断源产生的中断,再去查用户注册的中 断表,査出來后就左执行用户定义的用户中断处理函数。Idr pc. undefined Instruction农示把_undefinednstruction存放的数值心放到p

31、c指针上,.undefinednstruction: .wordundefined .instruction表示未定义的这个异常是由.word来定义的,它表示定义一个字,一个32位的数,.word后面的数表示把该标识的编译地址写入 半前地址,标识是不占用任何指令的。把标识存放的数值copy到指针pc上面,那么标识上 存放的值是什么?是.word undefined_instruction來扌旨定的,pc就代表你运行代码的地址, 她就实现了CPU耍做一次跳转时的工作。什么是编译地址?什么是运行地址?32位的处理器,它的每一条指令是4个字节,以4个字节心储顺序,进行顺序执行,CPU是顺序执行的,只

32、要没发牛什么跳转,它会顺序进行执行,编译器会对每一条指令分配一个 编译地址, 这是编译器分配的, 在编译过程中分配的地址,我们称之为编译地址。运行地址是扌乩程序指令真正运行的地址,是由用户指定的,用户将运行地址烧录到哪里, 哪里就是运行的地址。比如有-个指令的编译地址是0 x5,实际运行的地址是0 x200,如果用户将抬令烧到0 x200 ,那么这条指令的运行地址就是0 x200,半编译地址和运行地址不 同的时候会出现什么结果?结果是不能跳转,编译后会产生跳转地址,如果实际地址和编译后产生的地址不相等,那么就不能跳转。C谄書编译地址都希望把编译地址和实际运彳j哋址 放在一起的,但是汇编代码因为

33、不需耍做C语言到汇编的转换, 町以人为的去写地址,所以 育.接写的就是他的运行地址,这就是为什么任何bootloader刚开始会有一段汇编代码,因为 起始代码编译地址和实际地址不相等,这段代码和汇編无关,跳转用的运行地址。编译地址 和运行地址如何来算呢?假如有两个编译地址a=0 x10, 20 x7, b的运行地址是0 x300,那 么a的运行地址就是b的运行地址加上两者编译地址的差值,a-b=0 x10-0 x7=0 x3,a的运行 地址就是0 x300+0 x3=0 x303。假设uboot上两 条指令 的编译 地址为a=0 x33000007和20 x33000001,这两条指令都落在b

34、ank6匕现在耍计算出他们对应的运行地址,耍找出运行地址的始地址,这个是由用戸烧 录进去的,假设运行地址的首地址是0 x0,则a的运行地址为0 x7, b为0 x1,就是这样算出来的.为什么要分配编译地址?这样做有什么好处,有什么作用?比如在函数a中定义了函数b,当执行到函数b时耍进彳j指令跳转,耍跳转到b函数所对应 的起始地址上去,编译时,编译器给每条指令都分配了编译地址,如果编译器已经给分配了 地址就町以自接进行跳转,金找b隨数跳转指令所对应的表,进行自接跳转,因为有个编译 地址和指令对应的一个表,如果没有分配,编译器就代找不到这个跳转地址,要进行计算, 非常麻烦。什么是相对地址?以N O

35、R Flash为例,NORFalsh是映射到bank。上面,SDRAM是映射到bank6上面,uboot和内核址终是在SDRAM上面运行, 最开始我们是从Nor Flash的零地址开始往后烧录,uboot中至少有一段代码编译地址和运行地址是不一样的,編译uboot或内孩时,都会将编译地址 放入到SO RAM中,他们最终都会在SO RAM中执行,刚开始uboot在N or Flash中运行,运 行地址是一个低端地址,是bankO中的一个地址,但编译地址是bank6中的地址,这样就会 导致绝对跳转指令执行的失败,所以就引出了相对地址的概念。那么什么是相对地址呢?至 少在bankO中uboot这段代

36、码耍知道不能用b+编译地址这样的方法去跳转捋令, 因为这段 代码的编译地址和运行地址不-样,那如何去做呢?要去计算这个指令运彳f的典实地址,计 算出来后再做跳转,应该是b+运行地址,不能出现b*编译地址,而是 2 运行地址,而运行 地址是算出來的。_TEXT_BASE:.word TEXT_BASE /0 x33F80000,在board/config.mk中这段话农示,用户告诉编译器编译地址的起始地址Uboot心动流程1.设宣CPU的启动模式reset:设克CPU进入管理模式即设置+II应的CPSR程序状态字r * set the cpu to SVC32 mode*/mrs rO,cpsr

37、bic rO,rO,#Ox1forr r0,r0.#0 xd3msr cpsrjO2.关闭看门狗,关闭中断,所谓的喂狗是每隔一段时间给某个寄存器置位而已,在实际 中会专门启动一个线程或进程会专门喂狗,当上层软件出现故障时就会停止喂狗,停止喂狗 之后, 卬u会自动复位, 一般都在外部专门有一个看门狗,做一个外部的电路,不在卬u内 部使用看门狗,cpu内部的看门狗是复位的卬u,当开发板很复杂时,冇好儿个cpu时,就 不能完全让板了复位,但我们通常都让整个板了复位,看门狗每隔短时间就会喂狗,问题是 在两次喂狗Z间的时间间隔内,运彳f的代码的时间是否够用,两次喂狗Z间的代码是否在两 次喂狗的时间延迟Z内,如果在延迟Z外的话,代码还没改完就乂进行喂狗,代码永远也改 不完。关闭看门狗的实际代码#if defined(CONFIG_S3C2400) | defined(CONFIG_S3C2410)Idr rO, =pWTCON将pwtcon寄存器地址赋给ROmov r1,#OxO/r1的内容为0

展开阅读全文
温馨提示:
1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
2: 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
3.本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
关于我们 - 网站声明 - 网站地图 - 资源地图 - 友情链接 - 网站客服 - 联系我们

copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!