关于mult-xip bin的一些资料整理

一.实现multbin 
1.首先修改config.bib 

比如:
#elif defined IMGMULTIBIN
;  NAME          START ADDR    SIZE      TYPE
;  ----------------------------------------------------------------
NK            80220000      007DE000  RAMIMAGE  
SHELL        809FE000      00100000  RAMIMAGE  
APPS          80AFE000      00100000  RAMIMAGE  
CHAIN        80BFE000      00002000  RESERVED ; XIP chain info
RAM          80C00000      01000000  RAM        
pdwXIPLoc    00000000      80BFE000  FIXUPVAR  ; XIP pTOC

AUTOSIZE=ON          ;自动调整RAM 起始地址到 最近的 XIP region的末尾
ROM_AUTOSIZE=ON      ;每个分隔的XIP regin 的大小自动调整
DLLADDR_AUTOSIZE=ON  ;自动调整 dll地址空间大小根据 multiple XIP regions. 
XIPSCHAIN=80bfe000    ; 指定CHAIN region 在内存段的地址. 
Note  This address is applicable for the example provided in the previous step of this procedure. 
If you use a customized address for the CHAIN region or a different BSP, you will have to 
update this variable to match your settings 



pdwXIPLoc 必须定义START ADDR =00000000 SIZE=CHAIN的START ADDR
CHAIN 用来保存多个bin的chain info,CHAIN的位置和你bootloader代码有关,(cepc一般放在 NK region 后面)
所有的RAMIMAGE 必须在物理,虚拟地址上都连续
经验上每个bin 加32K (msdn:As a good practice, add the sizes of all files for a given region, 
and then add an extra 32K as a buffer. Adding this extra amount provides room for the files to 
reduce and expand as they change between each successive build)


2.修改platform.bib,把不同的部分放入到不动的region中 (其他bib也可以修改的)
比如
if IMGMULTIBIN
shell.exe  $(_FLATRELEASEDIR)\shell.exe  SHELL  SH
filesys.exe $(_FLATRELEASEDIR)\filesys.exe SHELL  SH
#else
shell.exe  $(_FLATRELEASEDIR)\shell.exe  NK  SH
filesys.exe $(_FLATRELEASEDIR)\filesys.exe NK  SH
#endif

表示把文件系统, shell放到 SHELL regin (shell.bin)


3.设置: 环境变量IMGMULTIBIN =1


4.在cfw.c中的OEMInit中的最后加上对InitRomChain的调用,来连接各个bin,最后连接到OEMRomChain 上!!!

void InitRomChain(void)
{
static  ROMChain_t s_pNextRom[MAX_ROM] = {0};
DWORD  dwRomCount = 0;
DWORD      dwChainCount = 0;
DWORD  *pdwCurXIP;
DWORD      dwNumXIPs;
PXIPCHAIN_ENTRY pChainEntry = NULL;

if(pdwXIPLoc == NOT_FIXEDUP)
{
return;  //pdwXIPLoc 必须是 FIXUPVAR ,否则表示没有chain或者设置不对
}

// set the top bit to mark it as a virtual address
pdwCurXIP = (DWORD*)(((DWORD)pdwXIPLoc) | 0x80000000);

// first DWORD is number of XIPs
dwNumXIPs = (*pdwCurXIP);  

if(dwNumXIPs > MAX_ROM)
{
lpWriteDebugStringFunc(TEXT("ERROR: Number of XIPs exceeds MAX\n"));
return;
}

pChainEntry = (PXIPCHAIN_ENTRY)(pdwCurXIP + 1);  //其实就是指向CHAIN 中chain info的相关信息

while(dwChainCount < dwNumXIPs)
{
if ((pChainEntry->usFlags & ROMXIP_OK_TO_LOAD) &&  // flags indicates valid XIP
*(LPDWORD)(((DWORD)(pChainEntry->pvAddr)) + ROM_SIGNATURE_OFFSET) == ROM_SIGNATURE)
{
s_pNextRom[dwRomCount].pTOC = *(ROMHDR **)(  ((DWORD)(pChainEntry->pvAddr)) + ROM_SIGNATURE_OFFSET + 4  );
s_pNextRom[dwRomCount].pNext = NULL;

if (dwRomCount != 0)
{
s_pNextRom[dwRomCount-1].pNext = &s_pNextRom[dwRomCount];
}
else
{
OEMRomChain = s_pNextRom;
}
dwRomCount++;
}
else
{
lpWriteDebugStringFunc( _T("Invalid XIP found\n") );
}

++pChainEntry;
dwChainCount++;
}
}




