CE5.0如何填充eboot.bin中的pTOC特殊指针.docVIP

CE5.0如何填充eboot.bin中的pTOC特殊指针.doc

  1. 1、本文档共7页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  5. 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  6. 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  7. 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  8. 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
CE5.0如何填充eboot.bin中的pTOC特殊指针.doc

CE5.0 -如何填充eboot.bin中的pTOC特殊指针eboot.bin和eboot.nb0的差别就是eboot.bin中没有填充pTOC结构体,必须使用parser解释器[类似于romimage.exe luther.gliethttp]将全局变量数据段解压释放到运行时使用的地址才行,eboot.nb0中经过romimage.exe填充了pTOC结构体,所以eboot.nb0可以自己将自己用到的全局量通过KernelRelocate()函数进行解压释放,这就是为什么eboot.nb0比eboot.bin的size大的原因. eboot.nb0是一个包含全局变量初始化pTOC结构体的文件,所以当eboot.nb0启动时就可以通过BootloaderMain()==KernelRelocate(pTOC)来实现eboot.nb0自己初始化自己定义的全局变量的工作,其实KernelRelocate就相当于ADS启动汇编中对如下四个section的操作: Image$$RO$$Limit Image$$RW$$Base Image$$ZI$$Base Image$$ZI$$Limit 但是我们在源程序中只能找到pTOC的定义ROMHDR?*?volatile?const?pTOC?=?(ROMHDR?*)-1;根本找不到对它进行赋值的任何操作,无论是.s汇编还是任何宏中,那pTOC又是从哪里得到了有效的数值的呢?这就是我们下面继续讨论的问题,一切疑惑都可以从romimage.exe中获得答案. romimage.exe源码位于WINCE500\PRIVATE\WINCEOS\COREOS\NK\TOOLS\ROMIMAGE\ROMIMAGE目录下, C:\WINCE500\PRIVATE\WINCEOS\COREOS\NK\TOOLS\ROMIMAGE\ROMIMAGE\module.cpp|118|?if(token?==?pTOC){ void?Module::check_special_symbol(string?token,?DWORD o32_section,?DWORD offset,?MemoryList?memory_list){ ????... ????if(is_kernel()){ ????????if(token?==?pTOC){ //我们在eboot源码PLATFORM\SMDK2440A\Src\Bootloader\Eboot_usb\blcommon.c中定义了该符号,如下: //ROMHDR * volatile const pTOC = (ROMHDR *)-1; // Gets replaced by RomLoader with real address //记录pTOC指针所在位置 ??????????m_TOC_offset?=?offset?+?m_load_offset;?// doesnt get load offset added, because only compared with rva later ??????????LAST_PASS_PRINT?printf(Found pTOC at %08x\n,?m_TOC_offset); ????????} ????????if(needs_signing()){ ??????????if(token?==?OEMIoControl) ????????????s_oem_io_control?=?offset?+?m_初始化c代码定义的非0值全局变量load_offset?-?page_size(); ????????} ????????... ????} ????... } bin.cpp|87|?kernel-write_TOC_ptr(romhdr_offset); bool?write_bin(AddressList?hole_list,?CopyList?copy_list, ????????????????ModuleList?module_list,?FileList?file_list, ????????????????MemoryList?memory_list,?MemoryList?reserve_list, ????????????????ModuleList::iterator?kernel,?Config?config,?MemoryList::iterator?xip_mem){ ????... ????// write toc into kernel ????if(xip_mem-is_kernel()??kernel-is_kernel()) ????????kerne

文档评论(0)

ziyouzizai + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档