加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

wince系统运行中如何实现更新flash中的NK.BIN?持续探讨,欢迎关

发布时间:2020-12-15 18:45:51 所属栏目:百科 来源:网络整理
导读:总体思路是:底层驱动加应用层程序调用。驱动要完成的工作:接收应用层传递进来的要更新的NK.BIN在内存中的地址,长度信息,然后写flash,写完NK.BIN后还要写TOC信息,以便系统启动时加载整个镜像到内存。应用程序要完成的工作是:读取要更新的NK.BIN的内容

总体思路是:底层驱动加应用层程序调用。驱动要完成的工作:接收应用层传递进来的要更新的NK.BIN在内存中的地址,长度信息,然后写flash,写完NK.BIN后还要写TOC信息,以便系统启动时加载整个镜像到内存。应用程序要完成的工作是:读取要更新的NK.BIN的内容到内存,然后调用驱动的IOCTRL函数实现写flash,当写完后软件重启系统。

???? 由于是在系统运行状态下写flash,因此为了防止其他进程或线程同时调用同一个flash的读写函数,应该设置读写互斥锁,以保证并发访问不出错。由于我只要更新NK.BIN,之前的分区表都已经建立完成,也知道nk.bin是在flash中binfs分区里哪一块开始的位置,因此应该不用重新写MBR信息。http://www.voidcn.com/article/p-gdyujuyh-br.html? 这个帖子有大致介绍了如何实现,但上面并没有详细讲如何写TOC信息。因此,现在问题的焦点是如何获得NK.BIN文件中的TOC信息,然后写到TOC块里。由于系统启动时,要读取TOC信息,才能知道NK.BIN要加载到内存的起始地址,要加载多少个模块,以及各个模块的起始地址。还有个问题:应用程序是应该开辟一个NK.BIN大小的内存空间来先把NK.BIN都放到内存,然后把内存地址和长度告诉驱动,还是只能一块(128KB)一块地加载NK.BIN,然后告诉驱动一块一块地写flash呢?这两种方式哪个更合理?我觉得应该是后者。前者不合理之处:也许没有那么大(可能达到100MB)的连续内存空间,所以申请内存一般会失败。若是选择后者,则在应用程序里要先分析NK.BIN,读取NK.BIN中的TOC信息,然后告诉驱动,把TOC信息写到TOC块中。因为是一块一块地传递要写的镜像到驱动,驱动里没法再去分析和提取NK中的TOC信息。

???? 以上是我的拙见,欢迎各路高手能留言批评指正,以实现如题的目的。本博客持续更新中,欢迎关注。谢谢。2012-05-29。

?

http://topic.csdn.net/u/20120508/09/2b3f14c4-9d68-44dd-a269-6c927710e827.html?seed=572493010&r=78705844#r_78705844?这边是讨论区。

2012-05-30:

eboot目录下的WriteFlashNK函数里的:
// find download manifest information for the NK
??????? for(i = 0;i < g_pDownloadManifest->dwNumRegions;i++)
??????? {
??????????? if(g_pDownloadManifest->Region[i].dwRegionStart == dwStartAddr &&
??????????????? g_pDownloadManifest->Region[i].dwRegionLength == dwLength)
??????????? {
??????????????? if(g_pDownloadManifest->Region[i].szFileName[0] == 0)
??????????????? {
??????????????????? // If the DownloadManifest does not have a filename,use the default name
??????????????? }
??????????????? else
??????????????? {
??????????????????? memcpy(g_pTOC->id[TOC_ENTRY_NK].ucString,g_pDownloadManifest->Region[i].szFileName,MAX_PATH);
??????????????? }
??????????????? break;?
??????????? }
??????? }
这些是什么意思?我只升级NK.BIN是否可以不用管它呀?
然后写TOC,重点好像要写如下几个参数:
??????? g_pTOC->id[TOC_ENTRY_NK].dwLoadAddress????? = dwStartAddrOrg;
??????? g_pTOC->id[TOC_ENTRY_NK].dwJumpAddress????? = dwStartAddrOrg;?????????? // TODO
??????? g_pTOC->id[TOC_ENTRY_NK].dwStoreOffset????? = dwStoreOffset;
这三个参数从哪里获得?

2012-06-06:终于可以实现在线更新内核镜像了。出于保密需要不便贴出详细做法。

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读