首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

[分享]编写Windows CE之映射

[分享]编写Windows CE之映射

Windows CE同样支持无名和有名的内存映射文件。在开发软件的过程中,如果需要读写大容量的文件,或者需要在不同进程内的线程之间通信,最好采用内存映射文件,而且最好在全局地址空间内(0x4200 00000x7FFF FFFF)分配。这会事半功倍。

嵌入式系统采用两级页表的方式进行虚实地址变换,这与所用的处理器有关。比如ARM平台下,有1MB64KB4KB1KB四种页面大小; X86下则是4KB4MB

Windows CE提供内置的轻量级数据库管理系统。其属性数据库由1张包含记录的表组成,每个记录包含许多不同的属性,每个属性有3种信息:标志属性的ID号、类型和值。

全局地址空间(0x4200 00000x7FFF FFFF)近1GB的空间应该足够用了。毕竟Windows CE下的文件都很小。

实现地址映射的思路:

l 分析逻辑地址,包括页号和页内偏移地址;

l 查找页表,即物理页面;

l 合成实际物理地址,物理地址=物理页面*2N次方+偏移地址;

l

映射数据文件的基本步骤:

1、调用CreateFileForMapping函数。

l 参数1:指定文件路径,注意文件路径的格式是没有盘符的;

l 参数2:指定访问方式(读或写);

l 参数3:指定共享模式;

l 参数4:指定安全属性(NULL);

l 参数5:指定是创建还是打开文件;

l 参数6:指定文件属性;

l 参数7:略;

2、调用CreateFileMapping函数。创建一个无名的或者有名的内存映射文件对象。

l 参数1:函数返回值;

l 参数2:安全属性(NULL);

l 参数3:指定要映射的文件的保护属性(只读OR读写);

l 参数4:指定要映射的文件的大小,最高32位数;

l 参数5:与参数4共同用于指定要映射的文件的大小,最低32位数;

l 参数6:指定内存映射文件的名称(NULL);

3、调用MapViewOfFile函数。用于保留一段足够的地址空间,并且将永久存储器上的文件数据映射到这个地址空间。

l 参数1:指定内存映射文件对象,函数返回值;

l 参数2:用于限定访问权限;

l 参数3:指定映射区域的开始位置,最高32位数;

l 参数4:和参数3共同用于指定映射区域的开始位置,最低32位数。

4、进行读/写操作;(前提是调用MapViewOfFile函数成功)

5、调用UnmapViewOfFile函数。撤销文件映射视图,执行结束。

l 参数1:指定视图首地址;

6、调用CloseHandle函数。关闭内存映射文件对象。

1、调用CreateFileForMapping函数。

l 参数1:指定文件路径,注意文件路径的格式是没有盘符的;

l 参数2:指定访问方式(读或写);

l 参数3:指定共享模式;

l 参数4:指定安全属性(NULL);

l 参数5:指定是创建还是打开文件;

l 参数6:指定文件属性;

l 参数7:略;

2、调用CreateFileMapping函数。创建一个无名的或者有名的内存映射文件对象。

l 参数1:函数返回值;

l 参数2:安全属性(NULL);

l 参数3:指定要映射的文件的保护属性(只读OR读写);

l 参数4:指定要映射的文件的大小,最高32位数;

l 参数5:与参数4共同用于指定要映射的文件的大小,最低32位数;

l 参数6:指定内存映射文件的名称(NULL);

3、调用MapViewOfFile函数。用于保留一段足够的地址空间,并且将永久存储器上的文件数据映射到这个地址空间。

l 参数1:指定内存映射文件对象,函数返回值;

l 参数2:用于限定访问权限;

l 参数3:指定映射区域的开始位置,最高32位数;

l 参数4:和参数3共同用于指定映射区域的开始位置,最低32位数。

4、进行读/写操作;(前提是调用MapViewOfFile函数成功)

5、调用UnmapViewOfFile函数。撤销文件映射视图,执行结束。

l 参数1:指定视图首地址;

6、调用CloseHandle函数。关闭内存映射文件对象。

l 参数6:指定文件属性;

l 参数7:略;

2、调用CreateFileMapping函数。创建一个无名的或者有名的内存映射文件对象。

