如何算出指令 bootm 后面的地址

maniachhz 2014-06-25 02:06:24
各位大神,
我有一台设备, 把firmware 写入16M flash后, 就可以启动设备.
我看了烧录firmware程序源码, 但我未明白如何算出指令:bootm 0x9f040000 , 请问"0x9f040000"是如何知道的?


部分代码如下:
try:
if BOARD_8M_FLASH:
UBOOT_SIZE = 0x30000 # 192KB - uboot
UBOOTENV_SIZE = 0x10000 # 64KB - uboot env
FW_SIZE = 0x700000 # kernel + rootfs
DATA_SIZE = 0x90000 # 576KB - data
CFG_SIZE = 0x20000 # 128 KB - cfg
ART_SIZE = 0x8000 # 32 KB
WXEE_SIZE = 0x8000 # 32 KB
CFG_OFFSET = UBOOT_SIZE + UBOOTENV_SIZE + FW_SIZE + DATA_SIZE
else:
UBOOT_SIZE = 0x30000 # 192KB - uboot
UBOOTENV_SIZE = 0x10000 # 64KB - uboot env
FW_SIZE = 0x780000 # 1024KB + 6656KB - kernel + rootfs
DATA_SIZE = 0x90000 # 576KB - data
CFG_SIZE = 0x20000 # 128 KB - cfg
ART_SIZE = 0x8000 # 32 KB
WXEE_SIZE = 0x8000 # 32 KB
CFG_OFFSET = UBOOT_SIZE + UBOOTENV_SIZE + FW_SIZE + FW_SIZE + DATA_SIZE
except:
UBOOT_SIZE = 0x30000 # 192KB - uboot
UBOOTENV_SIZE = 0x10000 # 64KB - uboot env
FW_SIZE = 0x780000 # 1024KB + 6656KB - kernel + rootfs
DATA_SIZE = 0x90000 # 576KB - data
CFG_SIZE = 0x20000 # 128 KB - cfg
ART_SIZE = 0x8000 # 32 KB
WXEE_SIZE = 0x8000 # 32 KB
CFG_OFFSET = UBOOT_SIZE + UBOOTENV_SIZE + FW_SIZE + FW_SIZE + DATA_SIZE
BOARD_8M_FLASH = False

ART_OFFSET = CFG_OFFSET + CFG_SIZE
WXEE_OFFSET = ART_OFFSET + ART_SIZE

16M flash框架图:
...全文
224 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
maniachhz 2014-06-26
  • 打赏
  • 举报
回复
引用 6 楼 JQGuardian 的回复:
[quote=引用 5 楼 maniachhz 的回复:] [quote=引用 3 楼 senioryzc 的回复:] 0x9f040000 这个地址是你ddr mem的地址。 看意思你应该用的是256M的ddr,物理地址从0x8000 0000 ~ 0xa000 0000
我发的图上已经显示DDRAM大小, 是 64MB = 521Mb.
引用 4 楼 JQGuardian 的回复:
bootm 中m是内存的意思,就是从内存某个地址起动。单从这个命令来说只要是内存范围的地址都是可取的。你的程序加载到什么地址,bootm就使用什么地址。 如果要运行的这段程序是由uboot加载到内存中的,那么这个地址自然是由uboot决定的。至于,uboot怎么知道加载到哪里,那是移植uboot的人在其配置文件中指定的…… 够清楚了么?
楼上两位都说 0x9f040000是 内存地址, 但还是有疑惑, 因为此设备可以通过u-boot的 tftp来升级固件, 升级方法如下:
tftp 0x80060000 firmwarename 
erase 0x9f040000 +{$firmware大小};  cp.b 0x80060000 0x9f040000 {$firmware大小}
上面代码的0x80060000应该是内存地址, cp.b 指令应该是把内存地址0x80060000的内容复制到 0x9f040000地址中去, 难道此处0x9f040000还是内存地址? 好像说不通吧 [/quote] 这个,你是不是有NON-Flash ? 0x9f040000 在你的Flash上??Non Flash好你也是可以接内存接口的。 再不然就是loader中开了MMU映射过去的,总之 0x9f040000那地方是一个可以执行代码的……[/quote] flash 是 NOR 类型的, 能否解释清楚点如何得到0x9f040000吗
HMGuardian 2014-06-26
  • 打赏
  • 举报
