LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 1420|回复: 1

[求助]u-boot for 44b0的疑问

[复制链接]
发表于 2006-9-29 20:28:07 | 显示全部楼层 |阅读模式
[求助]u-boot for 44b0疑问

lds中这么写的:

  1. . = 0x00000000;

  2.        
  3. . = ALIGN(4);
  4.        
  5. .text      :

  6. {
  7.           
  8.         cpu/s3c44b0/start.o        (.text)
  9.           
  10.         *(.text)
  11.        
  12. }
  13. ……
复制代码



start.S中有这么一段:

  1. adr        r0, _start                /* r0 <- current position of code   */
  2.        
  3. ldr        r1, _TEXT_BASE                /* test if we run from flash or RAM */
  4.         cmp     r0, r1                  /* don't reloc during debug         */
  5.        
  6. beq     stack_setup
复制代码

注释中说根据_start与_TEXT_BASE相等与否来判断是从flash还是ram启动。TEXT_BASE默认设为0x0c100000。看lds中写的难道_start不是0吗?难道还会跟着变动?
我理解是lds中的都是output section,所以描述的是运行时的分布情况。
如果是这样,那岂不是所有代码数据都在flash中?因为从0开始依次放置。如果要在ram中运行,至少有一段要写成类似的:

  1. .=RAM_BASE
  2. .data:
  3. {
  4. }
  5. ……
复制代码

莫非lds描述的是加载时的分布情况?

可能有点乱,我整理下我的问题:
1. 为什么map中的_start是从TEXT_BASE开始的而不是从0开始?
2. u-boot.lds中描述的是运行时还是加载时的分布情况?
3. start.S中有relocate代码,也就是说flash和ram中有两份代码。运行的时候到底跑的是哪个?按照lds的写法,难道在flash中跑不成?

还有一个土问:u-boot.bin怎么弄到裸板里去?怎么调试?

以上问题,恳请大虾不吝赐教。
发表于 2006-10-13 10:23:55 | 显示全部楼层
可能有点乱,我整理下我的问题:
1. 为什么map中的_start是从TEXT_BASE开始的而不是从0开始?
2. u-boot.lds中描述的是运行时还是加载时的分布情况?
3. start.S中有relocate代码,也就是说flash和ram中有两份代码。运行的时候到底跑的是哪个?按照lds的写法,难道在flash中跑不成?

还有一个土问:u-boot.bin怎么弄到裸板里去?怎么调试?

以上问题,恳请大虾不吝赐教。

1
_start一般就是复位向量所在的地址了,通常应该在Flash的地址空间中。
“TEXT_BASE默认设为0x0c100000”就可以看出TEXT_BASE是RAM中的地址,也就是u-boot被relocate到RAM中后的起始地址。

2
LZ似乎对于u-boot.lds文件的作用还不太明白,lds的英文全称是Linker Script,顾名思义该文件是用来指示ld的链接过程的,比如常用来定制ld输出的ELF文件的结构等。所以跟运行时完全没关系。

3
这个问题是对于u-boot的工作方式没有理解清楚造成的,u-boot的代码最开始当然是固化在Flash中的,但是上电运行时u-boot会将自身的可执行部分relocate到RAM中然后继续运行,这样可以提高运行的速度(Flash的读写速度比RAM慢很多)。

最后一个问题其实已经有答案了,固化到Flash中,一般是使用Flash programmer之类的程序通过JTAG烧写到Flash中。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表