l 参数1:函数返回值;

l 参数2:安全属性(NULL);

l 参数3:指定要映射的文件的保护属性(只读OR读写);

l 参数4:指定要映射的文件的大小,最高32位数;

l 参数5:与参数4共同用于指定要映射的文件的大小,最低32位数;

l 参数6:指定内存映射文件的名称(NULL);

3、调用MapViewOfFile函数。用于保留一段足够的地址空间,并且将永久存储器上的文件数据映射到这个地址空间。

l 参数1:指定内存映射文件对象,函数返回值;

l 参数2:用于限定访问权限;

l 参数3:指定映射区域的开始位置,最高32位数;

l 参数4:和参数3共同用于指定映射区域的开始位置,最低32位数。

4、进行读/写操作;(前提是调用MapViewOfFile函数成功)

5、调用UnmapViewOfFile函数。撤销文件映射视图,执行结束。

l 参数1:指定视图首地址;

6、调用CloseHandle函数。关闭内存映射文件对象。

l 参数4:指定要映射的文件的大小,最高32位数;

l 参数5:与参数4共同用于指定要映射的文件的大小,最低32位数;

l 参数6:指定内存映射文件的名称(NULL);

3、调用MapViewOfFile函数。用于保留一段足够的地址空间,并且将永久存储器上的文件数据映射到这个地址空间。

l 参数1:指定内存映射文件对象,函数返回值;

l 参数2:用于限定访问权限;

l 参数3:指定映射区域的开始位置,最高32位数;

l 参数4:和参数3共同用于指定映射区域的开始位置,最低32位数。

4、进行读/写操作;(前提是调用MapViewOfFile函数成功)

5、调用UnmapViewOfFile函数。撤销文件映射视图,执行结束。

l 参数1:指定视图首地址;

6、调用CloseHandle函数。关闭内存映射文件对象。

l 参数3:指定映射区域的开始位置,最高32位数;

l 参数4:和参数3共同用于指定映射区域的开始位置,最低32位数。

4、进行读/写操作;(前提是调用MapViewOfFile函数成功)

5、调用UnmapViewOfFile函数。撤销文件映射视图,执行结束。

l 参数1:指定视图首地址;

6、调用CloseHandle函数。关闭内存映射文件对象。

映射文件与虚拟内存一样,内存映射文件用来保留一个地址空间,并提交物理存储器。

内存映射文件的特点使它很适合于加载EXEDLL文件。这样可以节省内存又减少了加载所需时间。还可以使用它来映射大容量的文件,这样就不必在读取文件数据前设置很大的缓冲区。

另外,内存映射文件常用于进程间通信,也是进程间通信的主要手段,其它进程之间通信机制都是基于内存映射文件来实现。

为了更快的在进程之间通信,现在的内存映射文件也可以提交物理内存,这样内存映射文件既可以提交物理内存又可以提交文件。

Windows CE支持内存分页么
Windows CE支持各种CPU和能够以多种方式被配置,每种方式带有一个不同的API,开发环境怎样才能知道目标平台呢?
静待高手解答,谢谢~
QUOTE:
以下是引用理查德在2008-6-30 18:06:00的发言:
Windows CE支持内存分页么

支持。但是它不支持页面文件以保存辅助设备(如硬盘)的读/写型数据。

QUOTE:
以下是引用理查德在2008-6-30 18:07:00的发言:
Windows CE支持各种CPU和能够以多种方式被配置,每种方式带有一个不同的API,开发环境怎样才能知道目标平台呢?

MS已经开发了一组Windows CE开发工具,某些兼容所有的平台,某些仅支持手持电脑和其他专门的系统。

QUOTE:
以下是引用理查德在2008-6-30 18:06:00的发言:
Windows CE支持内存分页么

支持。但是它不支持页面文件以保存辅助设备(如硬盘)的读/写型数据。

QUOTE:
以下是引用理查德在2008-6-30 18:07:00的发言:
Windows CE支持各种CPU和能够以多种方式被配置,每种方式带有一个不同的API,开发环境怎样才能知道目标平台呢?

MS已经开发了一组Windows CE开发工具,某些兼容所有的平台,某些仅支持手持电脑和其他专门的系统。

返回列表