回复
引用 5 楼 maniachhz 的回复:
[quote=引用 3 楼 senioryzc 的回复:] 0x9f040000 这个地址是你ddr mem的地址。 看意思你应该用的是256M的ddr,物理地址从0x8000 0000 ~ 0xa000 0000
我发的图上已经显示DDRAM大小, 是 64MB = 521Mb.
引用 4 楼 JQGuardian 的回复:
bootm 中m是内存的意思,就是从内存某个地址起动。单从这个命令来说只要是内存范围的地址都是可取的。你的程序加载到什么地址,bootm就使用什么地址。 如果要运行的这段程序是由uboot加载到内存中的,那么这个地址自然是由uboot决定的。至于,uboot怎么知道加载到哪里,那是移植uboot的人在其配置文件中指定的…… 够清楚了么?
楼上两位都说 0x9f040000是 内存地址, 但还是有疑惑, 因为此设备可以通过u-boot的 tftp来升级固件, 升级方法如下:
tftp 0x80060000 firmwarename 
erase 0x9f040000 +{$firmware大小};  cp.b 0x80060000 0x9f040000 {$firmware大小}
上面代码的0x80060000应该是内存地址, cp.b 指令应该是把内存地址0x80060000的内容复制到 0x9f040000地址中去, 难道此处0x9f040000还是内存地址? 好像说不通吧 [/quote] 这个,你是不是有NON-Flash ? 0x9f040000 在你的Flash上??Non Flash好你也是可以接内存接口的。 再不然就是loader中开了MMU映射过去的,总之 0x9f040000那地方是一个可以执行代码的……
maniachhz 2014-06-25
  • 打赏
  • 举报
回复
引用 3 楼 senioryzc 的回复:
0x9f040000 这个地址是你ddr mem的地址。 看意思你应该用的是256M的ddr,物理地址从0x8000 0000 ~ 0xa000 0000
我发的图上已经显示DDRAM大小, 是 64MB = 521Mb.
引用 4 楼 JQGuardian 的回复:
bootm 中m是内存的意思,就是从内存某个地址起动。单从这个命令来说只要是内存范围的地址都是可取的。你的程序加载到什么地址,bootm就使用什么地址。 如果要运行的这段程序是由uboot加载到内存中的,那么这个地址自然是由uboot决定的。至于,uboot怎么知道加载到哪里,那是移植uboot的人在其配置文件中指定的…… 够清楚了么?
楼上两位都说 0x9f040000是 内存地址, 但还是有疑惑, 因为此设备可以通过u-boot的 tftp来升级固件, 升级方法如下:
tftp 0x80060000 firmwarename 
erase 0x9f040000 +{$firmware大小};  cp.b 0x80060000 0x9f040000 {$firmware大小}
上面代码的0x80060000应该是内存地址, cp.b 指令应该是把内存地址0x80060000的内容复制到 0x9f040000地址中去, 难道此处0x9f040000还是内存地址? 好像说不通吧
HMGuardian 2014-06-25
  • 打赏
  • 举报
回复
bootm 中m是内存的意思,就是从内存某个地址起动。单从这个命令来说只要是内存范围的地址都是可取的。你的程序加载到什么地址,bootm就使用什么地址。 如果要运行的这段程序是由uboot加载到内存中的,那么这个地址自然是由uboot决定的。至于,uboot怎么知道加载到哪里,那是移植uboot的人在其配置文件中指定的…… 够清楚了么?
senioryzc 2014-06-25
  • 打赏
  • 举报
回复
0x9f040000 这个地址是你ddr mem的地址。 看意思你应该用的是256M的ddr,物理地址从0x8000 0000 ~ 0xa000 0000 zImage被放置到ddr mem尽量靠后的地方 详细信息可以看 arch/mips/boot/compressed 里面的文件 如果用的spi nand flash的话,bootm之前应该有 nand read 0x9f040000 xxxx xxxx之类的命令把kernel从flash读取到ddr mem
maniachhz 2014-06-25
  • 打赏
  • 举报
回复
引用 1 楼 Huntercao 的回复:
bootm的地址应该是和主板的CPU和Memory系统搭建有关系,由u-boot决定的,而和烧录工具和烧录程序没有关系?
bootm后面的地址应该是firmware写入flash位置的偏移地址, 而写入firmware 的偏移量好像就是:UBOOT_SIZE + UBOOTENV_SIZE = 256kB = 0x40000, 但不知道如何得到0x9f040000 . 不知道我理解错没? 因为没接触过这方面的知识.
曹大夯 2014-06-25
  • 打赏
  • 举报
回复
bootm的地址应该是和主板的CPU和Memory系统搭建有关系,由u-boot决定的,而和烧录工具和烧录程序没有关系?

21,595

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 驱动开发/核心开发
社区管理员
  • 驱动开发/核心开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