毕业论文开发语言企业开发JAVA技术.NET技术WEB开发Linux/Unix数据库技术Windows平台移动平台嵌入式论文范文英语论文
您现在的位置: 毕业论文 >> 嵌入式 >> 正文

全局变量pTOC是怎么到RAM中来的

更新时间:2013-3-17:  来源:毕业论文

我的问题是:现在ARM外挂的Flash一般都是使用NAND Flash,省钱。EBoot.nb0存储在NAND中,所以不能直接运。EBoot.nb0文件中应该有一段数据存储的就是全局变量的初始化值的。当EBoot.nb0烧入NAND中后,NAND中也就有了一段存储空间存储的就是这些全局变量的值。很显然,NAND中的某个位置就存储了全局变量pTOC,但因其在NAND中,故不能直接使用。而函数KernelRelocate(pTOC)中使用了这个全局变量pTOC,故代码跑到KernelRelocate(pTOC)处时全局变量pTOC必定在DDR中。问题就是这个全局变量pTOC是怎么到RAM中来的?难道编译器在处理pTOC全局变量和处理其他全局变量的方式不同?如果不同,具体区别在哪里?

blcommon中,ROMHDR * volatile const pTOC = (ROMHDR *)-1;
可以看到,pToc定义时是指向无效值的,其他地方也没有看到对其的初始化。玄机就是其初始化是由ROMIMAGE.exe做的。pTOC是作为Eboot.bin或者Eboot.nb0的一部分存在的。所以,当stepldr将eboot拷贝到内存的时候,pTOC作为Eboot的一部分也就存在内存里了。毕业论文 

我其实也是这么想的。但这样解释还有一个问题:本质上讲pTOC也是一个普通的全局变量,它有初始值(C代码中赋的-1也好,还是经过RomImag.exe处理后的那个值也好),全局变量pTOC和其他的全局变量如变量abc地位上应该是一样的才对,比如全局变量abc的初始值为0x01,pTOC和abc的初始值应该都放在同一个段中(也就是.bin文件或者.nb0文件中的数据段中)。芯片复位后,stepldr将前4K拷贝到芯片内部的RAM中,这样pTOC就到了RAM中,而且pTOC的地址也对了,那变量abc的初始值不是也拷贝出来了?如果abc也拷贝出来了,那还要KernelRelocate(pTOC)函数干嘛?感觉矛盾了。除非编译器在处理变量pTOC的时候做特殊处理了,那特殊处理在哪里呢?

是因为-1是最大值0xffffffff,取不到,才这样初始化的。如果初始化成一个其他值,恰好是有效地址,就有问题了,程序无法判断romimage是否生成了正确的文件。因为romimage.exe在生产nk.bin文件时,会自动初始化这个变量,使其成为有效值,指向正确的地址。如果还是原来初始化的值,说明这个文件有问题。

设为首页 | 联系站长 | 友情链接 | 网站地图 |

copyright©youerw.com 优尔论文网 严禁转载
如果本毕业论文网损害了您的利益或者侵犯了您的权利,请及时联系,我们一定会及时改正。