口袋数码论坛's Archiver

口袋怪 发表于 2008-6-18 11:12

编写Windows CE之映射

[color=black][font=Verdana][size=10.5pt]Windows CE[/size][/font][/color][color=black][font=宋体][size=10.5pt]同样支持无名和有名的内存映射文件。在开发软件的过程中,如果需要读写大容量的文件,或者需要在不同进程内的线程之间通信,最好采用内存映射文件,而且最好在全局地址空间内([/size][/font][/color][color=black][font=Verdana][size=10.5pt]0x4200 0000[/size][/font][/color][color=black][font=宋体][size=10.5pt]到[/size][/font][/color][color=black][font=Verdana][size=10.5pt]0x7FFF FFFF[/size][/font][/color][color=black][font=宋体][size=10.5pt])分配。这会事半功倍。[/size][/font][/color][color=black][font=Verdana][size=10.5pt][/size][/font][/color]
[color=black][font=宋体][size=10.5pt]嵌入式系统采用两级页表的方式进行虚实地址变换,这与所用的处理器有关。比如[/size][/font][/color][color=black][font=Verdana][size=10.5pt]ARM[/size][/font][/color][color=black][font=宋体][size=10.5pt]平台下,有[/size][/font][/color][color=black][font=Verdana][size=10.5pt]1MB[/size][/font][/color][color=black][font=宋体][size=10.5pt],[/size][/font][/color][color=black][font=Verdana][size=10.5pt]64KB[/size][/font][/color][color=black][font=宋体][size=10.5pt],[/size][/font][/color][color=black][font=Verdana][size=10.5pt]4KB[/size][/font][/color][color=black][font=宋体][size=10.5pt],[/size][/font][/color][color=black][font=Verdana][size=10.5pt]1KB[/size][/font][/color][color=black][font=宋体][size=10.5pt]四种页面大小;[/size][/font][/color][color=black][font=Verdana][size=10.5pt] X86[/size][/font][/color][color=black][font=宋体][size=10.5pt]下则是[/size][/font][/color][color=black][font=Verdana][size=10.5pt]4KB[/size][/font][/color][color=black][font=宋体][size=10.5pt]和[/size][/font][/color][color=black][font=Verdana][size=10.5pt]4MB[/size][/font][/color][color=black][font=宋体][size=10.5pt]。[/size][/font][/color][color=black][font=Verdana][size=10.5pt][/size][/font][/color]
[color=black][font=Verdana][size=10.5pt][/size][/font][/color]
[color=black][font=Verdana][size=10.5pt]Windows CE[/size][/font][/color][color=black][font=宋体][size=10.5pt]提供内置的轻量级数据库管理系统。其属性数据库由[/size][/font][/color][color=black][font=Verdana][size=10.5pt]1[/size][/font][/color][color=black][font=宋体][size=10.5pt]张包含记录的表组成,每个记录包含许多不同的属性,每个属性有[/size][/font][/color][color=black][font=Verdana][size=10.5pt]3[/size][/font][/color][color=black][font=宋体][size=10.5pt]种信息:标志属性的[/size][/font][/color][color=black][font=Verdana][size=10.5pt]ID[/size][/font][/color][color=black][font=宋体][size=10.5pt]号、类型和值。[/size][/font][/color][color=black][font=Verdana][size=10.5pt][/size][/font][/color]
[color=black][font=宋体][size=10.5pt]全局地址空间([/size][/font][/color][color=black][font=Verdana][size=10.5pt]0 x 4200 0000[/size][/font][/color][color=black][font=宋体][size=10.5pt]到[/size][/font][/color][color=black][font=Verdana][size=10.5pt]0 x 7FFF  FFFF[/size][/font][/color][color=black][font=宋体][size=10.5pt])近[/size][/font][/color][color=black][font=Verdana][size=10.5pt]1GB[/size][/font][/color][color=black][font=宋体][size=10.5pt]的空间应该足够用了。毕竟[/size][/font][/color][color=black][font=Verdana][size=10.5pt]Windows CE[/size][/font][/color][color=black][font=宋体][size=10.5pt]下的文件都很小。[/size][/font][/color][color=black][font=Verdana][size=10.5pt][/size][/font][/color]
[color=black][font=Verdana][size=10.5pt][/size][/font][/color]
[b][color=black][font=宋体][size=10.5pt]实现地址映射的思路:[/size][/font][/color][/b][b][color=black][font=Verdana][size=10.5pt][/size][/font][/color][/b]
[color=black][font=Wingdings][size=10.5pt]l
[/size][/font][/color][color=black][font=宋体][size=10.5pt]分析逻辑地址,包括页号和页内偏移地址;[/size][/font][/color][color=black][font=Verdana][size=10.5pt][/size][/font][/color]
[color=black][font=Wingdings][size=10.5pt]l
[/size][/font][/color][color=black][font=宋体][size=10.5pt]查找页表,即物理页面;[/size][/font][/color][color=black][font=Verdana][size=10.5pt][/size][/font][/color]
[color=black][font=Wingdings][size=10.5pt]l
[/size][/font][/color][color=black][font=宋体][size=10.5pt]合成实际物理地址,物理地址[/size][/font][/color][color=black][font=Verdana][size=10.5pt]=[/size][/font][/color][color=black][font=宋体][size=10.5pt]物理页面[/size][/font][/color][color=black][font=Verdana][size=10.5pt]*2[/size][/font][/color][color=black][font=宋体][size=10.5pt]的[/size][/font][/color][color=black][font=Verdana][size=10.5pt]N[/size][/font][/color][color=black][font=宋体][size=10.5pt]次方[/size][/font][/color][color=black][font=Verdana][size=10.5pt]+[/size][/font][/color][color=black][font=宋体][size=10.5pt]偏移地址;[/size][/font][/color][color=black][font=Verdana][size=10.5pt][/size][/font][/color]
[color=black][font=Wingdings][size=10.5pt]l
[/size][/font][/color][color=black][font=Verdana][size=10.5pt][/size][/font][/color]
[b][color=black][font=宋体][size=10.5pt]映射数据文件的基本步骤:[/size][/font][/color][/b][b][color=black][font=Verdana][size=10.5pt][/size][/font][/color][/b]
[b][color=black][font=Verdana][size=10.5pt]1[/size][/font][/color][/b][b][color=black][font=宋体][size=10.5pt]、调用[/size][/font][/color][/b][b][color=black][font=Verdana][size=10.5pt]CreateFileForMapping[/size][/font][/color][/b][b][color=black][font=宋体][size=10.5pt]函数。[/size][/font][/color][/b][b][color=black][font=Verdana][size=10.5pt][/size][/font][/color][/b]
[color=black][font=Wingdings][size=10.5pt]l
[/size][/font][/color][color=black][font=宋体][size=10.5pt]参数[/size][/font][/color][color=black][font=Verdana][size=10.5pt]1[/size][/font][/color][color=black][font=宋体][size=10.5pt]:指定文件路径,注意文件路径的格式是没有盘符的;[/size][/font][/color][color=black][font=Verdana][size=10.5pt][/size][/font][/color]
[color=black][font=Wingdings][size=10.5pt]l
[/size][/font][/color][color=black][font=宋体][size=10.5pt]参数[/size][/font][/color][color=black][font=Verdana][size=10.5pt]2[/size][/font][/color][color=black][font=宋体][size=10.5pt]:指定访问方式(读或写);[/size][/font][/color][color=black][font=Verdana][size=10.5pt][/size][/font][/color]
[color=black][font=Wingdings][size=10.5pt]l
[/size][/font][/color][color=black][font=宋体][size=10.5pt]参数[/size][/font][/color][color=black][font=Verdana][size=10.5pt]3[/size][/font][/color][color=black][font=宋体][size=10.5pt]:指定共享模式;[/size][/font][/color][color=black][font=Verdana][size=10.5pt][/size][/font][/color]
[color=black][font=Wingdings][size=10.5pt]l
[/size][/font][/color][color=black][font=宋体][size=10.5pt]参数[/size][/font][/color][color=black][font=Verdana][size=10.5pt]4[/size][/font][/color][color=black][font=宋体][size=10.5pt]:指定安全属性([/size][/font][/color][color=black][font=Verdana][size=10.5pt]NULL[/size][/font][/color][color=black][font=宋体][size=10.5pt]);[/size][/font][/color][color=black][font=Verdana][size=10.5pt][/size][/font][/color]
[color=black][font=Wingdings][size=10.5pt]l
[/size][/font][/color][color=black][font=宋体][size=10.5pt]参数[/size][/font][/color][color=black][font=Verdana][size=10.5pt]5[/size][/font][/color][color=black][font=宋体][size=10.5pt]:指定是创建还是打开文件;[/size][/font][/color][color=black][font=Verdana][size=10.5pt][/size][/font][/color]
[color=black][font=Wingdings][size=10.5pt]l
[/size][/font][/color][color=black][font=宋体][size=10.5pt]参数[/size][/font][/color][color=black][font=Verdana][size=10.5pt]6[/size][/font][/color][color=black][font=宋体][size=10.5pt]:指定文件属性;[/size][/font][/color][color=black][font=Verdana][size=10.5pt][/size][/font][/color]
[color=black][font=Wingdings][size=10.5pt]l
[/size][/font][/color][color=black][font=宋体][size=10.5pt]参数[/size][/font][/color][color=black][font=Verdana][size=10.5pt]7[/size][/font][/color][color=black][font=宋体][size=10.5pt]:略;[/size][/font][/color][color=black][font=Verdana][size=10.5pt][/size][/font][/color]
[b][color=black][font=Verdana][size=10.5pt]2[/size][/font][/color][/b][b][color=black][font=宋体][size=10.5pt]、调用[/size][/font][/color][/b][b][color=black][font=Verdana][size=10.5pt]CreateFileMapping[/size][/font][/color][/b][b][color=black][font=宋体][size=10.5pt]函数。[/size][/font][/color][/b][color=black][font=宋体][size=10.5pt]创建一个无名的或者有名的内存映射文件对象。[/size][/font][/color][color=black][font=Verdana][size=10.5pt][/size][/font][/color]
[color=black][font=Wingdings][size=10.5pt]l
[/size][/font][/color][color=black][font=宋体][size=10.5pt]参数[/size][/font][/color][color=black][font=Verdana][size=10.5pt]1[/size][/font][/color][color=black][font=宋体][size=10.5pt]:函数返回值;[/size][/font][/color][color=black][font=Verdana][size=10.5pt][/size][/font][/color]
[color=black][font=Wingdings][size=10.5pt]l
[/size][/font][/color][color=black][font=宋体][size=10.5pt]参数[/size][/font][/color][color=black][font=Verdana][size=10.5pt]2[/size][/font][/color][color=black][font=宋体][size=10.5pt]:安全属性([/size][/font][/color][color=black][font=Verdana][size=10.5pt]NULL[/size][/font][/color][color=black][font=宋体][size=10.5pt]);[/size][/font][/color][color=black][font=Verdana][size=10.5pt][/size][/font][/color]
[color=black][font=Wingdings][size=10.5pt]l
[/size][/font][/color][color=black][font=宋体][size=10.5pt]参数[/size][/font][/color][color=black][font=Verdana][size=10.5pt]3[/size][/font][/color][color=black][font=宋体][size=10.5pt]:指定要映射的文件的保护属性(只读[/size][/font][/color][color=black][font=Verdana][size=10.5pt]OR[/size][/font][/color][color=black][font=宋体][size=10.5pt]读写);[/size][/font][/color][color=black][font=Verdana][size=10.5pt][/size][/font][/color]
[color=black][font=Wingdings][size=10.5pt]l
[/size][/font][/color][color=black][font=宋体][size=10.5pt]参数[/size][/font][/color][color=black][font=Verdana][size=10.5pt]4[/size][/font][/color][color=black][font=宋体][size=10.5pt]:指定要映射的文件的大小,最高[/size][/font][/color][color=black][font=Verdana][size=10.5pt]32[/size][/font][/color][color=black][font=宋体][size=10.5pt]位数;[/size][/font][/color][color=black][font=Verdana][size=10.5pt][/size][/font][/color]
[color=black][font=Wingdings][size=10.5pt]l
[/size][/font][/color][color=black][font=宋体][size=10.5pt]参数[/size][/font][/color][color=black][font=Verdana][size=10.5pt]5[/size][/font][/color][color=black][font=宋体][size=10.5pt]:与参数[/size][/font][/color][color=black][font=Verdana][size=10.5pt]4[/size][/font][/color][color=black][font=宋体][size=10.5pt]共同用于指定要映射的文件的大小,最低[/size][/font][/color][color=black][font=Verdana][size=10.5pt]32[/size][/font][/color][color=black][font=宋体][size=10.5pt]位数;[/size][/font][/color][color=black][font=Verdana][size=10.5pt][/size][/font][/color]
[color=black][font=Wingdings][size=10.5pt]l
[/size][/font][/color][color=black][font=宋体][size=10.5pt]参数[/size][/font][/color][color=black][font=Verdana][size=10.5pt]6[/size][/font][/color][color=black][font=宋体][size=10.5pt]:指定内存映射文件的名称([/size][/font][/color][color=black][font=Verdana][size=10.5pt]NULL[/size][/font][/color][color=black][font=宋体][size=10.5pt]);[/size][/font][/color][color=black][font=Verdana][size=10.5pt][/size][/font][/color]
[b][color=black][font=Verdana][size=10.5pt]3[/size][/font][/color][/b][b][color=black][font=宋体][size=10.5pt]、调用[/size][/font][/color][/b][b][color=black][font=Verdana][size=10.5pt]MapViewOfFile[/size][/font][/color][/b][b][color=black][font=宋体][size=10.5pt]函数。[/size][/font][/color][/b][color=black][font=宋体][size=10.5pt]用于保留一段足够的地址空间,并且将永久存储器上的文件数据映射到这个地址空间。[/size][/font][/color][color=black][font=Verdana][size=10.5pt][/size][/font][/color]
[color=black][font=Wingdings][size=10.5pt]l
[/size][/font][/color][color=black][font=宋体][size=10.5pt]参数[/size][/font][/color][color=black][font=Verdana][size=10.5pt]1[/size][/font][/color][color=black][font=宋体][size=10.5pt]:指定内存映射文件对象,函数返回值;[/size][/font][/color][color=black][font=Verdana][size=10.5pt][/size][/font][/color]
[color=black][font=Wingdings][size=10.5pt]l
[/size][/font][/color][color=black][font=宋体][size=10.5pt]参数[/size][/font][/color][color=black][font=Verdana][size=10.5pt]2[/size][/font][/color][color=black][font=宋体][size=10.5pt]:用于限定访问权限;[/size][/font][/color][color=black][font=Verdana][size=10.5pt][/size][/font][/color]
[color=black][font=Wingdings][size=10.5pt]l
[/size][/font][/color][color=black][font=宋体][size=10.5pt]参数[/size][/font][/color][color=black][font=Verdana][size=10.5pt]3[/size][/font][/color][color=black][font=宋体][size=10.5pt]:指定映射区域的开始位置,最高[/size][/font][/color][color=black][font=Verdana][size=10.5pt]32[/size][/font][/color][color=black][font=宋体][size=10.5pt]位数;[/size][/font][/color][color=black][font=Verdana][size=10.5pt][/size][/font][/color]
[color=black][font=Wingdings][size=10.5pt]l
[/size][/font][/color][color=black][font=宋体][size=10.5pt]参数[/size][/font][/color][color=black][font=Verdana][size=10.5pt]4[/size][/font][/color][color=black][font=宋体][size=10.5pt]:和参数[/size][/font][/color][color=black][font=Verdana][size=10.5pt]3[/size][/font][/color][color=black][font=宋体][size=10.5pt]共同用于指定映射区域的开始位置,最低[/size][/font][/color][color=black][font=Verdana][size=10.5pt]32[/size][/font][/color][color=black][font=宋体][size=10.5pt]位数。[/size][/font][/color][color=black][font=Verdana][size=10.5pt][/size][/font][/color]
[b][color=black][font=Verdana][size=10.5pt]4[/size][/font][/color][/b][b][color=black][font=宋体][size=10.5pt]、进行读[/size][/font][/color][/b][b][color=black][font=Verdana][size=10.5pt]/[/size][/font][/color][/b][b][color=black][font=宋体][size=10.5pt]写操作;[/size][/font][/color][/b][color=black][font=宋体][size=10.5pt](前提是调用[/size][/font][/color][color=black][font=Verdana][size=10.5pt]MapViewOfFile[/size][/font][/color][color=black][font=宋体][size=10.5pt]函数成功)[/size][/font][/color][color=black][font=Verdana][size=10.5pt][/size][/font][/color]
[b][color=black][font=Verdana][size=10.5pt]5[/size][/font][/color][/b][b][color=black][font=宋体][size=10.5pt]、调用[/size][/font][/color][/b][b][color=black][font=Verdana][size=10.5pt]UnmapViewOfFile[/size][/font][/color][/b][b][color=black][font=宋体][size=10.5pt]函数。[/size][/font][/color][/b][color=black][font=宋体][size=10.5pt]撤销文件映射视图,执行结束。[/size][/font][/color][color=black][font=Verdana][size=10.5pt][/size][/font][/color]
[color=black][font=Wingdings][size=10.5pt]l
[/size][/font][/color][color=black][font=宋体][size=10.5pt]参数[/size][/font][/color][color=black][font=Verdana][size=10.5pt]1[/size][/font][/color][color=black][font=宋体][size=10.5pt]:指定视图首地址;[/size][/font][/color][color=black][font=Verdana][size=10.5pt][/size][/font][/color]
[b][color=black][font=Verdana][size=10.5pt]6[/size][/font][/color][/b][b][color=black][font=宋体][size=10.5pt]、调用[/size][/font][/color][/b][b][color=black][font=Verdana][size=10.5pt]CloseHandle[/size][/font][/color][/b][b][color=black][font=宋体][size=10.5pt]函数。[/size][/font][/color][/b][color=black][font=宋体][size=10.5pt]关闭内存映射文件对象。[/size][/font][/color][color=black][font=Verdana][size=10.5pt] [/size][/font][/color]
[color=black][font=Verdana][size=10.5pt][/size][/font][/color]
[color=black][font=宋体][size=10.5pt]映射文件与虚拟内存一样,内存映射文件用来保留一个地址空间,并提交物理存储器。[/size][/font][/color][color=black][font=Verdana][size=10.5pt][/size][/font][/color]
[color=black][font=宋体][size=10.5pt]内存映射文件的特点使它很适合于加载[/size][/font][/color][color=black][font=Verdana][size=10.5pt]EXE[/size][/font][/color][color=black][font=宋体][size=10.5pt]或[/size][/font][/color][color=black][font=Verdana][size=10.5pt]DLL[/size][/font][/color][color=black][font=宋体][size=10.5pt]文件。这样可以节省内存又减少了加载所需时间。还可以使用它来映射大容量的文件,这样就不必在读取文件数据前设置很大的缓冲区。[/size][/font][/color][color=black][font=Verdana][size=10.5pt][/size][/font][/color]
[color=black][font=宋体][size=10.5pt]另外,内存映射文件常用于进程间通信,也是进程间通信的主要手段,其它进程之间通信机制都是基于内存映射文件来实现。[/size][/font][/color][color=black][font=Verdana][size=10.5pt][/size][/font][/color]
[color=black][font=宋体][size=10.5pt]为了更快的在进程之间通信,现在的内存映射文件也可以提交物理内存,这样内存映射文件既可以提交物理内存又可以提交文件。[/size][/font][/color][color=black][font=Verdana][size=10.5pt][/size][/font][/color]
[font=Arial][/font]
[font=Arial][size=10.5pt][/size][/font]