//在romldr.h中 定义了上面的相关的
typedef struct _XIPCHAIN_ENTRY {
LPVOID  pvAddr;                // address of the XIP
DWORD  dwLength;              // the size of the XIP
DWORD  dwMaxLength;            // the biggest it can grow to
USHORT  usOrder;                // where to put into ROMChain_t
USHORT  usFlags;                // flags/status of XIP
DWORD  dwVersion;              // version info
CHAR    szName[XIP_NAMELEN];    // Name of XIP, typically the bin file''s name, w/o .bin
DWORD  dwAlgoFlags;            // algorithm to use for signature verification
DWORD  dwKeyLen;              // length of key in byPublicKey
BYTE    byPublicKey[596];      // public key data
} XIPCHAIN_ENTRY, *PXIPCHAIN_ENTRY;

#define ROMXIP_OK_TO_LOAD      0x0001
#define ROMXIP_IS_SIGNED        0x0002

#define ROM_SIGNATURE_OFFSET 64   //0x40
#define ROM_SIGNATURE 0x43454345    //cece 4byte    =>ROMHDR 在0x44偏移处,
//每个bin 都有个pToc指向ROMHDR开头的地址,看下面的bin 文件结构,在0x44offset处地址里面放的是ROMHDR地址,开始是-1,由romimage.exe来设置的


//有点糊涂了 再分析下bin文件的结构
struct BinFile{ 
BYTE signature[7]; // = { ''''B'''', ''''0'''', ''''0'''', ''''0'''', ''''F'''', ''''F'''', ''''\a'''' } 
DWORD ImageStart 
DWORD ImageLength 
Record ImageRecords[RecordNum] 
}; 


struct Record{ 
DWORD address; 
DWORD length; 
DWORD chksum; 
}; 
在文件的最开端,会放置一个BinFile结构,imageStart和ImageLength分别对应镜像展开后在内存中存放的首地址和长度。
该结构中的RecordNum为不确定的,通常在最后一个记录之后增加一个address和Chksum都为0的纪录表示结束,
而这个表示结束的结构中的Length则标示其实际入口点。 
可以用viewbin -r 去看下nk.bin:
Image Start = 0x8C200000, length = 0x00E158C8
Start address = 0x8C201000
Checking record #22 for potential TOC (ROMOFFSET = 0xFF446658)
Checking record #177 for potential TOC (ROMOFFSET = 0x00000000)
Found pTOC  = 0x8d013950
ROMOFFSET = 0x00000000

ROMHDR ----------------------------------------
DLL First          : 0x01E401E7  
DLL Last            : 0x02000000  
Physical First      : 0x8C200000  
Physical Last      : 0x8D0158C8  
RAM Start          : 0x8E600000  
RAM Free            : 0x8E629000  
RAM End            : 0x8FF00000  
Kernel flags        : 0x00000002  
Prof Symbol Offset  : 0x00000000  
Num Copy Entries    :          1    
Copy Entries Offset : 0x8CC7AE8C  
Num Modules        :        166    
Num Files          :        95    
Kernel Debugger    :        No
CPU                :    0x01c2 (Thumb)
Extensions          : 0x8C20266C

