mips的uboot移植与分析.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文档。上传文档
查看更多
mips的uboot移植与分析

mips的uboot移植与分析 /?p=96 要注意mips具有流水线可见性,所以跟在跳转指令后的下一条指令,在执行跳转到的地方前,都会执行,这个叫分支延迟。但是编译器会隐藏该特性,但可以通过设置”.set noreorder”来禁止编译器重新组织代码顺序。 每个板子都有自己的lds文件。这个主要是用来说明编译生成的指令,及运行过程中用到的数据放置的位置。这个可以参考ld的手册。比如board/dbau1×00/u-boot.lds。 OUTPUT_FORMAT(“elf32-tradbigmips”, “elf32-tradbigmips”, “elf32-tradbigmips”) /* 这里是生成格式为elf。大端,mips */ OUTPUT_ARCH(mips) /* 平台为mips */ ENTRY(_start) /* 入口点为_start */ SECTIONS { . = 0 . = ALIGN(4); .text : /* 这个是程序存放的地方 */ { *(.text) } . = ALIGN(4); /* 表示以4字节对齐 */ .rodata : { *(SORT_BY_ALIGNMENT(SORT_BY_NAME(.rodata*))) } . = ALIGN(4); .data : { *(.data) } . = .; _gp = ALIGN(16) + 0×7ff0; .got : { __got_start = .; /* 表示该处地址的值给__got_start */ *(.got) __got_end = .; } .sdata : { *(.sdata) } .u_boot_cmd : { __u_boot_cmd_start = .; *(.u_boot_cmd) __u_boot_cmd_end = .; } uboot_end_data = .; num_got_entries = (__got_end – __got_start) 2; . = ALIGN(4); .sbss (NOLOAD) : { *(.sbss) } .bss (NOLOAD) : { *(.bss) . = ALIGN(4); } uboot_end = .; } 下面来分析cpu/mips/start.S 首先从_start开始。前面是128个字(不是字节),是留给异常入口点的。 1. 最前面两个分别是硬复位和软复位,这两个都跳到reset处。 2. 下面就是清一些CP0(协处理器0,mips对CPU的控制都是通过它实现的)的一些主要位。 3. 然后是关闭cache 4. 下面这个比较有意思。为什么还非要跳一下呢?这样就可以知道代码的位置,而不是标号值。比如可能在RAM中或ROM中。 bal 1f nop .word _gp 1: lw gp, 0(ra) 5. 这里执行lowlevel_init。这是第一个需要我们自己定义的函数。由于没有初始化堆栈,这里只能用汇编。我们看到在jalr后跟了个nop,这就是分支延迟槽了,在这里什么也没有执行。 6. 下面执行了mips_cache_reset,它会来清理数据和指令的cache,并设置为正确的值。然后就可以打开cache了。 7. 由于我们的内存可能还没有始初化(有些人会有lowlevel_init中初始化,但有的人没有这样做)。但我们使用C函数的话,就需要堆栈,所以需要一个内存空间。于是这里执行了mips_cache_lock,将cache的地址锁定,就是将cache当内存用了。然后我们将堆栈的地址设定在我们锁定的cache的最高地址(因为堆栈是向下生长的)。这时我们就可以用C函数了,当然你还用不了malloc,也不可以太多的浪费堆栈。 8. 这里就跑到C的初始化函数中去了--board_init_f。 对于mips,board_init_f在lib_mips/board.c下。在board_init_f()函数中,主要完成了一些功能初始化,和划分RAM。 /* 所以最后RAM中是这样子的 —RAM 0×0000,0000— ………… — ^ SP ^ — — boot params — CONFIG_SYS_BOOTPARAMS_LEN bd-bi_boot_params — Global Data — sizeof(gd_t) gd — Board Info — sizeof(bd_t) gd-bd = bd — mallco(+env) — CONFIG_SYS_MALLOC_LEN + CONFIG_ENV_SIZE — uboot code — 16kB —RAM end — */ 再看一下都初始化了什么功能。初始化的函

文档评论(0)

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

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

1亿VIP精品文档

相关文档