资讯详情

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

前些时候一直不明白"memcpy((unsigned char *)0x0,(unsigned char *)0x30000000,0x1000);"的用途,今天算是了解了,就是将放到0地址处、发生异常的时候总是跳转到这里取指执行。

如果这里没有异常向量表、异常就得不到处理、而且CPU还无法从这个区域返回到跳转之前的地方。

先贴图

图中左边是反汇编代码、可以看到机器码。

而且由于映像文件的入口地址Imageentrypoint设为0x30000000、也就是使用调试,

所以图中的代码是从0x30000000开始存放(标号'ResetEntry'在0x30000000地址处)。

注意每条语句的机器码(方括号'[XXX]'里面的数据)。

右边是打开的用来下载.bin文件、里面就是机器码。

它和反汇编里面的机器码一样、注意是littleendian模式。

运行 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种,提供一站式正品现货采购、个性化解决方案、选型替代等多元化服务。
锐单商城拥有海量元器件数据手册IC替代型号,打造 电子元器件IC百科大全!

锐单商城 - 一站式电子元器件采购平台