ROMHDR Extensions -----------------------------
PID[0] = 0x00000000
PID[1] = 0x00000000
PID[2] = 0x00000000
PID[3] = 0x00000000
PID[4] = 0x00000000
PID[5] = 0x00000000
PID[6] = 0x00000000
PID[7] = 0x00000000
PID[8] = 0x00000000
PID[9] = 0x00000000
Next: 00000000

COPY Sections ---------------------------------
Src: 0x8CD18DA8  Dest: 0x8E606000  CLen: 0x228      DLen: 0x22B4C 

MODULES ---------------------------------------
11/20/2006  03:20:28      268800  nk.exe 
11/20/2006  03:25:22      550400  coredll.dll 
11/20/2006  03:25:22      205824  filesys.exe 
11/20/2006  03:25:22      723968  gwes.exe 
11/20/2006  03:09:08      25600  device.exe 
.......................
.......................
FILES ----------------------------------------
11/20/2006  03:10:42  C_R_      2897      12461                ceconfig.h (ROM 0x8C55E4AC)
11/20/2006  03:25:18  _HRS          0    694654                wince.nls (ROM 0x8CE36984)
5/09/2007  14:06:14  CHRS      3427      20574              initobj.dat (ROM 0x8C730280)
.......................
.......................
done.

分布结构:
Image :
Offset ----------- 
0x00 | ImageStart 


0x40 | Rom Signature { 0x43454345 } 
0x44 | Pointer to the ROMHDR for this Region 


0x???? | ROMHDR{                <-pToc所指
| }; 



Chain file 
struct _XIPCHAIN_ENTRY { 
LPVOID pvAddr; // address of the XIP 
DWORD dwLength; // the size of the XIP 
DWORD dwMaxLength; // the biggest it can grow to 
USHORT usOrder; // where to put into ROMChain_t 
USHORT usFlags; // flags/status of XIP 
DWORD dwVersion; // version info 
CHAR szName[XIP_NAMELEN]; // Name of XIP, typically the bin file''''s name, w/o .bin 
DWORD dwAlgoFlags; // algorithm to use for signature verification 
DWORD dwKeyLen; // length of key in byPublicKey 
BYTE byPublicKey[596]; // public key data 
}; 


Offset -------------------------- 
0x00 | DWORD Count; 
0x04 | XIPCHAIN_ENTRY[1]{ 
| }; 
| XIPCHAIN_ENTRY[2]{ 
| }; 
| ... 


二.关于OEMMultiBINNotify ,他是被blcommon 来调用,来让我们获得一个或多个 BIN regions的信息的
比如
用结构
typedef struct _MultiBINInfo_
{
DWORD dwNumRegions;
RegionInfo Region[BL_MAX_BIN_REGIONS];
} MultiBINInfo, *PMultiBINInfo;

定义一个MultiBINInfo    g_BINRegionInfo;全局变量在OEMMultiBINNotify中获得每个bin regins的信息

ReginInfo结构:
typedef struct _RegionInfo_
{
DWORD dwRegionStart;
DWORD dwRegionLength;
} RegionInfo, *PRegionInfo;

