前些时候一直不明白"memcpy((unsigned char *)0x0,(unsigned char *)0x30000000,0x1000);"的用途,今天算是了解了,就是将放到0地址处、发生异常的时候总是跳转到这里取指执行。
如果这里没有异常向量表、异常就得不到处理、而且CPU还无法从这个区域返回到跳转之前的地方。
先贴图
图中左边是反汇编代码、可以看到机器码。
而且由于映像文件的入口地址Image
所以图中的代码是从0x30000000开始存放(标号'ResetEntry'在0x30000000地址处)。
注意每条语句的机器码(方括号'[XXX]'里面的数据)。
右边是打开的用来下载.bin文件、里面就是机器码。
它和反汇编里面的机器码一样、注意是little
运行 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 :
-电子元器件采购网(www.ruidan.com)是本土元器件目录分销商,采用“小批量、现货、样品”销售模式,致力于满足客户多型号、高质量、快速交付的采购需求。 自建高效智能仓储,拥有自营库存超过50,000种,提供一站式正品现货采购、个性化解决方案、选型替代等多元化服务。