打印
[技术问答]

memcpy((unsigned char *)0x0,(unsigned char *)0x30000000,0x1000);

[复制链接]
774|1
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
西门扫雪|  楼主 | 2015-10-13 08:16 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
                             前些时候一直不明白"memcpy((unsigned char *)0x0,(unsigned char *)0x30000000,0x1000);"的用途,今天算是了解了,就是将异常向量表放到0地址处、发生异常的时候CPU总是跳转到这里取指执行。

如果这里没有异常向量表、异常就得不到处理、而且CPU还无法从这个区域返回到跳转之前的地方。
先贴图
图中左边是反汇编代码、可以看到机器码。
而且由于映像文件的入口地址Image entry point设为0x30000000、也就是使用调试器调试,
所以图中的代码是从0x30000000开始存放(标号'ResetEntry'在0x30000000地址处)。
注意每条语句的机器码(方括号'[XXX]'里面的数据)。
右边是打开的用来下载.bin文件、里面就是机器码。
它和反汇编里面的机器码一样、注意是little endian模式。
运行 memcpy((unsigned char *)0x0,(unsigned char *)0x30000000,0x1000);语句之前、0地址处的值都是FF。
运行完毕之后、0地址处的值如下图

这条语句是从0x30000000处开始、复制4K代码到0地址处。
上图中从0地址开始的代码和.bin文件里面的代码一样、而且只是前4K一样。
就我的板子TX-2440来说 :
如果是Norflash启动、那么0地址在Norflash,就是复制到Norflash。
如果是Nandflash启动、那么0地址在BootRAM,就是复制到BootRAM。
语句这样做的目的是将异常向量表复制到0地址处、因为发生异常的时候、CPU自动跳转到0地址处读取指令。
要是0地址处没有这个异常向量表、那么就无法处理异常,中断就无法执行,含有中断的程序就会出错,
CPU无法返回到跳转之前的地方。
没有这条复制语句、那么0x0~0x30000000之间的内存里绝大多数是FF、少数是00 :


                       
  

沙发
734774645| | 2015-10-18 00:30 | 只看该作者
如果是Nandflash启动、那么0地址在BootRAM,就是复制到BootRAM。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

33

主题

286

帖子

1

粉丝