我的问题是:现在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文件时,会自动初始化这个变量,使其成为有效值,指向正确的地址。如果还是原来初始化的值,说明这个文件有问题。