<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>liu090</title><link>http://blog.vckbase.com/liu090/</link><description /><managingEditor>liu090</managingEditor><dc:language>zh-CHS</dc:language><generator>.Text Version 0.958.2004.214</generator><item><dc:creator>liu090</dc:creator><title>关于c 实现　c++的多态性</title><link>http://blog.vckbase.com/liu090/archive/2008/09/10/34954.html</link><pubDate>Wed, 10 Sep 2008 15:05:00 GMT</pubDate><guid>http://blog.vckbase.com/liu090/archive/2008/09/10/34954.html</guid><wfw:comment>http://blog.vckbase.com/liu090/comments/34954.html</wfw:comment><comments>http://blog.vckbase.com/liu090/archive/2008/09/10/34954.html#Feedback</comments><slash:comments>5</slash:comments><wfw:commentRss>http://blog.vckbase.com/liu090/comments/commentRss/34954.html</wfw:commentRss><trackback:ping>http://blog.vckbase.com/liu090/services/trackbacks/34954.html</trackback:ping><description>&lt;P&gt;　今天论坛上有人在问,如何用c 实现c++的继承, 我告诉他是结构加指针实现,虽然表达简单,但的确需要这两样东西,&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 另外感觉继承主要好处就是实现多态性，那用c实现了多态性，估计也就用到了继承的优点&lt;BR&gt;　以前是在vc编程难点剖析一书里看到过用c实现多态性的的方法，说到这本书还是要表扬一下的，vc编程难点剖析这本书写得很不错的，那时在新风雨，打５折买的，看来好东西，不一定价高,那本书的源码很简单，如下：&lt;BR&gt;#include "stdio.h"&lt;BR&gt;#include "stdlib.h"&lt;/P&gt;
&lt;P&gt;//定义函数指针类型DISPLAYINTEGER，指向返回值为void，参数列表为(const int)的函数&lt;BR&gt;typedef&amp;nbsp; void( *DISPLAYINTEGER)(const int);&lt;/P&gt;
&lt;P&gt;//定义函数，将数字以十进制形式输出，该函数类型与DISPLAYINTEGER匹配&lt;BR&gt;void DisplayDecimal(const int Number)&lt;BR&gt;{&lt;BR&gt;&amp;nbsp;printf("The decimal value is %d\n",Number);&lt;BR&gt;}&lt;BR&gt;//定义函数，将数字以八进制形式输出，该函数类型与DISPLAYINTEGER匹配&lt;BR&gt;void DisplayOctal(const int Number)&lt;BR&gt;{&lt;BR&gt;&amp;nbsp;printf("The octal value is %o\n",Number);&lt;BR&gt;}&lt;BR&gt;//定义函数，将数字以十六进制形式输出，该函数类型与DISPLAYINTEGER匹配&lt;BR&gt;void DisplayHexadecimal (const int Number)&lt;BR&gt;{&lt;BR&gt;&amp;nbsp;printf("The hexadecimal value is %x\n",Number);&lt;BR&gt;}&lt;BR&gt;/********************************************************************&lt;BR&gt;定义通用的显示数字函数&lt;BR&gt;DisplayFormat&amp;nbsp; DISPLAYINTEGER函数指针类型，实参可以是以上定义的&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 三个函数之一。通过传递不同的实参，将数字以各种格式输出。&lt;BR&gt;Number&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 准备输出的数字&lt;BR&gt;********************************************************************/&lt;BR&gt;void DisplayNumber(DISPLAYINTEGER&amp;nbsp; DisplayFormat,const int Number)&lt;BR&gt;{&lt;BR&gt;&amp;nbsp;&amp;nbsp;//调用以实参传入的函数，以某种格式输出整型数字&lt;BR&gt;&amp;nbsp;DisplayFormat(Number);&lt;BR&gt;}&lt;/P&gt;
&lt;P&gt;int main(int argc, char* argv[])&lt;BR&gt;{&lt;BR&gt;&amp;nbsp;int Number=0;&lt;/P&gt;
&lt;P&gt;// 如果有数字形式的命令行参数，将其输出，否则输出0&lt;BR&gt;&amp;nbsp;&amp;nbsp; if(argc&amp;gt;1)&amp;nbsp;&amp;nbsp;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Number=atoi(argv[1]);&lt;BR&gt;&amp;nbsp;&amp;nbsp; //分别以三种格式将数字输出&lt;BR&gt;&amp;nbsp;DisplayNumber(DisplayDecimal,Number);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; DisplayNumber(DisplayOctal,Number);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; DisplayNumber(DisplayHexadecimal,Number);&lt;/P&gt;
&lt;P&gt;&amp;nbsp;return 0;&lt;BR&gt;}&lt;BR&gt;看起来通俗易懂，不过没有继承 的感觉&lt;BR&gt;&lt;BR&gt;以前还在其他地方看到过类似c 实现继承的代码&lt;BR&gt;下午我就简化了一段代码,并且编译执行了下，来实现c 的所谓继承，代码如下：&lt;BR&gt;1.parent.h&lt;BR&gt;#ifndef PARENT_H&lt;BR&gt;#define PARENT_H&lt;/P&gt;
&lt;P&gt;#include "child1.h"&lt;BR&gt;#include "child2.h"&lt;/P&gt;
&lt;P&gt;&lt;BR&gt;struct parent_type{&lt;BR&gt;&amp;nbsp;&amp;nbsp; unsigned int id;&lt;BR&gt;&amp;nbsp;&amp;nbsp; //char classname[20];&lt;BR&gt;&amp;nbsp;&amp;nbsp; char * name;&lt;BR&gt;&amp;nbsp;&amp;nbsp; struct{&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; struct parent_handle * (*init)(void * pvoid);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; int (*fp1)(struct parent_handle *ph); &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; //...&lt;BR&gt;&amp;nbsp;&amp;nbsp; }pfn;&lt;BR&gt;&amp;nbsp;&amp;nbsp; struct parent_type *next;&lt;BR&gt;};&lt;/P&gt;
&lt;P&gt;&lt;BR&gt;struct parent_handle{&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; int i;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; union{&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; struct child1_handle child_hdl1;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; struct child2_handle child_hdl2;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; //...&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }priv;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; struct parent_type *ptp;&lt;BR&gt;};&lt;BR&gt;&lt;BR&gt;2.parent.h&lt;BR&gt;&lt;BR&gt;#include "stdafx.h"&lt;/P&gt;
&lt;P&gt;#include "parent.h"&lt;/P&gt;
&lt;P&gt;static struct parent_type *class_list;&lt;/P&gt;
&lt;P&gt;int register_child(struct parent_type *p)&lt;BR&gt;{&lt;BR&gt;&amp;nbsp;p-&amp;gt;next = class_list;&lt;BR&gt;&amp;nbsp;class_list = p;&lt;BR&gt;&amp;nbsp;return 0;&lt;BR&gt;}&lt;/P&gt;
&lt;P&gt;struct parent_handle * parent_init(void * pchild_priv, unsigned int id)&lt;BR&gt;{&lt;BR&gt;&amp;nbsp;struct parent_type *p;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;for (p = class_list; p; p = p-&amp;gt;next)&lt;BR&gt;&amp;nbsp;&amp;nbsp;if (p-&amp;gt;id == id)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;return p-&amp;gt;pfn.init(pchild_priv);&lt;/P&gt;
&lt;P&gt;&amp;nbsp;printf("unable to find matching child class\n");&lt;BR&gt;&amp;nbsp;return NULL;&lt;BR&gt;}&lt;/P&gt;
&lt;P&gt;int parent_fp1(struct parent_handle *ph)&lt;BR&gt;{&lt;BR&gt;&amp;nbsp;if (!ph-&amp;gt;ptp-&amp;gt;pfn.fp1)&lt;BR&gt;&amp;nbsp;&amp;nbsp;return 0;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;return ph-&amp;gt;ptp-&amp;gt;pfn.fp1(ph);&lt;BR&gt;}&lt;BR&gt;&lt;/P&gt;
&lt;P&gt;&lt;BR&gt;int register_child(struct parent_type *p);&lt;/P&gt;
&lt;P&gt;struct parent_handle * parent_init(void * pchild_priv, unsigned int id);&lt;/P&gt;
&lt;P&gt;int parent_fp1(struct parent_handle *ph);&lt;/P&gt;
&lt;P&gt;&lt;BR&gt;#endif &lt;BR&gt;&lt;BR&gt;3. child1.h&lt;BR&gt;#ifndef CHILD1_H&lt;BR&gt;#define CHILD1_H&lt;/P&gt;
&lt;P&gt;#define CHILD_1_ID 101&lt;/P&gt;
&lt;P&gt;struct child1_handle&lt;BR&gt;{&lt;BR&gt;&amp;nbsp; char child1_decr[20];&lt;BR&gt;&amp;nbsp; int&amp;nbsp; child1_data;&lt;BR&gt;&amp;nbsp; //...&lt;BR&gt;};&lt;/P&gt;
&lt;P&gt;extern struct parent_type child_tp1;&lt;/P&gt;
&lt;P&gt;struct parent_handle * child1_init(void * pvoid);&lt;BR&gt;int child1_fp1(struct parent_handle *ph);&lt;/P&gt;
&lt;P&gt;#endif&lt;BR&gt;&lt;BR&gt;4.child1.c&lt;BR&gt;#include "stdafx.h"&lt;/P&gt;
&lt;P&gt;#include "parent.h"&lt;BR&gt;#include "child1.h"&lt;/P&gt;
&lt;P&gt;&lt;BR&gt;struct parent_type child_tp1= {CHILD_1_ID,"class child1",{&amp;amp;child1_init,&amp;amp;child1_fp1},0};&lt;BR&gt;/*&lt;BR&gt;struct parent_type&amp;nbsp; child1= {&lt;BR&gt;&amp;nbsp;.id&amp;nbsp;= CHILD_1_ID,&lt;BR&gt;&amp;nbsp;.name &amp;nbsp;= "class child1",&lt;BR&gt;&amp;nbsp;.fn&amp;nbsp;= {&lt;BR&gt;&amp;nbsp;&amp;nbsp;.init &amp;nbsp;&amp;nbsp;= &amp;amp;child1_init,&lt;BR&gt;&amp;nbsp;&amp;nbsp;.fp1 &amp;nbsp;&amp;nbsp;= &amp;amp;child1_fp1,&lt;BR&gt;&amp;nbsp;},&lt;BR&gt;};&lt;BR&gt;*/&lt;/P&gt;
&lt;P&gt;&lt;BR&gt;struct parent_handle * child1_init(void * pvoid)&lt;BR&gt;{&lt;BR&gt;&amp;nbsp;//int ret;&lt;BR&gt;&amp;nbsp;struct child1_handle *h;&lt;BR&gt;&amp;nbsp;struct parent_handle *ph = (struct parent_handle *)malloc(sizeof(struct parent_handle/* *h */));&lt;BR&gt;&amp;nbsp;if (!ph)&lt;BR&gt;&amp;nbsp;&amp;nbsp;return NULL;&lt;BR&gt;&amp;nbsp;ph-&amp;gt;ptp = &amp;amp;child_tp1;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; //todo&lt;BR&gt;&amp;nbsp; h = &amp;amp;ph-&amp;gt;priv.child_hdl1;&lt;BR&gt;&amp;nbsp; strcpy(h-&amp;gt;child1_decr,"hello child1!");&lt;BR&gt;&amp;nbsp; h-&amp;gt;child1_data=*((int*)(pvoid));&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; //...&lt;BR&gt;&amp;nbsp;return ph;&lt;BR&gt;}&lt;/P&gt;
&lt;P&gt;&lt;BR&gt;int child1_fp1(struct parent_handle *ph)&lt;BR&gt;{&lt;BR&gt;&amp;nbsp; struct child1_handle *h = &amp;amp;ph-&amp;gt;priv.child_hdl1;&lt;BR&gt;&amp;nbsp; //todo&lt;BR&gt;&amp;nbsp; printf("%s,data=%d\r\n",h-&amp;gt;child1_decr,h-&amp;gt;child1_data);&lt;BR&gt;&amp;nbsp; //...&lt;/P&gt;
&lt;P&gt;&amp;nbsp; return 0;&lt;BR&gt;}&lt;BR&gt;&lt;BR&gt;5.child2.h&lt;/P&gt;
&lt;P&gt;#ifndef CHILD2_H&lt;BR&gt;#define CHILD2_H&lt;/P&gt;
&lt;P&gt;&lt;BR&gt;#define CHILD_2_ID 102&lt;/P&gt;
&lt;P&gt;struct child2_handle&lt;BR&gt;{&lt;BR&gt;&amp;nbsp; int&amp;nbsp; child2_data;&lt;BR&gt;&amp;nbsp; char child2_decr[20];&lt;BR&gt;&amp;nbsp; //...&lt;BR&gt;};&lt;/P&gt;
&lt;P&gt;extern struct parent_type child_tp2;&lt;/P&gt;
&lt;P&gt;int child2_fp1(struct parent_handle *ph);&lt;BR&gt;struct parent_handle * child2_init(void * pvoid);&lt;/P&gt;
&lt;P&gt;#endif&lt;BR&gt;&lt;BR&gt;6.child2.c&lt;BR&gt;#include "stdafx.h"&lt;/P&gt;
&lt;P&gt;#include "parent.h"&lt;BR&gt;#include "child2.h"&lt;/P&gt;
&lt;P&gt;&lt;BR&gt;struct parent_type child_tp2= {CHILD_2_ID,"class child2",{&amp;amp;child2_init,&amp;amp;child2_fp1},0};&lt;BR&gt;/*&lt;BR&gt;struct parent_type&amp;nbsp; child1= {&lt;BR&gt;&amp;nbsp;.id&amp;nbsp;= CHILD_1_ID,&lt;BR&gt;&amp;nbsp;.name &amp;nbsp;= "class child1",&lt;BR&gt;&amp;nbsp;.fn&amp;nbsp;= {&lt;BR&gt;&amp;nbsp;&amp;nbsp;.init &amp;nbsp;&amp;nbsp;= &amp;amp;child1_init,&lt;BR&gt;&amp;nbsp;&amp;nbsp;.fp1 &amp;nbsp;&amp;nbsp;= &amp;amp;child1_fp1,&lt;BR&gt;&amp;nbsp;},&lt;BR&gt;};&lt;BR&gt;*/&lt;/P&gt;
&lt;P&gt;&lt;BR&gt;struct parent_handle * child2_init(void * pvoid)&lt;BR&gt;{&lt;BR&gt;&amp;nbsp;//int ret;&lt;BR&gt;&amp;nbsp;struct child2_handle *h;&lt;BR&gt;&amp;nbsp;struct parent_handle *ph = (struct parent_handle *)malloc(sizeof(struct parent_handle/* *h */));&amp;nbsp; //别忘了自己加deinit 把它释放&lt;BR&gt;&amp;nbsp;if (!ph)&lt;BR&gt;&amp;nbsp;&amp;nbsp;return NULL;&lt;BR&gt;&amp;nbsp;ph-&amp;gt;ptp = &amp;amp;child_tp2;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; //todo&lt;BR&gt;&amp;nbsp; h = &amp;amp;ph-&amp;gt;priv.child_hdl2;&lt;BR&gt;&amp;nbsp; strcpy(h-&amp;gt;child2_decr,"hello child2!");&lt;BR&gt;&amp;nbsp; h-&amp;gt;child2_data=*((int*)(pvoid));&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; //...&lt;BR&gt;&amp;nbsp;return ph;&lt;BR&gt;}&lt;/P&gt;
&lt;P&gt;&lt;BR&gt;int child2_fp1(struct parent_handle *ph)&lt;BR&gt;{&lt;BR&gt;&amp;nbsp; struct child2_handle *h = &amp;amp;ph-&amp;gt;priv.child_hdl2;&lt;/P&gt;
&lt;P&gt;&amp;nbsp; //todo&lt;BR&gt;&amp;nbsp; printf("%s,data=%d\r\n",h-&amp;gt;child2_decr,h-&amp;gt;child2_data);&lt;BR&gt;&amp;nbsp; //...&lt;/P&gt;
&lt;P&gt;&amp;nbsp; return 0;&lt;BR&gt;}&lt;/P&gt;
&lt;P&gt;最后是main.c&lt;BR&gt;&lt;/P&gt;
&lt;P&gt;// testClass.cpp : Defines the entry point for the console application.&lt;BR&gt;//&lt;/P&gt;
&lt;P&gt;#include "stdafx.h"&lt;/P&gt;
&lt;P&gt;#include "parent.h"&lt;BR&gt;#include "child1.h"&lt;BR&gt;#include "child2.h"&lt;/P&gt;
&lt;P&gt;static struct parent_handle *pchild_1_h,*pchild_2_h;&lt;/P&gt;
&lt;P&gt;int main(int argc, char* argv[])&lt;BR&gt;{&lt;BR&gt;&amp;nbsp;//printf("Hello World!\n");&lt;BR&gt;&amp;nbsp;&amp;nbsp; int child1_priv=123;&lt;BR&gt;&amp;nbsp;&amp;nbsp; int child2_priv=456;&lt;BR&gt;&amp;nbsp;&amp;nbsp; register_child(&amp;amp;child_tp1);&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; //注册子类1&lt;BR&gt;&amp;nbsp;&amp;nbsp; pchild_1_h = parent_init((void *)(&amp;amp;child1_priv),CHILD_1_ID);&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; //初始化子类1&lt;BR&gt;&amp;nbsp;&amp;nbsp; if(pchild_1_h)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; parent_fp1(pchild_1_h);&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; //执行子类1的fp1函数&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp; register_child(&amp;amp;child_tp2);&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; //注册子类2&lt;BR&gt;&amp;nbsp;&amp;nbsp; pchild_2_h = parent_init((void *)(&amp;amp;child2_priv),CHILD_2_ID);&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; //初始化子类2&lt;BR&gt;&amp;nbsp;&amp;nbsp; parent_fp1(pchild_2_h);&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; //执行子类2的fp1函数&lt;BR&gt;&amp;nbsp;return 0;&lt;BR&gt;}&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;/*&lt;BR&gt;用c++实现很简单&lt;BR&gt;class parent&lt;BR&gt;{&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; virturl int fp1 (); &lt;BR&gt;}&lt;/P&gt;
&lt;P&gt;&amp;nbsp;class child1 :public parent&lt;BR&gt;&amp;nbsp;{&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; char child1_decr[20];&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; int&amp;nbsp; child1_data;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; int fp1 (); &lt;/P&gt;
&lt;P&gt;&amp;nbsp;}&lt;/P&gt;
&lt;P&gt;&amp;nbsp;class child2 :public parent&lt;BR&gt;&amp;nbsp;{&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; char child2_decr[20];&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; int&amp;nbsp; child2_data;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; int fp1 (); &lt;/P&gt;
&lt;P&gt;&amp;nbsp;}&lt;/P&gt;
&lt;P&gt;&lt;BR&gt;&amp;nbsp; parent * pa;&lt;BR&gt;&amp;nbsp; child1 ch1b;&lt;BR&gt;&amp;nbsp;&amp;nbsp; &lt;BR&gt;&amp;nbsp;&amp;nbsp; pa= ch1b;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp; pa-&amp;gt;fp1;&lt;/P&gt;
&lt;P&gt;＊/&lt;BR&gt;&lt;BR&gt;用c实现一些类似c＋＋的功能还是有好处的，一方面多重继承开销大,而且在底层编程，c 用得比较多，所以总结了下，以后可能有点用&lt;BR&gt;&lt;/P&gt;&lt;img src ="http://blog.vckbase.com/liu090/aggbug/34954.html" width = "1" height = "1" /&gt;</description></item><item><dc:creator>liu090</dc:creator><title>根据extid 获得nandflash 的一些属性</title><link>http://blog.vckbase.com/liu090/archive/2008/08/06/34597.html</link><pubDate>Wed, 06 Aug 2008 05:34:00 GMT</pubDate><guid>http://blog.vckbase.com/liu090/archive/2008/08/06/34597.html</guid><wfw:comment>http://blog.vckbase.com/liu090/comments/34597.html</wfw:comment><comments>http://blog.vckbase.com/liu090/archive/2008/08/06/34597.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://blog.vckbase.com/liu090/comments/commentRss/34597.html</wfw:commentRss><trackback:ping>http://blog.vckbase.com/liu090/services/trackbacks/34597.html</trackback:ping><description>&lt;P&gt;2.6.14 内核MTD 中关于获得nand flash 的一些属性的方法:&lt;BR&gt;&lt;BR&gt;设置READID 命令后开始读ID &lt;BR&gt;1.读ID 第1byte &lt;BR&gt;&amp;nbsp;maker_id = =read_byte;&lt;BR&gt;2.读ID 第2byte &lt;BR&gt;&amp;nbsp; device_id =read_byte;&lt;BR&gt;3.读ID 第3byte &lt;BR&gt;&amp;nbsp; cellinfo = read_byte;&lt;BR&gt;4.读ID 第4byte&lt;BR&gt;&amp;nbsp; extid = read_byte;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;根据该扩展id可计算&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 1.page 大小:&lt;BR&gt;&amp;nbsp;page_size = 1024 &amp;lt;&amp;lt; (extid &amp;amp; 0x3);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 2. spare 大小:&amp;nbsp;&lt;BR&gt;&amp;nbsp;extid &amp;gt;&amp;gt;= 2;&lt;BR&gt;&amp;nbsp;spare_size = (8 &amp;lt;&amp;lt; (extid &amp;amp; 0x01)) * (page_size&amp;nbsp; &amp;gt;&amp;gt; 9);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 3. block 大小:&amp;nbsp;&lt;BR&gt;&amp;nbsp;extid &amp;gt;&amp;gt;= 2;&lt;BR&gt;&amp;nbsp;block_size = (64 * 1024) &amp;lt;&amp;lt; (extid &amp;amp; 0x03);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 4.bus width:&lt;BR&gt;&amp;nbsp;extid &amp;gt;&amp;gt;= 2;&lt;BR&gt;&amp;nbsp;bus width = (extid &amp;amp; 0x01) ? 16bit: 8bit;&lt;/P&gt;&lt;img src ="http://blog.vckbase.com/liu090/aggbug/34597.html" width = "1" height = "1" /&gt;</description></item><item><dc:creator>liu090</dc:creator><title>在cygwin下调试uboot-1.1.6 碰到的问题</title><link>http://blog.vckbase.com/liu090/archive/2007/12/18/31375.html</link><pubDate>Tue, 18 Dec 2007 11:35:00 GMT</pubDate><guid>http://blog.vckbase.com/liu090/archive/2007/12/18/31375.html</guid><wfw:comment>http://blog.vckbase.com/liu090/comments/31375.html</wfw:comment><comments>http://blog.vckbase.com/liu090/archive/2007/12/18/31375.html#Feedback</comments><slash:comments>10</slash:comments><wfw:commentRss>http://blog.vckbase.com/liu090/comments/commentRss/31375.html</wfw:commentRss><trackback:ping>http://blog.vckbase.com/liu090/services/trackbacks/31375.html</trackback:ping><description>&lt;P&gt;为了方便,使用cygwin环境进行交叉编译uboot,所以又要做tool chain，搞了个ezx cross tool 的东西，来做.&lt;BR&gt;因为网上有人说uboot.1.1.6用2.95的tool chain好象不行，就决定用3.3.6的tool chain,开始挺顺利的，大概&lt;BR&gt;４－５小时编译后,居然没报什么错误，生成了3.3.6的arm tool chain,&lt;BR&gt;&lt;BR&gt;然后开始用tool chain 编译改好的uboot,到ld时报错：&lt;BR&gt;libgcc.a(udivdi3.oS) uses VFP instructions ,where as uboot does not 的错误&lt;BR&gt;&lt;BR&gt;网上查了下,有位兄弟报的use hard fpa instrucitons ,where as&amp;nbsp; uboot does not &lt;BR&gt;&lt;BR&gt;跟我差不多， 但有区别,他的是libgcc 的浮点库是使用hard fpa,而uboot不支持&lt;BR&gt;我的是libgcc 的浮点库是使用&amp;nbsp;vfp,而uboot不支持,&lt;BR&gt;其实uboot cpu/arm920t/config.mk中　定义的是msoft-fpa　就是说只支持软件浮点的&lt;BR&gt;我看了ezx cross tool 下面关于浮点的设置文件arm-ezx.dat里面&lt;BR&gt;GCC_EXTRA_CONFIG="--with-cpu=arm9tdmi --enable-cxx-flags=-mcpu=arm9tdmi --with-float=soft"&lt;BR&gt;GLIBC_EXTRA_CONFIG="--without-fp"&lt;BR&gt;的确是设置了soft fpa的选择，那为什么还会使用vfp，比较郁闷&lt;BR&gt;&lt;BR&gt;后来查了gcc 的patch 文件,里面有部分关于VFP的patch&lt;BR&gt;难道是patch 打错了，于是我就不对gcc 打patch ,&lt;BR&gt;然后进行编译，哎又是４个多小时，其实前面没方向时已经又build 了好几次，一天也就能试验&lt;BR&gt;两三次，这次编译好后，用来进行uboot 编译，居然报use hard fpa instrucitons ,where as&amp;nbsp; uboot does not&lt;BR&gt;跟网上 那位兄弟一样的错误，不知道那位兄弟后来搞定了没有，可能他用的tool chain 的gcc是没打&lt;BR&gt;fpu 的patch 引起的，对这样情况，网上到是有解决方法，就是把cpu/arm920t/config.mk中msoft-fpa的flag去掉，我试验了下也可以，但是我觉得这样不太好，&lt;BR&gt;于是我有把gcc 3.3.6的patch 拿出来又看了下，我把有vfp相关的path 部分都换成soft-fpa ,&lt;BR&gt;然后不说也知道，又是４个多小时，终于好了，这已经离第一发生该错误，有两天多时间了，这两天基本没做什么,就和tool chain 搅上了，与是用它来build uboot 1.1.6,这次终于成功了&lt;BR&gt;&lt;BR&gt;把成功的经验贴出大家共享下，希望大家在搞embed linux 第１步，做交叉编译工具时，能顺利点，&lt;BR&gt;另外如果，有linux 的环境，就用别人已经做好的tool chain,这样问题会少一点，&lt;BR&gt;共享一个，比较新的arm tool chain 的网站：&lt;BR&gt;&lt;A href="http://www.freaknet.org/martin/crosstool/packages/"&gt;http://www.freaknet.org/martin/crosstool/packages/&lt;/A&gt;&lt;BR&gt;&lt;BR&gt;&lt;BR&gt;另外如果有什么更好的解决该问题的方法，请告诉我，谢谢&lt;/P&gt;&lt;img src ="http://blog.vckbase.com/liu090/aggbug/31375.html" width = "1" height = "1" /&gt;</description></item><item><dc:creator>liu090</dc:creator><title>xip 的 bin 文件分析</title><link>http://blog.vckbase.com/liu090/archive/2007/07/05/27230.html</link><pubDate>Thu, 05 Jul 2007 14:36:00 GMT</pubDate><guid>http://blog.vckbase.com/liu090/archive/2007/07/05/27230.html</guid><wfw:comment>http://blog.vckbase.com/liu090/comments/27230.html</wfw:comment><comments>http://blog.vckbase.com/liu090/archive/2007/07/05/27230.html#Feedback</comments><slash:comments>3</slash:comments><wfw:commentRss>http://blog.vckbase.com/liu090/comments/commentRss/27230.html</wfw:commentRss><trackback:ping>http://blog.vckbase.com/liu090/services/trackbacks/27230.html</trackback:ping><description>&lt;P&gt;xip 的 bin 文件分析&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;BR&gt;&amp;nbsp;&lt;BR&gt;&amp;nbsp;一个bin 文件在存储上是按下面的结构存储的&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 组成：标记(7)+Image开始地址(1)+Image长度(1)&amp;nbsp; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 记录0地址+记录0长+记录0校验和+记录0内容(文件内容)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 记录1地址+记录1长+记录1校验和+记录1内容(文件内容)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ......&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 最后一条记录是表示结束,Start = 0x00000000, Length = 0x8C072C3C是StartUp地址, Chksum = 0x00000000&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; bin 文件的头部(不包括记录)可以用下面的结构表示&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; struct BinFile{ &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; BYTE signature[7]; // = { ''B'', ''0'', ''0'', ''0'', ''F'', ''F'', ''\a'' } &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; DWORD ImageStart &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; DWORD ImageLength &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }; &lt;/P&gt;
&lt;P&gt;&lt;BR&gt;一般xipkernel.bin,nk.bin 都符合正常bin文件格式,包含记录开始0,1,2 记录为特殊记录,2做为cece的标记,其后4byte表示 TOC地址(指向ROMHDR结构的数据),3记录开始都是文件记录,&lt;BR&gt;&amp;nbsp; 比如coredll.dll等等。。。&lt;/P&gt;
&lt;P&gt;//---------------------------------------------------------------------------------------------------------------------------------------------------------------&lt;BR&gt;&amp;nbsp; 比如nk.bin 文件的viewbin 查看的内容:&lt;BR&gt;//---------------------------------------------------------------------------------------------------------------------------------------------------------------&lt;BR&gt;&amp;nbsp; ViewBin... nk.bin &lt;BR&gt;Image Start = 0x8C201000, length = 0x00DE9910&lt;BR&gt;Record [&amp;nbsp; 0] : Start = 0x8C201000, Length = 0x00000040, Chksum = 0x00001A63&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; //-&amp;gt;注意这里就是对应到结构struct Record{DWORD recaddress; DWORD reclength; DWORD chksum;void * recdata}的内容&lt;BR&gt;&amp;nbsp;0x8C201000 : 4083F601 8096F601 3C18F801 64D7F901 @.......&amp;lt;...d... &lt;BR&gt;&amp;nbsp;0x8C201010 : D025F701 0C85F601 6C26F701 C488F901 .%......l&amp;amp;...... &lt;BR&gt;&amp;nbsp;0x8C201020 : 10B6F601 0C85F601 5830F601 E086F901 ........X0...... &lt;BR&gt;&amp;nbsp;0x8C201030 : 2074F601 67776573 2E657865 00000000&amp;nbsp; t..gwes.exe.... &lt;/P&gt;
&lt;P&gt;&amp;nbsp;Chksum valid&lt;BR&gt;Record [&amp;nbsp; 1] : Start = 0x8C201040, Length = 0x00000008, Chksum = 0x0000032D&lt;BR&gt;&amp;nbsp;0x8C201040 : 45434543 048FFE8C&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ECEC....&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; //这里ECEC是我们设置的#define ROM_SIGNATURE 0x43454345 (Romldr.h),后面4byte就是pToc的内容&lt;/P&gt;
&lt;P&gt;&amp;nbsp;Chksum valid&lt;BR&gt;Record [&amp;nbsp; 2] : Start = 0x8C201048, Length = 0x00000004, Chksum = 0x00000161&lt;BR&gt;&amp;nbsp;0x8C201048 : 047FDE00&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ....&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/P&gt;
&lt;P&gt;&amp;nbsp;Chksum valid&lt;BR&gt;Record [&amp;nbsp; 3] : Start = 0x8C202000, Length = 0x000A37BC, Chksum = 0x043BF7FA&lt;BR&gt;&amp;nbsp;0x8C202000 : 00000000 03407546 00000000 02000000 &lt;A href="mailto:.....@uF"&gt;.....@uF&lt;/A&gt;........ &lt;BR&gt;&amp;nbsp;0x8C202010 : 78000000 D8530000 D8470000 20100100 x....S...G.. ... &lt;BR&gt;&amp;nbsp;0x8C202020 : 53005900 53005400 45004D00 2F004700 S.Y.S.T.E.M./.G. &lt;/P&gt;
&lt;P&gt;&amp;nbsp;。。。。。。&lt;/P&gt;
&lt;P&gt;&amp;nbsp; Chksum valid&lt;BR&gt;Record [131] : Start = 0x00000000, Length = 0x00000000, Chksum = 0x00000000&lt;BR&gt;&amp;nbsp;&amp;nbsp;Start address = 0x00000000&lt;BR&gt;Checking record #129 for potential TOC (ROMOFFSET = 0x00000000)&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;BR&gt;Found pTOC&amp;nbsp; = 0x8cfe8f04&lt;BR&gt;ROMOFFSET = 0x00000000&lt;/P&gt;
&lt;P&gt;&lt;BR&gt;//---------------------------------------------------------------------------------------------------------------------------------------------------------------&lt;BR&gt;&amp;nbsp;xipkernel.bin viewbin 的内容：&lt;BR&gt;//---------------------------------------------------------------------------------------------------------------------------------------------------------------&lt;BR&gt;&amp;nbsp;ViewBin... xipkernel.bin &lt;BR&gt;Image Start = 0x8C000000, length = 0x001BCE90&lt;BR&gt;Record [&amp;nbsp; 0] : Start = 0x8C000000, Length = 0x00000004, Chksum = 0x000001C3&lt;BR&gt;&amp;nbsp;0x8C000000 : 0DCB01EA&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ....&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/P&gt;
&lt;P&gt;&amp;nbsp;Chksum valid&lt;BR&gt;Record [&amp;nbsp; 1] : Start = 0x8C000040, Length = 0x00000008, Chksum = 0x00000327&lt;BR&gt;&amp;nbsp;0x8C000040 : 45434543 A0DA118C&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ECEC....&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; //注意这里的A0DA118C 就是8C11DAF4&amp;nbsp; 指向record9 就是pToc的值&lt;/P&gt;
&lt;P&gt;&amp;nbsp;Chksum valid&lt;BR&gt;Record [&amp;nbsp; 2] : Start = 0x8C000048, Length = 0x00000004, Chksum = 0x0000018B&lt;BR&gt;&amp;nbsp;0x8C000048 : A0DA1100&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ....&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/P&gt;
&lt;P&gt;&amp;nbsp;Chksum valid&lt;BR&gt;Record [&amp;nbsp; 3] : Start = 0x8C001000, Length = 0x000C5180, Chksum = 0x064E2C03&lt;BR&gt;&amp;nbsp;0x8C001000 : 00000000 96F37746 00000000 02000000 ......wF........ &lt;BR&gt;&amp;nbsp;0x8C001010 : 55000000 DC2B0700 DC1F0700 41504953 U....+......APIS &lt;BR&gt;&amp;nbsp;0x8C001020 : 02060500 3010008C 00000000 00000000 ....0........... &lt;BR&gt;&amp;nbsp;0x8C001030 : B05A078C 7CA3078C 505B078C 0C5D078C .Z..|...P[...].. &lt;BR&gt;&amp;nbsp;0x8C001040 : 745D078C 00000000 08000000 41005200 t]..........A.R. &lt;BR&gt;&amp;nbsp;。。。。。。&lt;BR&gt;&amp;nbsp;0x8C072C30 : 00000000 73746172 740A0D00 060000EA ....start.......&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; //###################&lt;BR&gt;&amp;nbsp;0x8C072C40 : FDFFFFEA FCFFFFEA FBFFFFEA FAFFFFEA ................ &lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;BR&gt;&amp;nbsp;。。。。。。&lt;/P&gt;
&lt;P&gt;&amp;nbsp;Chksum valid&lt;BR&gt;Record [&amp;nbsp; 9] : Start = 0x8C11DAA0, Length = 0x00000054, Chksum = 0x00000CB3&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; //就是上面的pToc所指块,是一个ROMHDR结构&lt;BR&gt;&amp;nbsp;0x8C11DAA0 : FF01F501 00000002 0000008C 90CE1B8C ................ &lt;BR&gt;&amp;nbsp;0x8C11DAB0 : 08000000 0010208C 0000278C 00E0E68F ...... ...'..... &lt;BR&gt;&amp;nbsp;0x8C11DAC0 : 01000000 F0FF1A8C 00000000 00000000 ................ &lt;BR&gt;&amp;nbsp;0x8C11DAD0 : 05000000 00000000 10101010 00000000 ................ &lt;BR&gt;&amp;nbsp;0x8C11DAE0 : 00000000 C2010200 1022008C 00000000 ........."...... &lt;BR&gt;&amp;nbsp;0x8C11DAF0 : 00000000&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ....&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/P&gt;
&lt;P&gt;&amp;nbsp;Chksum valid&lt;BR&gt;Record [ 10] : Start = 0x8C11DAF4, Length = 0x0000018C, Chksum = 0x0000895E&lt;BR&gt;&amp;nbsp;0x8C11DAF4 : 07000000 005C33FC 84B2C701 00BE0C00 .....\3......... &lt;BR&gt;&amp;nbsp;0x8C11DB04 : D4BF118C CCDE0F8C 3CDF0F8C 0000008C ........&amp;lt;....... &lt;BR&gt;&amp;nbsp;0x8C11DB14 : 07000000 00A1CC46 EAB0C701 00600300 .......F.....`.. &lt;BR&gt;&amp;nbsp;0x8C11DB24 : DCBF118C 6CFD1A8C 9CDF0F8C 00F0128C ....l........... &lt;BR&gt;&amp;nbsp;0x8C11DB34 : 07100000 0052626B C5B0C701 00380100 .....Rbk.....8.. &lt;BR&gt;&amp;nbsp;0x8C11DB44 : E8BF118C DCFD1A8C 4CFE1A8C 0020178C ........L.... .. &lt;/P&gt;
&lt;P&gt;。。。。。。&lt;/P&gt;
&lt;P&gt;&amp;nbsp;Chksum valid&lt;BR&gt;Record [ 14] : Start = 0x00000000, Length = 0x8C072C3C, Chksum = 0x00000000&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; //这就是xipkernel.bin的最后一条记录其内容表示0x8C072C3C 是startup 的入口地址 //################### 那行就是&lt;BR&gt;&amp;nbsp;&amp;nbsp;Start address = 0x8C072C3C&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; //060000EA=&amp;gt;EA000060&amp;nbsp; 的一条跳转指令 (1110[cond always] +1010[branch]+offset)&lt;BR&gt;Checking record #9 for potential TOC (ROMOFFSET = 0x00000000)&lt;BR&gt;Found pTOC&amp;nbsp; = 0x8c11daa0&lt;BR&gt;ROMOFFSET = 0x00000000&lt;BR&gt;Done.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;//---------------------------------------------------------------------------------------------------------------------------------------------------------------&lt;BR&gt;&amp;nbsp;xip.bin viewbin 的内容： 是上面两个bin的结合&lt;BR&gt;//---------------------------------------------------------------------------------------------------------------------------------------------------------------&lt;BR&gt;ViewBin... xip.bin &lt;BR&gt;Image Start = 0x8C000000, length = 0x00FEA910&lt;BR&gt;&amp;nbsp;&amp;nbsp; Start address = 0x8C072C3C&lt;BR&gt;Checking record #9 for potential TOC (ROMOFFSET = 0x00000000)&lt;BR&gt;Found pTOC&amp;nbsp; = 0x8c11daa0&lt;BR&gt;ROMOFFSET = 0x00000000&lt;/P&gt;
&lt;P&gt;Checking record #9 for potential TOC (ROMOFFSET = 0xFF134B9C)&amp;nbsp;&amp;nbsp; //-》FF134B9C-》ECB464 =14m多？？？？？？&lt;BR&gt;Checking record #144 for potential TOC (ROMOFFSET = 0x00000000)&lt;BR&gt;Found pTOC&amp;nbsp; = 0x8cfe8f04&lt;BR&gt;ROMOFFSET = 0x00000000&lt;/P&gt;
&lt;P&gt;&lt;BR&gt;//---------------------------------------------------------------------------------------------------------------------------------------------------------------&lt;BR&gt;&amp;nbsp;chain.bin viewbin 的内容： 是上面两个bin的结合&lt;BR&gt;//---------------------------------------------------------------------------------------------------------------------------------------------------------------&lt;BR&gt;ViewBin... chain.bin&amp;nbsp; &lt;BR&gt;Image Start = 0x8C200000, length = 0x00000528&lt;BR&gt;Record [&amp;nbsp; 0] : Start = 0x8C200000, Length = 0x00000528, Chksum = 0x0000084B&lt;BR&gt;&amp;nbsp;0x8C200000 : 02000000 0000008C 90CE1B00 00002000 .............. .&amp;nbsp;&amp;nbsp; //填充xipkernel部分的_XIPCHAIN_ENTRY 的内容&lt;BR&gt;&amp;nbsp;0x8C200010 : 01000100 00000000 5849504B 45524E45 ........XIPKERNE &lt;BR&gt;&amp;nbsp;0x8C200020 : 4C000000 00000000 00000000 00000000 L............... &lt;BR&gt;&amp;nbsp;0x8C200030 : 00000000 00000000 00000000 00000000 ................ &lt;BR&gt;&amp;nbsp;0x8C200040 : 00000000 00000000 00000000 00000000 ................ &lt;BR&gt;&amp;nbsp;0x8C200050 : 00000000 00000000 00000000 00000000 ................ &lt;BR&gt;&amp;nbsp;0x8C200060 : 00000000 00000000 00000000 00000000 ................ &lt;BR&gt;&amp;nbsp;0x8C200070 : 00000000 00000000 00000000 00000000 ................ &lt;BR&gt;&amp;nbsp;0x8C200080 : 00000000 00000000 00000000 00000000 ................ &lt;BR&gt;&amp;nbsp;0x8C200090 : 00000000 00000000 00000000 00000000 ................ &lt;BR&gt;&amp;nbsp;0x8C2000A0 : 00000000 00000000 00000000 00000000 ................ &lt;BR&gt;&amp;nbsp;0x8C2000B0 : 00000000 00000000 00000000 00000000 ................ &lt;BR&gt;&amp;nbsp;0x8C2000C0 : 00000000 00000000 00000000 00000000 ................ &lt;BR&gt;&amp;nbsp;0x8C2000D0 : 00000000 00000000 00000000 00000000 ................ &lt;BR&gt;&amp;nbsp;0x8C2000E0 : 00000000 00000000 00000000 00000000 ................ &lt;BR&gt;&amp;nbsp;0x8C2000F0 : 00000000 00000000 00000000 00000000 ................ &lt;BR&gt;&amp;nbsp;0x8C200100 : 00000000 00000000 00000000 00000000 ................ &lt;BR&gt;&amp;nbsp;0x8C200110 : 00000000 00000000 00000000 00000000 ................ &lt;BR&gt;&amp;nbsp;0x8C200120 : 00000000 00000000 00000000 00000000 ................ &lt;BR&gt;&amp;nbsp;0x8C200130 : 00000000 00000000 00000000 00000000 ................ &lt;BR&gt;&amp;nbsp;0x8C200140 : 00000000 00000000 00000000 00000000 ................ &lt;BR&gt;&amp;nbsp;0x8C200150 : 00000000 00000000 00000000 00000000 ................ &lt;BR&gt;&amp;nbsp;0x8C200160 : 00000000 00000000 00000000 00000000 ................ &lt;BR&gt;&amp;nbsp;0x8C200170 : 00000000 00000000 00000000 00000000 ................ &lt;BR&gt;&amp;nbsp;0x8C200180 : 00000000 00000000 00000000 00000000 ................ &lt;BR&gt;&amp;nbsp;0x8C200190 : 00000000 00000000 00000000 00000000 ................ &lt;BR&gt;&amp;nbsp;0x8C2001A0 : 00000000 00000000 00000000 00000000 ................ &lt;BR&gt;&amp;nbsp;0x8C2001B0 : 00000000 00000000 00000000 00000000 ................ &lt;BR&gt;&amp;nbsp;0x8C2001C0 : 00000000 00000000 00000000 00000000 ................ &lt;BR&gt;&amp;nbsp;0x8C2001D0 : 00000000 00000000 00000000 00000000 ................ &lt;BR&gt;&amp;nbsp;0x8C2001E0 : 00000000 00000000 00000000 00000000 ................ &lt;BR&gt;&amp;nbsp;0x8C2001F0 : 00000000 00000000 00000000 00000000 ................ &lt;BR&gt;&amp;nbsp;0x8C200200 : 00000000 00000000 00000000 00000000 ................ &lt;BR&gt;&amp;nbsp;0x8C200210 : 00000000 00000000 00000000 00000000 ................ &lt;BR&gt;&amp;nbsp;0x8C200220 : 00000000 00000000 00000000 00000000 ................ &lt;BR&gt;&amp;nbsp;0x8C200230 : 00000000 00000000 00000000 00000000 ................ &lt;BR&gt;&amp;nbsp;0x8C200240 : 00000000 00000000 00000000 00000000 ................ &lt;BR&gt;&amp;nbsp;0x8C200250 : 00000000 00000000 00000000 00000000 ................ &lt;BR&gt;&amp;nbsp;0x8C200260 : 00000000 00000000 00000000 00000000 ................ &lt;BR&gt;&amp;nbsp;0x8C200270 : 00000000 00000000 00000000 00000000 ................ &lt;BR&gt;&amp;nbsp;0x8C200280 : 00000000 00000000 00000000 00000000 ................ &lt;BR&gt;&amp;nbsp;0x8C200290 : 00000000 0010208C 1099DE00 00009001 ...... .........&amp;nbsp;&amp;nbsp; //0010208C 开始就是 填充nk部分的_XIPCHAIN_ENTRY 的内容&lt;BR&gt;&amp;nbsp;0x8C2002A0 : 02000100 00000000 4E4B0000 00000000 ........NK...... &lt;BR&gt;&amp;nbsp;0x8C2002B0 : 00000000 00000000 00000000 00000000 ................ &lt;BR&gt;&amp;nbsp;0x8C2002C0 : 00000000 00000000 00000000 00000000 ................ &lt;BR&gt;&amp;nbsp;0x8C2002D0 : 00000000 00000000 00000000 00000000 ................ &lt;BR&gt;&amp;nbsp;0x8C2002E0 : 00000000 00000000 00000000 00000000 ................ &lt;BR&gt;&amp;nbsp;0x8C2002F0 : 00000000 00000000 00000000 00000000 ................ &lt;BR&gt;&amp;nbsp;0x8C200300 : 00000000 00000000 00000000 00000000 ................ &lt;BR&gt;&amp;nbsp;0x8C200310 : 00000000 00000000 00000000 00000000 ................ &lt;BR&gt;&amp;nbsp;0x8C200320 : 00000000 00000000 00000000 00000000 ................ &lt;BR&gt;&amp;nbsp;0x8C200330 : 00000000 00000000 00000000 00000000 ................ &lt;BR&gt;&amp;nbsp;0x8C200340 : 00000000 00000000 00000000 00000000 ................ &lt;BR&gt;&amp;nbsp;0x8C200350 : 00000000 00000000 00000000 00000000 ................ &lt;BR&gt;&amp;nbsp;0x8C200360 : 00000000 00000000 00000000 00000000 ................ &lt;BR&gt;&amp;nbsp;0x8C200370 : 00000000 00000000 00000000 00000000 ................ &lt;BR&gt;&amp;nbsp;0x8C200380 : 00000000 00000000 00000000 00000000 ................ &lt;BR&gt;&amp;nbsp;0x8C200390 : 00000000 00000000 00000000 00000000 ................ &lt;BR&gt;&amp;nbsp;0x8C2003A0 : 00000000 00000000 00000000 00000000 ................ &lt;BR&gt;&amp;nbsp;0x8C2003B0 : 00000000 00000000 00000000 00000000 ................ &lt;BR&gt;&amp;nbsp;0x8C2003C0 : 00000000 00000000 00000000 00000000 ................ &lt;BR&gt;&amp;nbsp;0x8C2003D0 : 00000000 00000000 00000000 00000000 ................ &lt;BR&gt;&amp;nbsp;0x8C2003E0 : 00000000 00000000 00000000 00000000 ................ &lt;BR&gt;&amp;nbsp;0x8C2003F0 : 00000000 00000000 00000000 00000000 ................ &lt;BR&gt;&amp;nbsp;0x8C200400 : 00000000 00000000 00000000 00000000 ................ &lt;BR&gt;&amp;nbsp;0x8C200410 : 00000000 00000000 00000000 00000000 ................ &lt;BR&gt;&amp;nbsp;0x8C200420 : 00000000 00000000 00000000 00000000 ................ &lt;BR&gt;&amp;nbsp;0x8C200430 : 00000000 00000000 00000000 00000000 ................ &lt;BR&gt;&amp;nbsp;0x8C200440 : 00000000 00000000 00000000 00000000 ................ &lt;BR&gt;&amp;nbsp;0x8C200450 : 00000000 00000000 00000000 00000000 ................ &lt;BR&gt;&amp;nbsp;0x8C200460 : 00000000 00000000 00000000 00000000 ................ &lt;BR&gt;&amp;nbsp;0x8C200470 : 00000000 00000000 00000000 00000000 ................ &lt;BR&gt;&amp;nbsp;0x8C200480 : 00000000 00000000 00000000 00000000 ................ &lt;BR&gt;&amp;nbsp;0x8C200490 : 00000000 00000000 00000000 00000000 ................ &lt;BR&gt;&amp;nbsp;0x8C2004A0 : 00000000 00000000 00000000 00000000 ................ &lt;BR&gt;&amp;nbsp;0x8C2004B0 : 00000000 00000000 00000000 00000000 ................ &lt;BR&gt;&amp;nbsp;0x8C2004C0 : 00000000 00000000 00000000 00000000 ................ &lt;BR&gt;&amp;nbsp;0x8C2004D0 : 00000000 00000000 00000000 00000000 ................ &lt;BR&gt;&amp;nbsp;0x8C2004E0 : 00000000 00000000 00000000 00000000 ................ &lt;BR&gt;&amp;nbsp;0x8C2004F0 : 00000000 00000000 00000000 00000000 ................ &lt;BR&gt;&amp;nbsp;0x8C200500 : 00000000 00000000 00000000 00000000 ................ &lt;BR&gt;&amp;nbsp;0x8C200510 : 00000000 00000000 00000000 00000000 ................ &lt;BR&gt;&amp;nbsp;0x8C200520 : 00000000 00000000&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ........&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/P&gt;
&lt;P&gt;&amp;nbsp;Chksum valid&lt;BR&gt;Record [&amp;nbsp; 1] : Start = 0x00000000, Length = 0x00000000, Chksum = 0x00000000&lt;BR&gt;&amp;nbsp;&amp;nbsp;Start address = 0x00000000&lt;BR&gt;只有1条有效记录,一条记录分成两部分对应xipkernel.bin 和nk.bin,使用结构&lt;BR&gt;typedef struct _XIPCHAIN_ENTRY {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; LPVOID&amp;nbsp; pvAddr;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // address of the XIP&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // 根据这个地址可以找到pToc!!!!!!&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; DWORD&amp;nbsp;&amp;nbsp; dwLength;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // the size of the XIP&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; DWORD&amp;nbsp;&amp;nbsp; dwMaxLength;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // the biggest it can grow to&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; USHORT&amp;nbsp; usOrder;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // where to put into ROMChain_t&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; USHORT&amp;nbsp; usFlags;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // flags/status of XIP&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; DWORD&amp;nbsp;&amp;nbsp; dwVersion;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // version info&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; CHAR&amp;nbsp;&amp;nbsp;&amp;nbsp; szName[XIP_NAMELEN];&amp;nbsp;&amp;nbsp;&amp;nbsp; // Name of XIP, typically the bin file's name, w/o .bin&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; DWORD&amp;nbsp;&amp;nbsp; dwAlgoFlags;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // algorithm to use for signature verification&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; DWORD&amp;nbsp;&amp;nbsp; dwKeyLen;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // length of key in byPublicKey&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; BYTE&amp;nbsp;&amp;nbsp;&amp;nbsp; byPublicKey[596];&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // public key data&lt;BR&gt;} XIPCHAIN_ENTRY, *PXIPCHAIN_ENTRY;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;//其他相关结构:&lt;BR&gt;typedef struct ROMHDR {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; ULONG&amp;nbsp;&amp;nbsp; dllfirst;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // first DLL address&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; ULONG&amp;nbsp;&amp;nbsp; dlllast;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // last DLL address&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; ULONG&amp;nbsp;&amp;nbsp; physfirst;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // first physical address&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; ULONG&amp;nbsp;&amp;nbsp; physlast;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // highest physical address&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; ULONG&amp;nbsp;&amp;nbsp; nummods;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // number of TOCentry's&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; ULONG&amp;nbsp;&amp;nbsp; ulRAMStart;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // start of RAM&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; ULONG&amp;nbsp;&amp;nbsp; ulRAMFree;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // start of RAM free space&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; ULONG&amp;nbsp;&amp;nbsp; ulRAMEnd;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // end of RAM&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; ULONG&amp;nbsp;&amp;nbsp; ulCopyEntries;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // number of copy section entries&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; ULONG&amp;nbsp;&amp;nbsp; ulCopyOffset;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // offset to copy section&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; ULONG&amp;nbsp;&amp;nbsp; ulProfileLen;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // length of PROFentries RAM &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; ULONG&amp;nbsp;&amp;nbsp; ulProfileOffset;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // offset to PROFentries&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; ULONG&amp;nbsp;&amp;nbsp; numfiles;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // number of FILES&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; ULONG&amp;nbsp;&amp;nbsp; ulKernelFlags;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // optional kernel flags from ROMFLAGS .bib config option&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; ULONG&amp;nbsp;&amp;nbsp; ulFSRamPercent;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Percentage of RAM used for filesystem &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // from FSRAMPERCENT .bib config option&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // byte 0 = #4K chunks/Mbyte of RAM for filesystem 0-2Mbytes 0-255&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // byte 1 = #4K chunks/Mbyte of RAM for filesystem 2-4Mbytes 0-255&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // byte 2 = #4K chunks/Mbyte of RAM for filesystem 4-6Mbytes 0-255&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // byte 3 = #4K chunks/Mbyte of RAM for filesystem &amp;gt; 6Mbytes 0-255&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; ULONG&amp;nbsp;&amp;nbsp; ulDrivglobStart;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // device driver global starting address&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; ULONG&amp;nbsp;&amp;nbsp; ulDrivglobLen;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // device driver global length&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; USHORT&amp;nbsp; usCPUType;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // CPU (machine) Type&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; USHORT&amp;nbsp; usMiscFlags;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Miscellaneous flags&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; PVOID&amp;nbsp;&amp;nbsp; pExtensions;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // pointer to ROM Header extensions&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; ULONG&amp;nbsp;&amp;nbsp; ulTrackingStart;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // tracking memory starting address&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; ULONG&amp;nbsp;&amp;nbsp; ulTrackingLen;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // tracking memory ending address&lt;BR&gt;} ROMHDR;&lt;/P&gt;&lt;img src ="http://blog.vckbase.com/liu090/aggbug/27230.html" width = "1" height = "1" /&gt;</description></item><item><dc:creator>liu090</dc:creator><title>关于mult-xip  bin 的一些资料整理</title><link>http://blog.vckbase.com/liu090/archive/2007/05/22/26564.html</link><pubDate>Tue, 22 May 2007 07:11:00 GMT</pubDate><guid>http://blog.vckbase.com/liu090/archive/2007/05/22/26564.html</guid><wfw:comment>http://blog.vckbase.com/liu090/comments/26564.html</wfw:comment><comments>http://blog.vckbase.com/liu090/archive/2007/05/22/26564.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://blog.vckbase.com/liu090/comments/commentRss/26564.html</wfw:commentRss><trackback:ping>http://blog.vckbase.com/liu090/services/trackbacks/26564.html</trackback:ping><description>&lt;P&gt;关于mult-xip&amp;nbsp; bin 的一些资料整理&lt;BR&gt;参考&amp;nbsp; &lt;A href="http://www.cnblogs.com/yakin/archive/2005/07/20/196572.aspx"&gt;http://www.cnblogs.com/yakin/archive/2005/07/20/196572.aspx&lt;/A&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;A href="http://msdn2.microsoft.com/en-us/library/aa451015.aspx"&gt;http://msdn2.microsoft.com/en-us/library/aa451015.aspx&lt;/A&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp; &lt;A href="http://embed.e800.com.cn/articles/2007/510/1178760966833421250_1.html"&gt;http://embed.e800.com.cn/articles/2007/510/1178760966833421250_1.html&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;&lt;BR&gt;一.实现multbin &lt;BR&gt;1.首先修改config.bib &lt;/P&gt;
&lt;P&gt;&amp;nbsp;比如:&lt;BR&gt;&amp;nbsp;#elif defined IMGMULTIBIN&lt;BR&gt;;&amp;nbsp; NAME&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; START ADDR&amp;nbsp;&amp;nbsp;&amp;nbsp; SIZE&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; TYPE&lt;BR&gt;;&amp;nbsp; ----------------------------------------------------------------&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; NK&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 80220000&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 007DE000&amp;nbsp;&amp;nbsp; RAMIMAGE&amp;nbsp;&amp;nbsp; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; SHELL&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 809FE000&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 00100000&amp;nbsp;&amp;nbsp; RAMIMAGE&amp;nbsp;&amp;nbsp; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; APPS&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 80AFE000&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 00100000&amp;nbsp;&amp;nbsp; RAMIMAGE&amp;nbsp;&amp;nbsp; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; CHAIN&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 80BFE000&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 00002000&amp;nbsp;&amp;nbsp; RESERVED ; XIP chain info&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; RAM&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 80C00000&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 01000000&amp;nbsp;&amp;nbsp; RAM&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; pdwXIPLoc&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 00000000&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 80BFE000&amp;nbsp;&amp;nbsp; FIXUPVAR&amp;nbsp;&amp;nbsp; ; XIP pTOC&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; AUTOSIZE=ON&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ;自动调整RAM 起始地址到 最近的 XIP region的末尾&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; ROM_AUTOSIZE=ON&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ；每个分隔的XIP regin 的大小自动调整&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; DLLADDR_AUTOSIZE=ON&amp;nbsp;&amp;nbsp; ；自动调整 dll地址空间大小根据 multiple XIP regions. &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; XIPSCHAIN=80bfe000&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ; 指定CHAIN region 在内存段的地址. &lt;BR&gt;Note&amp;nbsp;&amp;nbsp; This address is applicable for the example provided in the previous step of this procedure. &lt;BR&gt;If you use a customized address for the CHAIN region or a different BSP, you will have to &lt;BR&gt;update this variable to match your settings &lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;pdwXIPLoc 必须定义START ADDR =00000000 SIZE=CHAIN的START ADDR&lt;BR&gt;CHAIN 用来保存多个bin的chain info,CHAIN的位置和你bootloader代码有关,(cepc一般放在 NK region 后面)&lt;BR&gt;所有的RAMIMAGE 必须在物理,虚拟地址上都连续&lt;BR&gt;经验上每个bin 加32K (msdn：As a good practice, add the sizes of all files for a given region, &lt;BR&gt;and then add an extra 32K as a buffer. Adding this extra amount provides room for the files to &lt;BR&gt;reduce and expand as they change between each successive build)&lt;/P&gt;
&lt;P&gt;&lt;BR&gt;2.修改platform.bib,把不同的部分放入到不动的region中 (其他bib也可以修改的)&lt;BR&gt;比如&lt;BR&gt;if IMGMULTIBIN&lt;BR&gt;&amp;nbsp;&amp;nbsp; shell.exe&amp;nbsp;&amp;nbsp; $(_FLATRELEASEDIR)\shell.exe&amp;nbsp;&amp;nbsp; SHELL&amp;nbsp;&amp;nbsp; SH&lt;BR&gt;&amp;nbsp;&amp;nbsp; filesys.exe $(_FLATRELEASEDIR)\filesys.exe SHELL&amp;nbsp;&amp;nbsp; SH&lt;BR&gt;#else&lt;BR&gt;&amp;nbsp;&amp;nbsp; shell.exe&amp;nbsp;&amp;nbsp; $(_FLATRELEASEDIR)\shell.exe&amp;nbsp;&amp;nbsp; NK&amp;nbsp; SH&lt;BR&gt;&amp;nbsp;&amp;nbsp; filesys.exe $(_FLATRELEASEDIR)\filesys.exe NK&amp;nbsp; SH&lt;BR&gt;#endif&lt;/P&gt;
&lt;P&gt;表示把文件系统, shell放到 SHELL regin (shell.bin)&lt;/P&gt;
&lt;P&gt;&lt;BR&gt;3.设置: 环境变量IMGMULTIBIN =1&lt;/P&gt;
&lt;P&gt;&lt;BR&gt;4.在cfw.c中的OEMInit中的最后加上对InitRomChain的调用，来连接各个bin,最后连接到OEMRomChain 上!!!&lt;/P&gt;
&lt;P&gt;void InitRomChain(void)&lt;BR&gt;{&lt;BR&gt;&amp;nbsp;static&amp;nbsp;&amp;nbsp;ROMChain_t&amp;nbsp;s_pNextRom[MAX_ROM] = {0};&lt;BR&gt;&amp;nbsp;DWORD&amp;nbsp;&amp;nbsp;dwRomCount = 0;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; DWORD&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; dwChainCount = 0;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; DWORD&amp;nbsp;&amp;nbsp;*pdwCurXIP;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; DWORD&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; dwNumXIPs;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; PXIPCHAIN_ENTRY pChainEntry = NULL;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; if(pdwXIPLoc == NOT_FIXEDUP)&lt;BR&gt;&amp;nbsp;{&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return;&amp;nbsp; //pdwXIPLoc 必须是 FIXUPVAR ,否则表示没有chain或者设置不对&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; // set the top bit to mark it as a virtual address&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; pdwCurXIP = (DWORD*)(((DWORD)pdwXIPLoc) | 0x80000000);&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; // first DWORD is number of XIPs&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; dwNumXIPs = (*pdwCurXIP);&amp;nbsp;&amp;nbsp; &lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; if(dwNumXIPs &amp;gt; MAX_ROM)&lt;BR&gt;&amp;nbsp;{&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; lpWriteDebugStringFunc(TEXT("ERROR: Number of XIPs exceeds MAX\n"));&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; pChainEntry = (PXIPCHAIN_ENTRY)(pdwCurXIP + 1);&amp;nbsp;&amp;nbsp; //其实就是指向CHAIN 中chain info的相关信息&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; while(dwChainCount &amp;lt; dwNumXIPs)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if ((pChainEntry-&amp;gt;usFlags &amp;amp; ROMXIP_OK_TO_LOAD) &amp;amp;&amp;amp;&amp;nbsp; // flags indicates valid XIP&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; *(LPDWORD)(((DWORD)(pChainEntry-&amp;gt;pvAddr)) + ROM_SIGNATURE_OFFSET) == ROM_SIGNATURE)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; s_pNextRom[dwRomCount].pTOC = *(ROMHDR **)(　　((DWORD)(pChainEntry-&amp;gt;pvAddr)) + ROM_SIGNATURE_OFFSET + 4　　);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; s_pNextRom[dwRomCount].pNext = NULL;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (dwRomCount != 0)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; s_pNextRom[dwRomCount-1].pNext = &amp;amp;s_pNextRom[dwRomCount];&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; else&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; OEMRomChain = s_pNextRom;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; dwRomCount++;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; else&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; lpWriteDebugStringFunc( _T("Invalid XIP found\n") );&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ++pChainEntry;&lt;BR&gt;&amp;nbsp;&amp;nbsp;dwChainCount++;&lt;BR&gt;&amp;nbsp;}&lt;BR&gt;}&lt;BR&gt;&amp;nbsp; &lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;//在romldr.h中　定义了上面的相关的&lt;BR&gt;typedef struct _XIPCHAIN_ENTRY {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; LPVOID&amp;nbsp; pvAddr;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // address of the XIP&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; DWORD&amp;nbsp;&amp;nbsp; dwLength;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // the size of the XIP&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; DWORD&amp;nbsp;&amp;nbsp; dwMaxLength;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // the biggest it can grow to&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; USHORT&amp;nbsp; usOrder;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // where to put into ROMChain_t&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; USHORT&amp;nbsp; usFlags;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // flags/status of XIP&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; DWORD&amp;nbsp;&amp;nbsp; dwVersion;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // version info&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; CHAR&amp;nbsp;&amp;nbsp;&amp;nbsp; szName[XIP_NAMELEN];&amp;nbsp;&amp;nbsp;&amp;nbsp; // Name of XIP, typically the bin file's name, w/o .bin&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; DWORD&amp;nbsp;&amp;nbsp; dwAlgoFlags;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // algorithm to use for signature verification&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; DWORD&amp;nbsp;&amp;nbsp; dwKeyLen;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // length of key in byPublicKey&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; BYTE&amp;nbsp;&amp;nbsp;&amp;nbsp; byPublicKey[596];&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // public key data&lt;BR&gt;} XIPCHAIN_ENTRY, *PXIPCHAIN_ENTRY;&lt;/P&gt;
&lt;P&gt;#define ROMXIP_OK_TO_LOAD&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 0x0001&lt;BR&gt;#define ROMXIP_IS_SIGNED&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 0x0002&lt;/P&gt;
&lt;P&gt;#define ROM_SIGNATURE_OFFSET 64　　　//0x40&lt;BR&gt;#define ROM_SIGNATURE 0x43454345&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; //cece 4byte&amp;nbsp;&amp;nbsp;&amp;nbsp; =&amp;gt;ROMHDR 在0x44偏移处,&lt;BR&gt;//每个bin 都有个pToc指向ROMHDR开头的地址,看下面的bin 文件结构,在0x44offset处地址里面放的是ROMHDR地址,开始是-1,由romimage.exe来设置的&lt;/P&gt;
&lt;P&gt;&lt;BR&gt;//有点糊涂了 再分析下bin文件的结构&lt;BR&gt;struct BinFile{ &lt;BR&gt;BYTE signature[7]; // = { ''B'', ''0'', ''0'', ''0'', ''F'', ''F'', ''\a'' } &lt;BR&gt;DWORD ImageStart &lt;BR&gt;DWORD ImageLength &lt;BR&gt;Record ImageRecords[RecordNum] &lt;BR&gt;}; &lt;/P&gt;
&lt;P&gt;&lt;BR&gt;struct Record{ &lt;BR&gt;DWORD address; &lt;BR&gt;DWORD length; &lt;BR&gt;DWORD chksum; &lt;BR&gt;}; &lt;BR&gt;在文件的最开端，会放置一个BinFile结构，imageStart和ImageLength分别对应镜像展开后在内存中存放的首地址和长度。&lt;BR&gt;该结构中的RecordNum为不确定的，通常在最后一个记录之后增加一个address和Chksum都为0的纪录表示结束，&lt;BR&gt;而这个表示结束的结构中的Length则标示其实际入口点。 &lt;BR&gt;可以用viewbin -r 去看下nk.bin:&lt;BR&gt;Image Start = 0x8C200000, length = 0x00E158C8&lt;BR&gt;&amp;nbsp;&amp;nbsp;Start address = 0x8C201000&lt;BR&gt;Checking record #22 for potential TOC (ROMOFFSET = 0xFF446658)&lt;BR&gt;Checking record #177 for potential TOC (ROMOFFSET = 0x00000000)&lt;BR&gt;Found pTOC&amp;nbsp; = 0x8d013950&lt;BR&gt;ROMOFFSET = 0x00000000&lt;/P&gt;
&lt;P&gt;ROMHDR ----------------------------------------&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; DLL First&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; : 0x01E401E7&amp;nbsp; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; DLL Last&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; : 0x02000000&amp;nbsp; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Physical First&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; : 0x8C200000&amp;nbsp; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Physical Last&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; : 0x8D0158C8&amp;nbsp; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; RAM Start&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; : 0x8E600000&amp;nbsp; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; RAM Free&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; : 0x8E629000&amp;nbsp; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; RAM End&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; : 0x8FF00000&amp;nbsp; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Kernel flags&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; : 0x00000002&amp;nbsp; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Prof Symbol Offset&amp;nbsp; : 0x00000000&amp;nbsp; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Num Copy Entries&amp;nbsp;&amp;nbsp;&amp;nbsp; :&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 1&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Copy Entries Offset : 0x8CC7AE8C&amp;nbsp; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Num Modules&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; :&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 166&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Num Files&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; :&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 95&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Kernel Debugger&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; :&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; No&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; CPU&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; :&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 0x01c2 (Thumb)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Extensions&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; : 0x8C20266C&lt;/P&gt;
&lt;P&gt;ROMHDR Extensions -----------------------------&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; PID[0] = 0x00000000&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; PID[1] = 0x00000000&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; PID[2] = 0x00000000&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; PID[3] = 0x00000000&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; PID[4] = 0x00000000&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; PID[5] = 0x00000000&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; PID[6] = 0x00000000&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; PID[7] = 0x00000000&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; PID[8] = 0x00000000&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; PID[9] = 0x00000000&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Next: 00000000&lt;/P&gt;
&lt;P&gt;COPY Sections ---------------------------------&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Src: 0x8CD18DA8&amp;nbsp;&amp;nbsp; Dest: 0x8E606000&amp;nbsp;&amp;nbsp; CLen: 0x228&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; DLen: 0x22B4C &lt;/P&gt;
&lt;P&gt;MODULES ---------------------------------------&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 11/20/2006&amp;nbsp; 03:20:28&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 268800&amp;nbsp; nk.exe &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 11/20/2006&amp;nbsp; 03:25:22&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 550400&amp;nbsp; coredll.dll &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 11/20/2006&amp;nbsp; 03:25:22&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 205824&amp;nbsp; filesys.exe &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 11/20/2006&amp;nbsp; 03:25:22&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 723968&amp;nbsp; gwes.exe &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 11/20/2006&amp;nbsp; 03:09:08&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 25600&amp;nbsp; device.exe &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; .......................&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; .......................&lt;BR&gt;FILES ----------------------------------------&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 11/20/2006&amp;nbsp; 03:10:42&amp;nbsp; C_R_&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 2897&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 12461&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ceconfig.h (ROM 0x8C55E4AC)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 11/20/2006&amp;nbsp; 03:25:18&amp;nbsp; _HRS&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 0&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 694654&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; wince.nls (ROM 0x8CE36984)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 5/09/2007&amp;nbsp; 14:06:14&amp;nbsp; CHRS&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 3427&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 20574&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; initobj.dat (ROM 0x8C730280)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; .......................&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; .......................&lt;BR&gt;done.&lt;/P&gt;
&lt;P&gt;分布结构:&lt;BR&gt;Image :&lt;BR&gt;Offset ----------- &lt;BR&gt;0x00 | ImageStart &lt;BR&gt;| &lt;BR&gt;| &lt;BR&gt;0x40 | Rom Signature { 0x43454345 } &lt;BR&gt;0x44 | Pointer to the ROMHDR for this Region &lt;BR&gt;| &lt;BR&gt;| &lt;BR&gt;0x???? | ROMHDR{ 　　　　　　　　　　　　　　　&amp;lt;-pToc所指&lt;BR&gt;| }; &lt;BR&gt;| &lt;/P&gt;
&lt;P&gt;&lt;BR&gt;Chain file &lt;BR&gt;struct _XIPCHAIN_ENTRY { &lt;BR&gt;LPVOID pvAddr; // address of the XIP &lt;BR&gt;DWORD dwLength; // the size of the XIP &lt;BR&gt;DWORD dwMaxLength; // the biggest it can grow to &lt;BR&gt;USHORT usOrder; // where to put into ROMChain_t &lt;BR&gt;USHORT usFlags; // flags/status of XIP &lt;BR&gt;DWORD dwVersion; // version info &lt;BR&gt;CHAR szName[XIP_NAMELEN]; // Name of XIP, typically the bin file''s name, w/o .bin &lt;BR&gt;DWORD dwAlgoFlags; // algorithm to use for signature verification &lt;BR&gt;DWORD dwKeyLen; // length of key in byPublicKey &lt;BR&gt;BYTE byPublicKey[596]; // public key data &lt;BR&gt;}; &lt;/P&gt;
&lt;P&gt;&lt;BR&gt;Offset -------------------------- &lt;BR&gt;0x00 | DWORD Count; &lt;BR&gt;0x04 | XIPCHAIN_ENTRY[1]{ &lt;BR&gt;| }; &lt;BR&gt;| XIPCHAIN_ENTRY[2]{ &lt;BR&gt;| }; &lt;BR&gt;| ... &lt;/P&gt;
&lt;P&gt;&lt;BR&gt;二.关于OEMMultiBINNotify ,他是被blcommon 来调用，来让我们获得一个或多个 BIN regions的信息的&lt;BR&gt;比如&lt;BR&gt;用结构&lt;BR&gt;typedef struct _MultiBINInfo_&lt;BR&gt;{&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; DWORD dwNumRegions;&lt;BR&gt;&amp;nbsp;RegionInfo Region[BL_MAX_BIN_REGIONS];&lt;BR&gt;} MultiBINInfo, *PMultiBINInfo;&lt;/P&gt;
&lt;P&gt;定义一个MultiBINInfo&amp;nbsp;&amp;nbsp;&amp;nbsp; g_BINRegionInfo;全局变量在OEMMultiBINNotify中获得每个bin regins的信息&lt;/P&gt;
&lt;P&gt;ReginInfo结构:&lt;BR&gt;typedef struct _RegionInfo_&lt;BR&gt;{&lt;BR&gt;&amp;nbsp;DWORD dwRegionStart;&lt;BR&gt;&amp;nbsp;DWORD dwRegionLength;&lt;BR&gt;} RegionInfo, *PRegionInfo;&lt;/P&gt;
&lt;P&gt;g_BINRegionInfo 被WriteRegionsToBootMedia　写regions到flash用到,&lt;BR&gt;我用的是nandflash,&lt;BR&gt;WriteRegionsToBootMedia中这段&lt;BR&gt;// Look in the kernel region's extension area for a multi-BIN extension descriptor.&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; // This region, if found, details the number, start, and size of each BIN region.&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; //&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; //for (nCount = 0, dwNumExts = 0 ; (nCount &amp;lt; g_BINRegionInfo.dwNumRegions) &amp;amp;&amp;amp; !pChainInfo ; nCount++)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; for (nCount = 0, dwNumExts = 0 ; (nCount &amp;lt; g_BINRegionInfo.dwNumRegions); nCount++)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Does this region contain nk.exe and an extension pointer?&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; //&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; pExt = (EXTENSION *)GetKernelExtPointer(g_BINRegionInfo.Region[nCount].dwRegionStart,&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; g_BINRegionInfo.Region[nCount].dwRegionLength );&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if ( pExt != NULL)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // If there is an extension pointer region, walk it until the end.&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; //&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; while (pExt)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; DWORD dwBaseAddr = g_BINRegionInfo.Region[nCount].dwRegionStart;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; pExt = (EXTENSION *)OEMMapMemAddr(dwBaseAddr, (DWORD)pExt);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; EdbgOutputDebugString("INFO: OEMLaunch: Found chain extenstion: '%s' @ 0x%x\r\n", pExt-&amp;gt;name, dwBaseAddr);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if ((pExt-&amp;gt;type == 0) &amp;amp;&amp;amp; !strcmp(pExt-&amp;gt;name, "chain information"))&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; pChainInfo = (PXIPCHAIN_SUMMARY) OEMMapMemAddr(dwBaseAddr, (DWORD)pExt-&amp;gt;pdata);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; dwNumExts = (pExt-&amp;gt;length / sizeof(XIPCHAIN_SUMMARY));&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; EdbgOutputDebugString("INFO: OEMLaunch: Found 'chain information' (pChainInfo=0x%x&amp;nbsp; Extensions=0x%x).\r\n", (DWORD)pChainInfo, dwNumExts);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; break;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; pExt = (EXTENSION *)pExt-&amp;gt;pNextExt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; else {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; //&amp;nbsp; Search for Chain region. Chain region doesn't have the ROMSIGNATURE set&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; DWORD&amp;nbsp;&amp;nbsp; dwRegionStart = g_BINRegionInfo.Region[nCount].dwRegionStart;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; DWORD&amp;nbsp;&amp;nbsp; dwSig = *(LPDWORD) OEMMapMemAddr(dwRegionStart, dwRegionStart + ROM_SIGNATURE_OFFSET);&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if ( dwSig != ROM_SIGNATURE) {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; //&amp;nbsp; It is the chain&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; dwChainStart = dwRegionStart;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; dwChainLength = g_BINRegionInfo.Region[nCount].dwRegionLength;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; EdbgOutputDebugString("Found the Chain region: StartAddress: 0x%X; Length: 0x%X\n", dwChainStart, dwChainLength);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; // nk.exe and an extension pointer&amp;nbsp; 这个是什么意思，就是说nk.exe　包含一个扩展point是派什么用处的，那位知道告诉我&lt;/P&gt;
&lt;P&gt;&lt;BR&gt;感觉是一个是bootlaod时的概念，一个是运行是的概念&lt;BR&gt;bootlaoder时　：通过OEMMultiBINNotify　获得的信息来进行下载等应用&lt;/P&gt;
&lt;P&gt;运行时，是根据config.bib中CHAIN的关于regions的信息,通过InitRomChain　来把他串起来，&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;三.toc block ,是和nand boot有关的东西&lt;/P&gt;
&lt;P&gt;typedef struct _TOC {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; DWORD&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; dwSignature;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; // How to boot the images in this TOC.&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; // This could be moved into the image descriptor if desired,&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; // but I prefer to conserve space.&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; BOOT_CFG&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; BootCfg;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Array of Image Descriptors.&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; IMAGE_DESCRIPTOR&amp;nbsp;&amp;nbsp;&amp;nbsp; id[MAX_TOC_DESCRIPTORS];&lt;/P&gt;
&lt;P&gt;//&amp;nbsp;&amp;nbsp;&amp;nbsp; UCHAR Pad[12];&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // align on SECTOR_SIZE&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; CHAININFO&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; chainInfo;&lt;BR&gt;} TOC, *PTOC;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // 512 bytes&lt;/P&gt;
&lt;P&gt;&lt;BR&gt;typedef struct _IMAGE_DESCRIPTOR {&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; // File version info&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; DWORD dwVersion;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // e.g: build number&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; DWORD dwSignature;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // e.g: "EBOT", "CFSH", etc&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; UCHAR ucString[IMAGE_STRING_LEN];&amp;nbsp;&amp;nbsp; // e.g: "PocketPC_2002"&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; DWORD dwImageType;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // IMAGE_TYPE_ flags&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; DWORD dwTtlSectors;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // TTL image size in sectors.&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // We store size in sectors instead of bytes&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // to simplify sector reads in Nboot.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; DWORD dwLoadAddress;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Virtual address to load image (ImageStart)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; DWORD dwJumpAddress;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Virtual address to jump (StartAddress/LaunchAddr)&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; // This array equates to a sector-based MXIP MultiBINInfo in blcommon.&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Unused entries are zeroed.&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; // You could chain image descriptors if needed.&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; SG_SECTOR sgList[MAX_SG_SECTORS];&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; // BinFS support to load nk region only&lt;BR&gt;&amp;nbsp;//struct&lt;BR&gt;&amp;nbsp;//{&lt;BR&gt;&amp;nbsp;&amp;nbsp;ULONG dwStoreOffset;&amp;nbsp;&amp;nbsp;&amp;nbsp; // byte offset - not needed - remove!&lt;BR&gt;&amp;nbsp;&amp;nbsp;//ULONG RunAddress;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // nk dwRegionStart address&lt;BR&gt;&amp;nbsp;&amp;nbsp;//ULONG Length;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // nk dwRegionLength in bytes&lt;BR&gt;&amp;nbsp;&amp;nbsp;//ULONG LaunchAddress;&amp;nbsp; // nk dwLaunchAddr&lt;BR&gt;&amp;nbsp;//} NKRegion;&lt;/P&gt;
&lt;P&gt;} IMAGE_DESCRIPTOR, *PIMAGE_DESCRIPTOR;&lt;/P&gt;
&lt;P&gt;这些信息被写入block 1,&lt;BR&gt;为nboot启动　nk,或 eboot提供信息的&lt;/P&gt;
&lt;P&gt;&lt;BR&gt;感觉这块总是理不顺,如果那位能理得更清晰点，贴出来大家学习下，我也起到抛砖引玉的作用了&lt;BR&gt;&lt;/P&gt;&lt;img src ="http://blog.vckbase.com/liu090/aggbug/26564.html" width = "1" height = "1" /&gt;</description></item><item><dc:creator>liu090</dc:creator><title>终于看到小企鹅了</title><link>http://blog.vckbase.com/liu090/archive/2007/02/13/24570.html</link><pubDate>Tue, 13 Feb 2007 12:08:00 GMT</pubDate><guid>http://blog.vckbase.com/liu090/archive/2007/02/13/24570.html</guid><wfw:comment>http://blog.vckbase.com/liu090/comments/24570.html</wfw:comment><comments>http://blog.vckbase.com/liu090/archive/2007/02/13/24570.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://blog.vckbase.com/liu090/comments/commentRss/24570.html</wfw:commentRss><trackback:ping>http://blog.vckbase.com/liu090/services/trackbacks/24570.html</trackback:ping><description>调试lcd，发现驱动程序执行后有反映，但只能看到一个光标在闪，但看不到所谓的小企鹅&lt;BR&gt;我估计驱动是没问题的，这块屏在wince下已经弄得很熟悉了，估计是什么东西没加&lt;BR&gt;看到配置里面graphic device里的boot config 没选，选中后跳出三条好象和图片有关的&lt;BR&gt;全部加入，一编译&amp;nbsp; , 下载后，###############################################&lt;BR&gt;#########################################################################3&lt;BR&gt;##########################################################################3&lt;BR&gt;终于看到了无数人调lcd时看到的所谓的小企鹅，爽啊&lt;BR&gt;&lt;BR&gt;&lt;img src ="http://blog.vckbase.com/liu090/aggbug/24570.html" width = "1" height = "1" /&gt;</description></item><item><dc:creator>liu090</dc:creator><title>我的博客开通了,心情不错</title><link>http://blog.vckbase.com/liu090/archive/2007/01/25/24194.html</link><pubDate>Thu, 25 Jan 2007 03:04:00 GMT</pubDate><guid>http://blog.vckbase.com/liu090/archive/2007/01/25/24194.html</guid><wfw:comment>http://blog.vckbase.com/liu090/comments/24194.html</wfw:comment><comments>http://blog.vckbase.com/liu090/archive/2007/01/25/24194.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://blog.vckbase.com/liu090/comments/commentRss/24194.html</wfw:commentRss><trackback:ping>http://blog.vckbase.com/liu090/services/trackbacks/24194.html</trackback:ping><description>&lt;P&gt;博客开通了,心情不错&lt;/P&gt;&lt;img src ="http://blog.vckbase.com/liu090/aggbug/24194.html" width = "1" height = "1" /&gt;</description></item></channel></rss>