7954|23

80

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

WinCE5.0/Mobile 6.0可以分配的最大虚拟内存为多大? [复制链接]

WinCE5.0/Mobile 6.0可以分配的最大虚拟内存为多大?

     用Windows Mobile 6.0 中文版镜像模拟器做内存映射应用;CE的4GB可寻址空间中,Slotes33-Slotes63的全局地址空间(0x4200 0000到0x7FFF FFFF)这近1GB的空间,是用来分配虚拟内存和文件存储的。但是经过实践,发现通过CreateFileMapping()函数似乎只能一次最多申请64MB的虚拟内存空间。
     想应用内存映射技术把串口收到的数据实时保存到内存映射区,然后再保存成日志文件。
     想一次申请512MB或是256MB的内存映射空间,不知道有啥方法?
此帖出自WindowsCE论坛

最新回复

看来增加系统的SDRAM后在进一步验证吧  详情 回复 发表于 2009-6-10 16:32
点赞 关注
 

回复
举报

70

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
试试HeapCreate来创建一个独立堆,然后再去这个独立堆上面用HeapAlloc来分配一个大的内存块。
如果实在不行,
可以定义一个指针数组,
然后写一个循环,在里面调用几次CreateFileMapping把申请到的几个Handle放在这个数组里,
把这个数组从逻辑上看成是一个连续的大的空间。
此帖出自WindowsCE论坛
 
 
 

回复

63

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
学习
此帖出自WindowsCE论坛
 
 
 

回复

72

帖子

0

TA的资源

一粒金砂(初级)

4
 
使用以下语句用于创建内存映射访问的文件:

  1. //path 为程序的执行路径CString变量
  2. hFile = CreateFileForMapping(path + _T("\\Log.txt"),GENERIC_READ|GENERIC_WRITE,FILE_SHARE_READ|FILE_SHARE_WRITE,NULL,OPEN_ALWAYS,FILE_ATTRIBUTE_ARCHIVE,NULL);
复制代码

打开内存映射文件对象:

  1. hMapFile = CreateFileMapping(hFile,    // Current file handle.
  2.                 NULL,                      // Default security.
  3.                 PAGE_READWRITE,              // Read/write permission.
  4.                 0,                      // 文件的最大字节数高32位
  5.                 qwFileSize,              // 文件的最大字节数低32位(本例在CE系统下为64MB)
  6.                 NULL);
复制代码

获取内存映射文件对象视图:

  1. //获取部分映射文件视图,在映射时,需要指定映射区域的开始位置qwFileOffset以及映射区域的大小dwBytesInBlock(64MB)
  2. lpMapView = (PBYTE)MapViewOfFile(hMapFile,FILE_MAP_WRITE,(DWORD)(qwFileOffset>>32),(DWORD)(qwFileOffset&0xFFFFFFFF),0/*dwBytesInBlock*/);
复制代码


这三句都可以编译链接运行通过,hFile和hMapFile及lpMapView返回都为有效值,但是通过WinCE Mobile6.0模拟器运行,产生的Log.txt占用的空间不是64MB,是3.81MB,何解呢?

       
此帖出自WindowsCE论坛
 
 
 

回复

72

帖子

0

TA的资源

一粒金砂(初级)

5
 
ding...
此帖出自WindowsCE论坛
 
 
 

回复

66

帖子

0

TA的资源

一粒金砂(初级)

6
 

此帖出自WindowsCE论坛
 
 
 

回复

64

帖子

0

TA的资源

一粒金砂(初级)

7
 
步骤没有错..影射过2个16M的没问题,不知道你的qwFileSize是多少?
此帖出自WindowsCE论坛
 
 
 

回复

77

帖子

0

TA的资源

一粒金砂(初级)

8
 
这和可用的你物理内存有关系。。。
此帖出自WindowsCE论坛
 
 
 

回复

82

帖子

0

TA的资源

一粒金砂(初级)

9
 
如果物理内存只有64MB,你申请了65MB虚拟内存,那后1MB存在哪里呢?wince下不支持页面交换功能的(如果支持,flash很快就完蛋了)。
此帖出自WindowsCE论坛
 
 
 

回复

72

帖子

0

TA的资源

一粒金砂(初级)

10
 
引用 6 楼 papapa123123 的回复:
步骤没有错..影射过2个16M的没问题,不知道你的qwFileSize是多少?

我用的是Mobile 6.0 CHS的模拟器,128MB的模拟内存,,使用VS2005联调,qwFileSize设为64MB,但是实际产生的Log.txt占用的空间是3.81MB
此帖出自WindowsCE论坛
 
 
 

回复

90

帖子

0

TA的资源

一粒金砂(初级)

11
 
引用 8 楼 shuiyan 的回复:
如果物理内存只有64MB,你申请了65MB虚拟内存,那后1MB存在哪里呢?wince下不支持页面交换功能的(如果支持,flash很快就完蛋了)。


