《基于S3C6410的U-boot启动代码分析》.docVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
预备知识 可执行文件由许多链接在一起的对象文件组成。对象文件有许多节,如文本、数据、init 数据、bss等。这些对象文件都是由一个称为?链接器脚本(*lds)的文件链接并装入的。这个链接器脚本的功能是将输入对象文件的各节映射到输出文件中;换句话说,它将所有输入对象文件都链接到单一的可执行文件中,将该可执行文件的各节装入到指定地址处。 因此在分析u-boot代码是,首先应关注的是u-boot.lds文件,它位于$(U-BOOT_SRC_ROOT)/board/$(BOARD_NAME)目录下。 U-Boot启动过程分析U-Boot的(1)第一阶段的功能 ((?硬件设备初始化 ((?加载U-Boot第二阶段代码到RAM空间 ((?设置好栈 ((?跳转到第二阶段代码入口(2)第二阶段的功能 ((?初始化本阶段使用的硬件设备 ((?检测系统内存映射 ((?将内核从Flash读取到RAM中(((? (((为内核设置启动参数第一阶段对应的文件是start.S和lowlevel_init.S。U-Boot启动第一阶段流程如下:首先分析u-boot.lds文件 /* * OUTPUT_FORMAT(default, big, little),在链接的时候,如果使用了-EB的命令行参数,则使用这里的big * 参数指定的字节序,如果使用了-EL;的命令行参数,则使用这里的little参数指定的字节序,如果没有使用 * 任何命令行参数,则使用这里的default参数指定的字节序。?? * 由$(SRC_ROOT)/board/samsung/smdk6410/u-boot.lds中的定义可见,不管在链接的时候使用了何种命令行参数, * 输出的目标文件都是使用elf32-littlearm方式的字节序。? */ OUTPUT_FORMAT(elf32-littlearm, elf32-littlearm, elf32-littlearm) /*OUTPUT_FORMAT(elf32-arm, elf32-arm, elf32-arm)*/ /*以上语句是指定输出可执行文件是elf格式,32位ARM指令,小端?*/ /*指定输出可执行文件的平台为ARM*/ OUTPUT_ARCH(arm)? /*指定输出可执行文件的起始代码段为_start.*/? ENTRY(_start) SECTIONS { ?/*定位当前地址为0x0地址*/ ?. = 0 ?/*指定代码以4字节对齐*/ ?. = ALIGN(4); ?/*指定代码段? */ ?.text: ?{ ?? cpu/s3c64xx/start.o?(.text)?? /*代码的第一个代码部分*/ ?? cpu/s3c64xx/s3c6410/cpu_init.o?(.text) ?? cpu/s3c64xx/onenand_cp.o?(.text) ?? cpu/s3c64xx/nand_cp.o?(.text) ?? cpu/s3c64xx/movi.o (.text) ?? *(.text) ?? lib_arm/div0.o ?} ?. = ALIGN(4); ?.rodata : { *(.rodata) }?/*指定只读数据段 */ ?. = ALIGN(4); ?.data : { *(.data) } ? /*指定读写数据段*/ ?. = ALIGN(4); ?.got : { *(.got) }??/*指定got段, got段式是uboot自定义的一个段, 非标准段*/ ?__u_boot_cmd_start = .;??/*把__u_boot_cmd_start赋值为当前位置, 即起始位置*/ ?.u_boot_cmd : { *(.u_boot_cmd) }? /*指定u_boot_cmd段, uboot把所有的uboot命令放在该段.*/ ?__u_boot_cmd_end = .;/*把__u_boot_cmd_end赋值为当前位置,即结束位置*/ ?. = ALIGN(4); ?.mmudata : { *(.mmudata) }. = ALIGN(4); ?__bss_start = .;?? /*把__bss_start赋值为当前位置,即bss段的开始位置*/ ?.bss : { *(.bss) }?? /*指定bss段? */ ?_end = .;/*把_end赋值为当前位置,即bss段的结束位置 */ }由u-boot.lds文件可知:下面就来分析start.s文件:(start.s位于目录$(U-BOOT_SRC_ROOT)/cpu/$(CPU_NAME)/目录下) ?------------------------------------

文档评论(0)

weizhuidaomengx + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档