免费注册 查看新帖 |

Chinaunix

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

U-BOOT在把代码拷贝到RAM中后怎么跳转到RAM中的C语言函数入口的? [复制链接]

论坛徽章:
0
发表于 2009-04-06 23:57 |显示全部楼层
请教: U-BOOT在把代码拷贝到RAM中后怎么跳转到RAM中的C语言函数入口的?

ldr,pc,_start_armboot

_start_armboot应该是FLASH中的函数入口地址,这么跳转跳转到RAM执行的?

谢谢!

论坛徽章:
0
发表于 2009-04-07 16:29 |显示全部楼层
在做 ldr,pc,_start_armboot 之前
已经搬到ram中去了

论坛徽章:
0
发表于 2009-04-07 16:30 |显示全部楼层
就是所谓的重定位  我在这里困惑了很久

论坛徽章:
0
发表于 2009-04-07 21:19 |显示全部楼层
能不能说的详细点呢? 就算是重定位,把代码搬到RAM去后,PC的值应该是在Flash中的地址值啊,它能够跳转到RAM执行,就是说PC的值应经是指向RAM中start_armboot函数的地址了,可PC的值是在什么时候被更改成在RAM中的地址值的呢?  
谢谢!

论坛徽章:
0
发表于 2009-04-07 22:29 |显示全部楼层
链接地址不是指向ram中的么?
还有不是所有的代码都是地址相关的。

论坛徽章:
0
发表于 2009-04-07 23:22 |显示全部楼层
直接修改段寄存器,跳转。
具体得看看uboot详解

论坛徽章:
5
发表于 2009-04-08 09:28 |显示全部楼层
原帖由 emmoblin 于 2009/4/7 23:22 发表
直接修改段寄存器,跳转。
具体得看看uboot详解


nod

论坛徽章:
5
发表于 2009-04-08 09:42 |显示全部楼层
这是mpc7xxx的boot sequence.  红色字体就是相关部分.

(cpu/mpc7xxx/start.S)
start: b boot_cold
start_warm: b boot_warm
boot_cold: boot_warm: clear bats
    init l2 (if enabled)
    init altivec (if enabled)
    invalidate l2 (if enabled)
    setup bats (from defines in config_EVB)
    enable_addr_trans: (if MMU enabled) enable MSR_IR and MSR_DR jump to in_flash
in_flash: enable l1 dcache
    gal_low_init: (board/evb64260/sdram_init.S) config SDRAM (CFG, TIMING, DECODE)
        init scratch regs (810 + 814)
        detect DIMM0 (bank 0 only)
        config SDRAM_PARA0 to 256/512Mbit
        bl sdram_op_mode
        detect bank0 width write scratch reg 810 config SDRAM_PARA0 with results
        config SDRAM_PARA1 with results
        detect DIMM1 (bank 2 only)
        config SDRAM_PARA2 to 256/512Mbit
        detect bank2 width write scratch reg 814 config SDRAM_PARA2 with results
        config SDRAM_PARA3 with results
        setup device bus timings/width
        setup boot device timings/width
        setup CPU_CONF (0x0)
        setup cpu master control register 0x160
        setup PCI0 TIMEOUT
        setup PCI1 TIMEOUT
        setup PCI0 BAR
        setup PCI1 BAR
        setup MPP control 0-3
        setup GPP level control
        setup Serial ports multiplex
    setup stack pointer (r1)
    setup GOT
    call cpu_init_f debug leds board_init_f: (common/board.c) board_early_init_f: remap gt regs?
            map PCI mem/io
            map device space
            clear out interupts init_timebase
        env_init
        serial_init
        console_init_f
        display_options
        initdram: (board/evb64260/evb64260.c) detect memory
            for each bank: dram_size()
                setup PCI slave memory mappings
                setup SCS setup monitor alloc board info struct
        init bd struct
        relocate_code: (cpu/mpc7xxx/start.S) copy,got,clearbss

            board_init_r(bd, dest_addr) (common/board.c) setup bd function pointers
                trap_init
                flash_init: (board/evb64260/flash.c)
                setup bd flash info
                cpu_init_r: (cpu/mpc7xxx/cpu_init.c) nothing mem_malloc_init
                malloc_bin_reloc
                spi_init (r or f)??? (CFG_ENV_IS_IN_EEPROM)
                env_relocated
                misc_init_r(bd): (board/evb64260/evb64260.c) mpsc_init2

论坛徽章:
0
发表于 2009-04-08 09:53 |显示全部楼层
原帖由 byhoo123 于 2009-4-7 21:19 发表
能不能说的详细点呢? 就算是重定位,把代码搬到RAM去后,PC的值应该是在Flash中的地址值啊,它能够跳转到RAM执行,就是说PC的值应经是指向RAM中start_armboot函数的地址了,可PC的值是在什么时候被更改成在RAM中的地 ...


在 start.s 中 好像有个  adr r0, _text_base  , 这里就是判断是在 flash 中还是在 ram  中, 在FLASH 的话,就要搬移到ram 中, 再就到 ram 里面去了

论坛徽章:
0
发表于 2009-04-08 11:25 |显示全部楼层
代码在链接的时候不是有个链接脚本么? ld -T (ram地址)
生成的代码如下:
地址 : 代码
ram+0:init  ()      
ram+1:移动ram中  (这些与地址无关,随便在哪里都可以运行)
ram+2:call ram+3  这里代码地址相关了,因为代码的意思是要跳到ram+3
ram+3:start
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP