eboot DownloadImage函数中为什么要调用OEMMapMemAddr()??

lyx_wq 2009-12-18 11:19:31
DownloadImage核心代码:
while (OEMReadData (sizeof (DWORD), (LPBYTE) &dwRecAddr)
&& OEMReadData (sizeof (DWORD), (LPBYTE) &dwRecLen)
&& OEMReadData (sizeof (DWORD), (LPBYTE) &dwRecChk)) {

RETAILMSG(1, (_T("DownloadImage RecAddr: 0x%x\r\n"), dwRecAddr));
RETAILMSG(1, (_T("DownloadImage RecLen: 0x%x\r\n"), dwRecLen));
RETAILMSG(1, (_T("DownloadImage RecChk: 0x%x\r\n"), dwRecChk));

// check for last record
if (!dwRecAddr && !dwRecChk) {
// if this is the kernel region, update launch address
if (IsKernelRegion(dwImageStart, dwImageLength)) {
*pdwImageStart = dwImageStart;
*pdwImageLength = dwImageLength;
*pdwLaunchAddr = dwRecLen;

RETAILMSG(1, (_T("dwImageStart : 0x%x\r\n"), dwImageStart));
RETAILMSG(1, (_T("dwImageLength: 0x%x\r\n"), dwImageLength));
RETAILMSG(1, (_T("LaunchAddr : 0x%x\r\n"), dwRecLen));
}

// write to flash if it's flash image
if (fIsFlash) {
// finish the flash erase
if (!OEMFinishEraseFlash ()) {
HALT (BLERR_FLASH_ERASE);
return FALSE;
}
// Before writing the image to flash, optionally check the image signature.
if (g_pOEMCheckSignature)
{
if (!g_pOEMCheckSignature(dwImageStart, g_dwROMOffset, *pdwLaunchAddr, TRUE))
HALT(BLERR_WHQL_SIGNATURE);
}
}

// On to the next (possible) BIN file...
break;
}

// map the record address (FLASH data is cached, for example)
lpDest = OEMMapMemAddr (dwImageStart, dwRecAddr);

// read data block
if (!OEMReadData (dwRecLen, lpDest)) {
EdbgOutputDebugString ("****** Data record %d corrupted, ABORT!!! ******\r\n", nPkgNum);
HALT (BLERR_CORRUPTED_DATA);
return FALSE;
}

if (!VerifyChecksum (dwRecLen, lpDest, dwRecChk)) {
EdbgOutputDebugString ("****** Checksum failure on record %d, ABORT!!! ******\r\n", nPkgNum);
HALT (BLERR_CHECKSUM);
return FALSE;
}

为什么要有lpDest = OEMMapMemAddr (dwImageStart, dwRecAddr);呢,我的理解这句if (!OEMReadData (dwRecLen, lpDest))的lpDest不应该是dwRecAddr吗??我查baidu说是为了给flash映射Ram空间,DownloadImage不应该是把nk.bin内核解析成nk.nb0放到RAM然后就可以跳转运行了吗?

现在这样的话接收的数据不都在lpDest地址,而dwRecAddr地址出处会有数据吗?如果没有怎么可能执行内核代码?
不理解啊!!
...全文
378 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
lllchr88 2010-01-21
  • 打赏
  • 举报
回复
学习了!
lyx_wq 2009-12-18
  • 打赏
  • 举报
回复
跳转之前确实有个WriteRegionsToBootMedia函数是
stores the image cached in RAM to the Boot Media
的,但我现在迷惑的是 下载的地址不对,怎么运行的问题,它没再从flash copy回来一遍啊!!
难道,当时俩个地址空间lpDest,dwRecAddr都有nk的存储????
gooogleman 2009-12-18
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 veabol 的回复:]
目的是想由OEM来决定到底是把这个BIN文件解析后的数据存放到哪个地址空间,OEMMapMemAddr 返回的地址就是存放的地址
[/Quote]

学习了!哎,感觉俺好菜。继续努力。
lyx_wq 2009-12-18
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 veabol 的回复:]
目的是想由OEM来决定到底是把这个BIN文件解析后的数据存放到哪个地址空间,OEMMapMemAddr 返回的地址就是存放的地址
[/Quote]
照代码的意思是要存到flash里面啊,可不是要下载到SDRAM运行的吗,经过这个一转换,内核没在正确的SDRAM地址上,怎么运行的啊。后面没有再拷贝到SDRAM的代码了啊
博说医械研发 2009-12-18
  • 打赏
  • 举报