白色桑塔纳 发表于 2008-6-30 14:51

Windows CE支持内存分页么?

白色桑塔纳 发表于 2008-6-30 14:51

Windows CE支持各种CPU和能够以多种方式被配置,每种方式带有一个不同的API,开发环境怎样才能知道目标平台呢?

白色桑塔纳 发表于 2008-6-30 14:51

静待高手解答,谢谢~

口袋怪 发表于 2008-6-30 14:52

[quote]原帖由 [i]白色桑塔纳[/i] 于 2008-6-30 14:51 发表 [url=http://bbs.pdafans.com/redirect.php?goto=findpost&pid=6257157&ptid=574293][img]http://bbs.pdafans.com/images/common/back.gif[/img][/url]
Windows CE支持内存分页么? [/quote]

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

口袋怪 发表于 2008-6-30 14:52

[quote]原帖由 [i]白色桑塔纳[/i] 于 2008-6-30 14:51 发表 [url=http://bbs.pdafans.com/redirect.php?goto=findpost&pid=6257158&ptid=574293][img]http://bbs.pdafans.com/images/common/back.gif[/img][/url]
Windows CE支持各种CPU和能够以多种方式被配置,每种方式带有一个不同的API,开发环境怎样才能知道目标平台呢? [/quote]

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

页: [1]

Powered by Discuz! Archiver 6.1.0  © 2001-2007 Comsenz Inc.