g_BINRegionInfo 被WriteRegionsToBootMedia 写regions到flash用到,
我用的是nandflash,
WriteRegionsToBootMedia中这段
// Look in the kernel region''s extension area for a multi-BIN extension descriptor.
// This region, if found, details the number, start, and size of each BIN region.
//
//for (nCount = 0, dwNumExts = 0 ; (nCount < g_BINRegionInfo.dwNumRegions) && !pChainInfo ; nCount++)
for (nCount = 0, dwNumExts = 0 ; (nCount < g_BINRegionInfo.dwNumRegions); nCount++)
{
// Does this region contain nk.exe and an extension pointer?
//
pExt = (EXTENSION *)GetKernelExtPointer(g_BINRegionInfo.Region[nCount].dwRegionStart,
g_BINRegionInfo.Region[nCount].dwRegionLength );
if ( pExt != NULL)
{
// If there is an extension pointer region, walk it until the end.
//
while (pExt)
{
DWORD dwBaseAddr = g_BINRegionInfo.Region[nCount].dwRegionStart;
pExt = (EXTENSION *)OEMMapMemAddr(dwBaseAddr, (DWORD)pExt);
EdbgOutputDebugString("INFO: OEMLaunch: Found chain extenstion: ''%s'' @ 0x%x\r\n", pExt->name, dwBaseAddr);
if ((pExt->type == 0) && !strcmp(pExt->name, "chain information"))
{
pChainInfo = (PXIPCHAIN_SUMMARY) OEMMapMemAddr(dwBaseAddr, (DWORD)pExt->pdata);
dwNumExts = (pExt->length / sizeof(XIPCHAIN_SUMMARY));
EdbgOutputDebugString("INFO: OEMLaunch: Found ''chain information'' (pChainInfo=0x%x  Extensions=0x%x).\r\n", (DWORD)pChainInfo, dwNumExts);
break;
}
pExt = (EXTENSION *)pExt->pNextExt;
}
}
else {
//  Search for Chain region. Chain region doesn''t have the ROMSIGNATURE set
DWORD  dwRegionStart = g_BINRegionInfo.Region[nCount].dwRegionStart;
DWORD  dwSig = *(LPDWORD) OEMMapMemAddr(dwRegionStart, dwRegionStart + ROM_SIGNATURE_OFFSET);

if ( dwSig != ROM_SIGNATURE) {
//  It is the chain
dwChainStart = dwRegionStart;
dwChainLength = g_BINRegionInfo.Region[nCount].dwRegionLength;
EdbgOutputDebugString("Found the Chain region: StartAddress: 0x%X; Length: 0x%X\n", dwChainStart, dwChainLength);
}
}
}

// nk.exe and an extension pointer  这个是什么意思,就是说nk.exe 包含一个扩展point是派什么用处的,那位知道告诉我


感觉是一个是bootlaod时的概念,一个是运行是的概念
bootlaoder时 :通过OEMMultiBINNotify 获得的信息来进行下载等应用

运行时,是根据config.bib中CHAIN的关于regions的信息,通过InitRomChain 来把他串起来,



三.toc block ,是和nand boot有关的东西

typedef struct _TOC {
DWORD              dwSignature;
// How to boot the images in this TOC.
// This could be moved into the image descriptor if desired,
// but I prefer to conserve space.
BOOT_CFG            BootCfg;

// Array of Image Descriptors.
IMAGE_DESCRIPTOR    id[MAX_TOC_DESCRIPTORS];

//    UCHAR Pad[12];      // align on SECTOR_SIZE
CHAININFO          chainInfo;
} TOC, *PTOC;          // 512 bytes


typedef struct _IMAGE_DESCRIPTOR {

// File version info
DWORD dwVersion;                    // e.g: build number
DWORD dwSignature;                  // e.g: "EBOT", "CFSH", etc
UCHAR ucString[IMAGE_STRING_LEN];  // e.g: "PocketPC_2002"

DWORD dwImageType;      // IMAGE_TYPE_ flags
DWORD dwTtlSectors;    // TTL image size in sectors.
// We store size in sectors instead of bytes
// to simplify sector reads in Nboot.

DWORD dwLoadAddress;    // Virtual address to load image (ImageStart)
DWORD dwJumpAddress;    // Virtual address to jump (StartAddress/LaunchAddr)

// This array equates to a sector-based MXIP MultiBINInfo in blcommon.
// Unused entries are zeroed.
// You could chain image descriptors if needed.
SG_SECTOR sgList[MAX_SG_SECTORS];

// BinFS support to load nk region only
//struct
//{
ULONG dwStoreOffset;    // byte offset - not needed - remove!
//ULONG RunAddress;    // nk dwRegionStart address
//ULONG Length;        // nk dwRegionLength in bytes
//ULONG LaunchAddress;  // nk dwLaunchAddr
//} NKRegion;

} IMAGE_DESCRIPTOR, *PIMAGE_DESCRIPTOR;