回复
目的是想由OEM来决定到底是把这个BIN文件解析后的数据存放到哪个地址空间,OEMMapMemAddr 返回的地址就是存放的地址
gooogleman 2009-12-18
  • 打赏
  • 举报
回复
我看了也没有看明白。呵呵。
VCILOVE 2009-12-18
  • 打赏
  • 举报
回复
没有研究过,不是很明白,但是帮你顶一个,等知道的人来解决
liuysheng 2009-12-18
  • 打赏
  • 举报
回复
LPBYTE OEMMapMemAddr(DWORD dwImageStart, DWORD dwAddr)

该函数主要做Flash到RAM的地址影射。WinCE image在下载的时候是边下载边写入的,由于写入Flash速度慢,可能会影响到下载,所以该函数实现了一个RAM的缓冲区,就是将Flash地址映射到RAM中,这样下载的数据先被放在RAM缓冲区中,然后再写入Flash里面。该函数会被OEMWriteFlash调用。dwImageStart为被写入的WinCE image在Flash中的起始地址,dwAddr为被写入的Bin文件的起始地址,返回值为映射后的RAM中的地址。
lyx_wq 2009-12-18
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 veabol 的回复:]
引用 6 楼 lyx_wq 的回复:
跳转之前确实有个WriteRegionsToBootMedia函数是
stores the image cached in RAM to the Boot Media
的,但我现在迷惑的是 下载的地址不对,怎么运行的问题,它没再从flash copy回来一遍啊!!
难道,当时俩个地址空间lpDest,dwRecAddr都有nk的存储????


前边我所说是没有错的,而nk.bin被解析成nk.nb0之后的地址也的确不是正常启动的地址,在解析之后通过WriteRawImageToBootMedia将这个地址上的数据写到FLASH里边,然后再调用ReadOSImageFromBootMedia读到RAM里边再跳转,你可以看下串口输出信息,这些过程应该都会有信息打印的。
WriteRawImageToBootMedia与ReadOSImageFromBootMedia的过程可能都在OEMLaunch里边,至少我的BSP是这样的。
[/Quote]
谢谢Veabol,明白了。结贴
博说医械研发 2009-12-18
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 lyx_wq 的回复:]
跳转之前确实有个WriteRegionsToBootMedia函数是
stores the image cached in RAM to the Boot Media
的,但我现在迷惑的是 下载的地址不对,怎么运行的问题,它没再从flash copy回来一遍啊!!
难道,当时俩个地址空间lpDest,dwRecAddr都有nk的存储????
[/Quote]

前边我所说是没有错的,而nk.bin被解析成nk.nb0之后的地址也的确不是正常启动的地址,在解析之后通过WriteRawImageToBootMedia将这个地址上的数据写到FLASH里边,然后再调用ReadOSImageFromBootMedia读到RAM里边再跳转,你可以看下串口输出信息,这些过程应该都会有信息打印的。
WriteRawImageToBootMedia与ReadOSImageFromBootMedia的过程可能都在OEMLaunch里边,至少我的BSP是这样的。
liuysheng 2009-12-18
  • 打赏
  • 举报
回复
lpDest = OEMMapMemAddr (dwImageStart, dwRecAddr);

OEMMapMemAddr 是:Corresponding address within a file cache area.
这个函数的返回类型:LPBYTE
dwRecAddr的类型
这个函数的功能,就是image的类型,将dwRecAddr修正后,返回(LPBYTE)dwAddr。。。

所以,lpDest 当然是dwAddr的值了,请看如下代码[OEMMapMemAddr(DWORD dwImageStart, DWORD dwAddr)的实现]:
if (g_ImageType & IMAGE_TYPE_STEPLDR)
{
dwAddr = (FILE_CACHE_START + (dwAddr - STEPLDR_RAM_IMAGE_BASE));
return (LPBYTE)dwAddr;
}
else
if (g_ImageType & IMAGE_TYPE_LOADER)
{
dwAddr = (FILE_CACHE_START + (dwAddr - EBOOT_RAM_IMAGE_BASE));
return (LPBYTE)dwAddr;
}
else
if (g_ImageType & IMAGE_TYPE_RAWBIN)
{
OALMSG(TRUE, (TEXT("OEMMapMemAddr 0x%x 0x%x\r\n"),dwAddr,(FILE_CACHE_START + dwAddr)));
dwAddr = FILE_CACHE_START + dwAddr;
return (LPBYTE)dwAddr;
}

return (LPBYTE)dwAddr;

19,502

社区成员

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

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