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

来源:互联网 发布:调查问卷挣钱知乎 编辑:程序博客网 时间:2024/05/16 03:51

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

     由于是在系统运行状态下写flash,因此为了防止其他进程或线程同时调用同一个flash的读写函数,应该设置读写互斥锁,以保证并发访问不出错。由于我只要更新NK.BIN,之前的分区表都已经建立完成,也知道nk.bin是在flash中binfs分区里哪一块开始的位置,因此应该不用重新写MBR信息。http://blog.csdn.net/nanjianhui/article/details/2196466  这个帖子有大致介绍了如何实现,但上面并没有详细讲如何写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:终于可以实现在线更新内核镜像了。出于保密需要不便贴出详细做法。

原创粉丝点击