免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 3027 | 回复: 9

[BootLoader] 对于MIPS加电启动U-boot的问题 [复制链接]

论坛徽章:
0
发表于 2014-11-17 20:07 |显示全部楼层
    对于MIPS加电启动U-boot,有个问题我一直想不明白,希望大家能够指导一下:CPU上电后会执行一个固定地址0xbfc00000的代码,一般存放有U-boot.bin的SPI Flash会映射到这个固定地址,也就是说CPU会执行SPI Flash中的u-boot代码,但是此时CPU中SPI Flash的控制器还没有被初始化,那么CPU是如何访问SPI Flash中的u-boot的呢?

论坛徽章:
1
2015年迎新春徽章
日期:2015-03-04 09:58:11
发表于 2014-11-17 21:43 |显示全部楼层
本帖最后由 arm-linux-gcc 于 2014-11-17 21:43 编辑

spi flash不会在这个地址
在这个地址是soc内部的一个rom,这个rom里的固件(流片时就固化好的)会做一些初始化,然后读取spi flash中的程序到ram中,然后跳到ram中去

论坛徽章:
0
发表于 2014-11-18 09:13 |显示全部楼层
回复 2# arm-linux-gcc

    主要是因为在网上看到hackpascal大侠讲解U-boot的启动流程(下图红线圈着的是引发我疑问的根源),不知道是不是我误解了hackpascal大侠的意思?
无标题.png


   

论坛徽章:
1
2015年迎新春徽章
日期:2015-03-04 09:58:11
发表于 2014-11-18 09:36 |显示全部楼层
回复 3# 星闪夜空


    我以前做过spi flash的驱动,spi flash是不能像nor flash那样直接读取,需要发送命令,所以soc内部必须要有固件的辅助才能够读取spi flash中的内容

论坛徽章:
0
发表于 2014-11-18 09:56 |显示全部楼层
回复 4# arm-linux-gcc
        非常感谢你的解答,我还有一个问题想请教你,对于u-boot源码中的如下代码:

     /* Initialize GOT pointer.*/
        bal     1f                    
        nop
        .word   _GLOBAL_OFFSET_TABLE_
        1:
        move    gp, ra                                 #ra:存放返回地址
        lw      t1, 0(ra)                                #lw: 从存储器中读取一个字的数据到寄存器中
        move        gp, t1

     _GLOBAL_OFFSET_TABLE_标志应该代表的是一个地址,不知道它起到什么作用?反正我搜索整个u-boot源码,就没有看到其他地址有使用到这个标志的。

     move gp, ra      这条指令应该是将ra寄存器中的返回地址存入gp寄存器中,而
     lw      t1, 0(ra)
     move        gp, t1   这两条指令应该也是将ra寄存器中的返回地址存入gp寄存器中,不知道为什么要做两次这样的处理?

论坛徽章:
1
2015年迎新春徽章
日期:2015-03-04 09:58:11
发表于 2014-11-18 12:43 |显示全部楼层
本帖最后由 arm-linux-gcc 于 2014-11-18 12:43 编辑

回复 5# 星闪夜空


    mips的汇编我不太清楚,我主要是搞arm的,mips只是知道一些cpu体系架构方面的知识

论坛徽章:
0
发表于 2014-11-18 13:56 |显示全部楼层
回复 6# arm-linux-gcc
    没事,还是谢谢了。

   

论坛徽章:
0
发表于 2015-03-26 19:41 |显示全部楼层
  /* Initialize GOT pointer.*/
        bal     1f                    
        nop
        .word   _GLOBAL_OFFSET_TABLE_
        1:
        move    gp, ra                                 #ra:存放返回地址
        lw      t1, 0(ra)                                #lw: 从存储器中读取一个字的数据到寄存器中
        move        gp, t1

     _GLOBAL_OFFSET_TABLE_标志应该代表的是一个地址,不知道它起到什么作用?反正我搜索整个u-boot源码,就没有看到其他地址有使用到这个标志的。

     move gp, ra      这条指令应该是将ra寄存器中的返回地址存入gp寄存器中,而
     lw      t1, 0(ra)
     move        gp, t1   这两条指令应该也是将ra寄存器中的返回地址存入gp寄存器中,不知道为什么要做两次这样的处理?

这段代码主要用于uboot第二阶段代码的重定位, _GLOBAL_OFFSET_TABLE_这个是在编译时产生的,我印象中是got表的首地址,最后三行代码你解释的是正确的,最后两句没有用。
回复 5# 星闪夜空


   

论坛徽章:
0
发表于 2015-04-12 22:04 |显示全部楼层
应该是连接地址

论坛徽章:
0
发表于 2015-04-12 22:05 |显示全部楼层
我也是做这块的,不过刚玩二个星期不够
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

SACC2019中国系统架构师大会

【数字转型 架构演进】SACC2019中国系统架构师大会
2019年10月31日~11月2日第11届中国系统架构师大会(SACC2019)将在北京隆重召开。四大主线并行的演讲模式,1个主会场、20个技术专场、超千人参与的会议规模,100+来自互联网、金融、制造业、电商等领域的嘉宾阵容,将为广大参会者提供一场最具价值的技术交流盛会。




----------------------------------------

大会官网>>
  

北京盛拓优讯信息技术有限公司. 版权所有 16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122
中国互联网协会会员  联系我们:huangweiwei@it168.com
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP