向paul_chao大侠提问::::依然是那段解析内核的代码???

zzwwjj   2009-5-25 13:14 楼主
paul_chao大侠您好:
“1. + 68 => Please refer %_WINCEROOT%\public\common\oak\inc\romldr.h Line 59 - ROM_TOC_POINTER_OFFSET (Offset from the image's physfirst address to the TOC pointer.)
也就是在 NK.nb0 中, TOC 的位址.

2. ( ((DWORD)lpdwToc & 0x90000000) == 0x80000000 )
判断该 NK.nb0 是要给 RAM 用的, 还是要烧至 flash 中用的, 故 LZ 可参考 OEMAddressTable, Flash 是否对映至 VA 0x8xxxxxxx, RAM 是否对映至 VA 0x9xxxxxxx.

总括来看, LZ 应是要透过 usb 下载 NK.nb0, 但 .nb0 中并无位址资讯, 故要透过 TOC 的所在的 Virtual Address, 来判断该 NK.nb0 是要放在 ram 上执行, 还是要烧录至 flash 上执行 (即 platform builder 中的 build option -- IMGFLASH 是否为1).
Paul, Chao @ Techware ”

根据您的解释,我知道了+ 68的含义
但是还有几点不是很清楚:
lpdwToc = (LPDWORD)(*(DWORD*)(RAMSTART + 68));        //Offset from the image's physfirst address to the TOC pointer
   
if( ((DWORD)lpdwToc & 0x90000000) == 0x80000000 ) //这里的9000_0000代表着SDRAM的虚拟地址,
                                                           8000_0000代表FLASH的虚拟地址
                                                         //这里是要看最高位是否为‘1’,那么lpdwToc当前是代表一段什么字段
                                                         //与上9000_0000 可以 == 8000_0000????
                                                         //而这个是在WINCE4下的定义,在WINCE5下,我的OEMaddressTable中定义的
                                                         //正好跟WINCE4相反,即:9000_0000代表的是FALSH,8000_0000代表的是SDRAM

{
   memcpy((LPVOID)&RomHdr, (LPVOID)(RAMSTART + ((DWORD)lpdwToc - FLASH_IMG_START)), sizeof(ROMHDR));
                                                  //这段更不懂了,1、为什么要向RomHdr拷贝内容,
                                                          这个RomHdr我在以后好象并没有
                                                         //用到,它的作用是什么呢?
                                                         //2、为什么要用lpdwToc - FLASH_IMG_START???
                                                         //在WINCE42下这个是可以减的,在WINCE5下FLASH_IMG_START是大于lpdwToc
                                                  //那么这个lpdwToc 跟FALSH有什么关系吗?
else
{
   memcpy((LPVOID)&RomHdr, (LPVOID)lpdwToc, sizeof(ROMHDR)); //这句的疑问跟上面一样------用RomHdr是要做什么?
}   
if( ((DWORD)lpdwToc & 0x90000000) == 0x80000000 )  //最后判断这个,如果满足就
{
   if (FlashWrite( RAMSTART, dwPhysLen))          //开始在这里向FALSH中写入NK数据
    {
      while (1);
     }
   launch(flashstart);                                    //从FLASH启动NK;
}
else
{   
   launch(ramstart);                              //直接从SDRAM启动NK
}
return TRUE;
}
还有最后一个问题:
通过这种方式 是否 只是 用来判断 是从SDRAM起 还是从FLASH起的??
如果是这样的话我可以不用TOC来判断,而用其他方法来做判断啊

回复评论 (2)

ding !
点赞  2009-5-25 15:45
1. if( ((DWORD)lpdwToc & 0x90000000) == 0x80000000 )
WinCE4.2 还是 WinCE5.0 不是重点, 重点是 LZ 的 OEMAddressTable 的值是设为多少, 因为 4.2 与 5.0 是不同的 bsp, 故这 2 个版本的 OEMAddressTable 定义可能会不同. 还有就是 config.bib 中, NK 的位置是在哪里, 是否会因 IMGFLASH 的值不同而有所改变?? LZ 可测试 IMGFLASH 设 1 or 不设, lpdwToc 其值是否会改变.

2. memcpy((LPVOID)&RomHdr, (LPVOID)(RAMSTART + ((DWORD)lpdwToc - FLASH_IMG_START)), sizeof(ROMHDR));  
2.1 RomHdr 是 Global Variable, 故无法得知其用途, 若是无人使用, 则应可忽略该行. 至於 TOC 的用途, LZ 可在 c:\WINCE500\platform\common\src\common\boot\blcommon\blcommon.c 看到 static BOOL KernelRelocate (ROMHDR *const pTOC), 它就是用 TOC 将 eboot 的 global variable 做初值的设定动作. (c language 中, global variable 没初值的清为 0, 有初值的会将初值放入)

2.2 lpdwToc - FLASH_IMG_START 是因为 lpdwToc 是放在 Flash 中, 但在执行 FlashWrite 前, 它还是在 RAMSTART (OEMusbdown() 中的第 4 行 PBYTE pImgStart = (PBYTE) RAMSTART;  //定义了一个下NK到SDRAM的地址) 中, LZ 可用 UltraEdit 这类的软体, 用 Hex Mode 去看 NK.nb0, 在 offset 68 的地方, 你会看到一个 lpdwToc 的值.

Paul, Chao @ Techware
点赞  2009-5-25 17:46
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复