KernelRelocate函数的疑问

lan120576664 2010-06-02 06:14:48
小弟我看EBOOT的相关内容,在BOOTLOADERMAIN()中有个KernelRelocate()函数。
static BOOL KernelRelocate (ROMHDR *const pTOC)
{
ULONG loop;
COPYentry *cptr;
if (pTOC == (ROMHDR *const) -1)
{
return (FALSE); // spin forever!
}
// This is where the data sections become valid... don't read globals until after this
for (loop = 0; loop < pTOC->ulCopyEntries; loop++)
{
cptr = (COPYentry *)(pTOC->ulCopyOffset + loop*sizeof(COPYentry));
if (cptr->ulCopyLen)
memcpy((LPVOID)cptr->ulDest,(LPVOID)cptr->ulSource,cptr->ulCopyLen);
if (cptr->ulCopyLen != cptr->ulDestLen)
memset((LPVOID)(cptr->ulDest+cptr->ulCopyLen),0,cptr->ulDestLen-cptr->ulCopyLen);
}
return (TRUE);
}
跟踪这个函数,看了相关的两个结构体ROMHDR 和COPYentry ,
以及参考了
http://blog.csdn.net/yjy889/archive/2009/07/06/4326558.aspx
这篇文章。理解到这个是将全局变量拷贝到RAM中去的一个函数。
现在有个疑问是
if (cptr->ulCopyLen)
memcpy((LPVOID)cptr->ulDest,(LPVOID)cptr->ulSource,cptr->ulCopyLen);
这个if (cptr->ulCopyLen)不是一直为0么,因为我看到COPYentry *cptr这是个局部变量,没有地方对cptr->ulCopyLen赋值。
所以我认为memcpy((LPVOID)cptr->ulDest,(LPVOID)cptr->ulSource,cptr->ulCopyLen),这条语句应该不执行的。
如果,cptr->ulCopyLen不为0,请问他是如何被赋值的?
或者说,cptr = (COPYentry *)(pTOC->ulCopyOffset + loop*sizeof(COPYentry));
这条语句会对cptr->ulCopyLen赋值么,如何赋值?
...全文
140 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
子愚 2010-06-18
  • 打赏
  • 举报
回复
C:\WINCE500\PRIVATE\WINCEOS\COREOS\NK\TOOLS\ROMIMAGE\ROM看看
子愚 2010-06-18
  • 打赏
  • 举报
回复
Romimage.exe中初始化了C代码定义的非0值全局变量
InsaneCode 2010-06-03
  • 打赏
  • 举报
回复
初始化的全局变量拷贝到内存,并且将未初始化的全局变量置0.
eboot启动的时候需要调用一次,nk启动的时候也要调用一次。
yulewjx 2010-06-02
  • 打赏
  • 举报
回复
你了解一下pTOC和相关结构就知道了.
老人参 2010-06-02
  • 打赏
  • 举报
回复
帮你顶

19,502

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 嵌入开发(WinCE)
社区管理员
  • 嵌入开发(WinCE)社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