前些时候一直不明白"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 :
|