这些信息被写入block 1,
为nboot启动 nk,或 eboot提供信息的

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/435755.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

x210-II WinCE启动10s,还可继续优化

为提高boot引导速度&#xff0c;&#xff0c;需支持multibin。方法如下: 1.D:\WINCE600\PLATFORM\SMDKV210\SMDKV210.bat REM For Multiple XIP (using demand paging on BINFS) set IMGMULTIXIP1 2.调整config.bib镜像大小 由于系统生成的XIPKERNEL约为3M。大于默认设置。所…

【转】DICOM医学图像处理:DICOM网络传输

背景&#xff1a; 专栏取名为DICOM医学图像处理原因是&#xff1a;博主是从医学图像处理算法研究时开始接触DICOM协议的。当初认识有局限性&#xff0c;认为DICOM只是一个简单的文件格式约定&#xff0c;简而言之&#xff0c;我当时认为DICOM协议就是扩展名为DCM文件的格式说明…

symbian c++ 开发环境Carbide.c++搭建

需要的东东&#xff1a;JDK1.3.1以上(自带了&#xff0c;不用安装)&#xff0c;SDK 2.0 以上&#xff08;CW版本&#xff09;&#xff0c;perl5.8.x carbide.c 免费版本 所以的东西都默认安装,下一步-->下一步,^_^! 现在开发用的最多的可能就是VC6了&#xff0c;听说以…

【转】9、XAML名称空间详解

转自&#xff1a;9、XAML名称空间详解 - 种花生的读书人 - 博客园 XAML命名空间 <Window xmlns"http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x"http://schemas.microsoft.com/winfx/2006/xaml"> </Window> xmlnshttp:…

ASP.NET中使用非托管DLL

在ASP.NET窗体页面中使用非托管的DLL&#xff0c;则该DLL的部署则成了一大麻烦事&#xff0c;你把他放在bin目录下不管用&#xff0c;网上介绍了几种解决办法&#xff0c;貌似有点繁琐&#xff0c;其实只要新建一个程序集项目来封装这个DLL中被调用的函数&#xff0c;然后在Web…

【转】Linux的.a、.so和.o文件

转自&#xff1a;Linux的.a、.so和.o文件_chlele0105的专栏-CSDN博客 在说明Linux的.a、.so和.o文件关系之前&#xff0c;先来看看windows下obj,lib,dll,exe的关系 windows下obj,lib,dll,exe的关系 lib是和dll对应的。lib是静态链接库的库文件&#xff0c;dll是动态链接库的库…

wince使用自定义字体

在wince中使用自定义字体其实很简单&#xff0c;只要将自已的字体加到你的程序中就可以使用了&#xff0c;在使用完后再将其清除掉。以wince中加使用"Georgia”字体为例&#xff1a; 在程序初始化的时候将你的字体加载进程序 AddFontResource(L"NandFlash\\Font\\Geo…

Visual Studio 2008 十大新功能

VS2005还没有最终稳定的版本&#xff0c;但是我想在微软的某个办公室&#xff0c;一个项目组正在研究发展Visual Studio 2008这个版本。我看了一下表&#xff0c;现在的时间是公元2006-3-9日&#xff0c;离微软发布VS2008版的α版还有整整18个月&#xff0c;我不知道它最终会是…

【转】linx 设备名字来由 sd sr sg st

转自&#xff1a;/dev/sr0 与/dev/cdrom_luoweifeng1989的博客-CSDN博客_/dev/sr0 一直不知道 sda sdb sr0 这些名字的前两两个字母是什么意思 > > On Tue, Nov 3, 2009 at 9:34 AM, Derek Broughton > > <derekpointerstop.ca>wrote: > > Transla…

wince6.0中文内核定制

对WinCE体积进行剪裁&#xff0c;并让WinCE支持简体中文和英文显示&#xff0c;默认显示是中文,并以下对字体选取 作详细的说明&#xff1b; 关键操作步骤: 1.先创建一个WINCE内核工程. 2.先打开目标的工程文件&#xff0c;单击“Project”菜单&#xff0c;再单击“Properties-…

