uboot 代码存放的位置???0X30000000地址解析???
每次做裸奔实验的时候,都是在nor模式下,在串口工具secureCRT界面下输入命令,然后用dnw工具用USB下载到0X30000000地址上的.....我有些疑问:当切换到下载模式是,串口会在串口终端输出一系列的信息,提示我们怎样做。这表明开发板是已经有uboot的了,那么uboot存放在哪呢?因为,但我格式化nand Flash的时候,串口终端还能看到信息,说明uboot并没有因为nand Flash的格式化而删除了...难道说uboot存在在nor Flash中?
还有疑问的是: 配置USB下载工具时,地址是:0X30000000 ,这个地址是bank6的开始地址,是映射到SDRAM的空间的,但是我们下载的程序是下载到nand Flash上的,nand Flash映射的地址是bank0 ,开始地址是0x00000000。 只是说开发板启动时,硬件自动把nand Flash的前4K的代码复制到CPU内部的SRAM上运行罢了,。。。。。那么这样的话,这个0X30000000地址到底怎么解释? 1# albert
我有些疑问:当切换到下载模式是,串口会在串口终端输出一系列的信息,提示我们怎样做。这表明开发板是已经有uboot的了,那么uboot存放在哪呢?因为,但我格式化nand Flash的时候,串口终端还能看到信息,说明uboot并没有因为nand Flash的格式化而删除了...难道说uboot存在在nor Flash中?
答:你是下载Uboot到Nand Flash,你从NandFLash启动后,uboot会被拷贝到SDRAM执行,就算你擦除了NandFlash,Uboot还是可以用。另外,你的NorFlash出产的时候是有uboot的
还有疑问的是: 配置USB下载工具时,地址是:0X30000000 ,这个地址是bank6的开始地址,是映射到SDRAM的空间的,但是我们下载的程序是下载到nand Flash上的,nand Flash映射的地址是bank0 ,开始地址是0x00000000。 只是说开发板启动时,硬件自动把nand Flash的前4K的代码复制到CPU内部的SRAM上运行罢了,。。。。。那么这样的话,这个0X30000000地址到底怎么解释?
答:程序是先下载到SDRAM中,然后通过nand write命令从SDRAM中拷贝存储到NandFlash的 哦,明白了很多部分你说的格式化nand Flash 后,uboot还能用,是在开发板还没重启或者说复位之前能用吧,因为这时还没断电,uboot还在SDRAM中存在。。。。如果说断电之后,重启,这时如果是从nand Flash启动的话,因为其内已经没uboot了,所以uboot不能用了,不知道我的理解正确不? 3# albert
嗯,聪明的孩子 2# embedsky_lxt
这个问题也困扰我很久了
那我想问下:在linker选项时有RO地址的设置 这个跟DNW中地址的设置有什么关系呢 还有如果我把DNW的地址改成0可以吗
我对于程序的的存放以及地址问题一直很模糊 不知道到底程序是如何被存放 又是如何被执行的
是不是所以烧写到NAND中的程序都是先放到SDRAM中的呢 这是uboot中的读写命令规定了的,你改为零会引起拷贝存储错误了 :) 6# shufexiu
我想问下:如果我在NOR 中uBOOT界面中选择A 把程序烧写到NAND中,然后从NAND中启动,那么复位后PC是指向地址0处 还是指向|Image$$RO$$Base|。我记得我写了很简单的程序控制LED,烧写到NAND中,不管RO base设置成0或者0x3000000都能正常执行,为什么呢?如果设置成0x3000000,那么根据RO base得定义,程序应该从这个地址处开始执行啊,可是这个地址处有没有代码可以执行,简单程序如下IMPORT main
AREA HEAD, CODE, READONLY
ENTRY
bldisable_watch_dog (1)
blmemsetup (2)
blcopy_steppingstone_to_sdram (3)
ld pc, =on_sdram
on_sdram:
ldr sp, =0x34000000
blmain
halt_loop
b halt_loop
disable_watch_dog
mov r1, #0x53000000
mov r2, #0x0
str r2,
mov pc, lr
END
还有为什么我RO base的地址设置成什么 我查看反汇编时第一条指令的地址就是什么 如果是0还好理解 但是如果是0x30000000,我就不理解了 我是烧写到NAND中的 怎么会从0X300000开始呢?
还有对于RO base的地址的设置总是有疑惑:如果我把程序烧写到NAND中,如果程序中没有把代码复制到SDRAM中的代码段,那么我把地址设置成0X3000000可以吗,是不是只能设置成0。 R0设置的是0x30000000,也就是SDRAM的起始地址,这个地址我理解就是告诉编译器,所以我们的程序只能在SDRAM里跑,而且地址是从0x30000000开始,所以如果这么设置,bin可执行文件一定要拷贝到0x30000000,否则就会产生错误。当然RO的意思就是指令和常量存放的起始地址。
如果设置了0x30000000,那么假如代码里有一个标号label,这个标号对应的地址就会从0x30000000开始算起,当你通过这个 label 绝对跳转的时候,就是跳转到0x30000000以上的内存的位置,所以说如果设置了0x300000000,但你你把代码放到SRAM里执行(SRAM的地址是0-4k),就会出错 学习好东西…… 这篇文章真的很难好
页:
[1]