如何分配存储内存和程序内存

=============================================================
标题:如何分配存储内存和程序内存

摘要:

备注:Windows CE
日期:2010.4.25
姓名:朱铭雷

=============================================================

Windows CE
的系统内存通常只有几十M,我们公司的设备除去系统运行时占用的内存之外,还剩余50几M留给用户使用。这50几M的内存是存储内存和程序内存的总和。关于两者比例大小的调节可以利用“控制面板 | 系统 | 内存”中的滑块来调节。


程序内存无非就是我们的程序可以使用的内存。如果程序内存分配的很小,很可能你使用CreateThread建立一个线程都会失败。


存储内存用来保存一些系统的重要数据。其实具体的功能我也还没清楚,等有时间的时候再仔细研究下。反正当通过VS2005在线调试程序的时候,VS需要先将程序部署到CE下,这时候就需要使用存储内存。调试程序的时候,如果提示“磁盘空间不足”,导致部署失败。这个时候看看那个控制内存的滑动条,很可能是移到了最左边。


关于程序内存和存储内存,系统默认的是对等分。但是这样做不怎么合理,会导致我们程序可以使用的内存较少。所以通常我们需要自己修改下。


微软提供给我们三种方法:

(1) statically using FSRAMPERCENT
(2) during boot using pOEMCalcFSPages
(3) using api SetSystemMemoryDivision



最常用的是修改FSRAMPERCENT的值。


以如下config.bib文件中的定义为例:

CONFIG

AUTOSIZE=ON



IF IMGTINYFSRAM



FSRAMPERCENT=0x10203040

ENDIF
存在如下关系式:


假设 FSRAMPERCENT = 0xQXYZ, 其中Q,X,Y,Z都是十六进制数。则Storage Memory的大小 = ( Q + X + Y + Z ) / 0x400 * TOTAL_RAM_SIZE。假设TOTAL_RAM_SIZE为64M。则Storage Memory = (0x10 + 0x20 + 0x30 + 0x40) / 0x400 * 64M = 10M。



在OAL中调用pOEMCalcFSPages,pOEMCalcFSPages的定义在

/PRIVATE/WINCEOS/COREOS/NK/KERNEL下loader.c文件中:

DWORD (*pOEMCalcFSPages)(DWORD dwMemPages, DWORD dwDefaultFSPages);


使用SetSystemMemoryDivision系统API函数动态修改,这个在网络上流传着这样一段代码,具体的自己也没有试过:

  1. typedef DWORD
  2. (*SETSYSTEMMEMORYDIVISION)(DWORD);
  3. typedef BOOL
  4. (*GETSYSTEMMEMORYDIVISION)(LPDWORD,LPDWORD,LPDWORD);
  5. void SetObjectMemorySpace(int nSize)
  6. {
  7. #ifdef _WIN32_WCE
  8.     //从动态库中获取函数地址以设置对象存储区的大小.
  9.     HINSTANCE hDll =
  10. LoadLibrary(_T("Coredll.dll"));
  11.     SETSYSTEMMEMORYDIVISION    SetSystemMemoryDivisionProc = NULL;
  12.     GETSYSTEMMEMORYDIVISION    GetSystemMemoryDivisionProc = NULL;
  13.     if( NULL != hDll )
  14.     {
  15.         //获取导出函数地址
  16.         SetSystemMemoryDivisionProc
  17. =
  18. (SETSYSTEMMEMORYDIVISION)GetProcAddress(hDll,_T("SetSystemMemoryDivision"));
  19.         GetSystemMemoryDivisionProc
  20. =
  21. (GETSYSTEMMEMORYDIVISION)GetProcAddress(hDll,_T("GetSystemMemoryDivision"));
  22.         if(SetSystemMemoryDivisionProc
  23. && GetSystemMemoryDivisionProc)
  24.         {
  25.             DWORD
  26. dwStorePages = 0;
  27.             DWORD
  28. dwRamPages = 0;
  29.             DWORD
  30. dwPageSize = 0;
  31.             BOOL bRet =
  32. (*GetSystemMemoryDivisionProc)(&dwStorePages,&dwRamPages,&dwPageSize);
  33.             if(bRet)
  34.             {
  35.                 int
  36. nPageCount = nSize/dwPageSize;
  37.                 if(nSize%dwPageSize
  38. != 0)
  39.                 {
  40.                     nPageCount++;
  41.                 }
  42.                 (*SetSystemMemoryDivisionProc)(nPageCount);
  43.             }
  44.         }
  45.         SetSystemMemoryDivisionProc
  46. = NULL;
  47.         GetSystemMemoryDivisionProc
  48. = NULL;
  49.         FreeLibrary(hDll);
  50.         hDll = NULL;
  51.     }
  52. #endif
  53. }
复制代码


关于FSRAMPERCENT的介绍,也可以查看下Windows CE的帮助文档:

[url=ms-help://MS.WindowsCE.500/wceosdev5/html/wce50conDevelopingOperatingSystem.htm]Developing an Operating System[/url] > [url=ms-help://MS.WindowsCE.500/wceosdev5/html/wce50conBuildSystem.htm]Build System[/url] > [url=ms-help://MS.WindowsCE.500/wceosdev5/html/wce50conPlatformConfigurationFiles.htm]OS Design Configuration Files[/url] > [url=ms-help://MS.WindowsCE.500/wceosdev5/html/wce50conImageConfigurationFiles.htm]Run-Time Image Configuration Files[/url] > [url=ms-help://MS.WindowsCE.500/wceosdev5/html/wce50conBinaryImageBuilderFile.htm]Binary Image Builder File[/url] > [url=ms-help://MS.WindowsCE.500/wceosdev5/html/wce50conCONFIGSection.htm]CONFIG Section[/url]

你可能感兴趣的:(windows,image,null,url,存储,System)