在 Windows CE 下申请大容量物理内存(作者:付林林)
http://www.vckbase.com:80/document/viewdoc/?id=1156
中提到“Windows CE.NET同样支持无名和有名的内存映射文件。我建议在开发软件的过程中,如果需要读写大容量的文件,或者需要在不同进程内的线程之间通信,最好采用内存映射文件,而且最好在全局地址空间内(0x4200 0000到0x7FFF FFFF)分配。这会使我们事半功倍。”

那我该如何在全局地址空间内(0x4200 0000到0x7FFF FFFF)--(这范围大约有1GB的空间)用CreateFileMapping()函数分配内存映射对象呢?
此帖出自WindowsCE论坛
 
 
 

回复

62

帖子

0

TA的资源

一粒金砂(初级)

12
 
很多资料都说:
Windows CE是一个32位的操作系统,支持4GB的虚拟地址空间,上面2GB是内核空间,下面2GB是用户空间,其中0x4200 0000-0x7FFF FFFF之间的内存被用作大内存分配0x0000 0000-0x41FF FFFF之间的内存被分成33个slot,每个32MB。

那我该如何在全局地址空间内(0x4200 0000到0x7FFF FFFF)--(这范围大约有1GB的空间)用CreateFileMapping()函数分配内存映射对象呢?
此帖出自WindowsCE论坛
 
 
 

回复

83

帖子

0

TA的资源

一粒金砂(初级)

13
 
学习
此帖出自WindowsCE论坛
 
 
 

回复

79

帖子

0

TA的资源

一粒金砂(初级)

14
 
帮顶.
此帖出自WindowsCE论坛
 
 
 

回复

52

帖子

0

TA的资源

一粒金砂(初级)

15
 
引用 10 楼 iwillbeback008 的回复:
引用 8 楼 shuiyan 的回复:
如果物理内存只有64MB,你申请了65MB虚拟内存,那后1MB存在哪里呢?wince下不支持页面交换功能的(如果支持,flash很快就完蛋了)。


在 Windows CE 下申请大容量物理内存(作者:付林林)
http://www.vckbase.com:80/document/viewdoc/?id=1156
中提到“Windows CE.NET同样支持无名和有名的内存映射文件。我建议在开发软件的过程中,如果需要读写大容量的文件,或者需要在不同进程内的线程之…

内存映射,该空间终究还是在内存中。当然你可以专门设置到flash中,但前提是要考虑好对flash的损坏(SLC NAND擦写次数10W次,MLC NAND 1W次),还有读写的速度会受极大的限制。

申请的物理内存最大也就是实际物理内存的容量。

可访问的地址空间可以超过实际物理内存容量。
此帖出自WindowsCE论坛
 
 
 

回复

58

帖子

0

TA的资源

一粒金砂(初级)

16
 
很多资料都说:
Windows CE是一个32位的操作系统,支持4GB的虚拟地址空间,上面2GB是内核空间,下面2GB是用户空间,其中0x4200 0000-0x7FFF FFFF之间的内存被用作大内存分配0x0000 0000-0x41FF FFFF之间的内存被分成33个slot,每个32MB。

那我该如何在全局地址空间内(0x4200 0000到0x7FFF FFFF)--(这范围大约有1GB的空间)用CreateFileMapping()函数分配内存映射对象呢?
此帖出自WindowsCE论坛
 
 
 

回复

69

帖子

0

TA的资源

一粒金砂(初级)

17
 
关注中。。。
此帖出自WindowsCE论坛
 
 
 

回复

87

帖子

0

TA的资源

一粒金砂(初级)

18
 
你想解决的问题到底是什么?为了实现一个LOG功能需要几百兆内存?PC机上都没这么用的。
此帖出自WindowsCE论坛
 
 
 

回复

85

帖子

0

TA的资源

一粒金砂(初级)

19
 
引用 17 楼 singlerace 的回复:
你想解决的问题到底是什么?为了实现一个LOG功能需要几百兆内存?PC机上都没这么用的。

难道你在PC机上没有用过内存映射么?

问题的关键不是说"为了实现一个LOG功能需要几百兆内存",而是如何:


Windows CE是一个32位的操作系统,支持4GB的虚拟地址空间,上面2GB是内核空间,下面2GB是用户空间,其中0x4200 0000-0x7FFF FFFF之间的内存被用作大内存分配0x0000 0000-0x41FF FFFF之间的内存被分成33个slot,每个32MB。

那我该如何在全局地址空间内(0x4200 0000到0x7FFF FFFF)--(这范围大约有1GB的空间)用CreateFileMapping()函数分配内存映射对象呢?
此帖出自WindowsCE论坛
 
 
 

回复

66

帖子

0

TA的资源

一粒金砂(初级)

20
 
学习
此帖出自WindowsCE论坛
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表