java 中的堆和栈

Java把内存划分成两种&#xff1a;一种是栈内存&#xff0c;一种是堆内存。 在函数中定义的一些基本类型的变量和对象的引用变量都在函数的栈内存中分配。 当在一段代码块定义一个变量时&#xff0c;Java就在栈中为这个变量分配内存空间&#xff0c;当超过变量的作用域后&#…

【转】ubuntu 开机sudo启动应用程序

转自&#xff1a;ubuntu 开机sudo启动应用程序_Honhy的博客-CSDN博客_sudo 启动应用 第一步&#xff1a;创建一个脚本(run.sh)&#xff0c;我是放在桌面&#xff0c;脚本内容为: echo "hon123"|sudo -S /home/python/qt/Tools/QtCreator/bin/qtcreator exit 0 橙色的…

WinCE Emulator使用介绍

最近用了一下WinCE的模拟器&#xff0c;我做WinCE有几年了&#xff0c;从来没有用过WinCE的模拟器&#xff0c;第一次接触WinCE的时候就是一块S3C2410的板子和PB4.2的开发平台&#xff0c;然后就开始折腾&#xff0c;后来各种开发板都用过&#xff0c;WinCE也从4.2版本用到了6.…

lucene中对不同的域使用不同的分析器

在lucene使用过程中&#xff0c;如果要对同一IndexWriter中不同Document&#xff0c;不同Field中使用不同的analyzer&#xff0c;我们该如何实现呢&#xff1f; 通过对《lucene in action》的阅读&#xff0c;发现是可以解决这一问题的。lucene可以正对整个IndexWriter对象或者…

【转】Ubuntu Desktop下自动启动终端并运行脚本

转自&#xff1a;Ubuntu Desktop下自动启动终端并运行脚本 - 简书 alexubuntu19:~# lsb_release -a No LSB modules are available. Distributor ID: Ubuntu Description: Ubuntu 19.04 Release: 19.04 Codename: disco alexubuntu19:~# uname -a Linux ubunt…

使用js实现换肤功能

Skin.html <html xmlns"http://www.w3.org/1999/xhtml"> <head> <meta http-equiv"Content-Type" content"text/html; charsetgb2312" /> <title>网页焕肤</title> <style type"text/css"> #main…

【转】开机出现 error:file “/boot/grub/i386-pc/normal.mod“ not found 错误提示

今天用ubuntu启动盘格式化了一个分区后&#xff0c;更改了分区顺序&#xff0c;导致找不到normal.mod文件。 现在openSUSE系统无法启动。 error:file "/boot/grub/i386-pc/normal.mod" not found grub rescue> 在网上查询了很多&#xff0c;步骤如下&#xff…

VB用API实现各种对话框(总结)(转载)

标准对话框(SmDialog) Option Explicit 定义一个全局变量,用于保存字体的各种属性 Public Type SmFontAttr FontName As String 字体名 FontSize As Integer 字体大小 FontBod As Boolean 是否黑体 FontItalic As Boolean 是否斜体 FontUnderLine …

【转】DICOM简述!!!!

转自&#xff1a;DICOM简述 - 简书 视频教程&#xff1a;https://www.bilibili.com/video/av66144772 DICOM&#xff08;Digital Imaging and Communications in Medicine&#xff09;即医学数字成像和通信&#xff0c;是医学图像和相关信息的国际标准&#xff08;ISO 12052&…

WinCE OAL中的OEMIoControl函数

关于OEMIoControl函数&#xff0c;我在2008年1月份写过一篇blog叫“WinCE BSP中OAL层中的OEMIoControl介绍”&#xff0c;已经比较详细的介绍了OEMIoControl&#xff0c;今天在这里只是对OEMIoControl中比较常用的case说一说。看看PB的文档就知道OEMIoControl可以包含很多case而…