WINCE5.0和WINCE6.0的内存与系统架构

http://topic.csdn.net/u/20090410/14/75bba2cb-cefc-4ca5-b4f5-4165bbf16006.html

http://wenku.baidu.com/view/b7adad4bcf84b9d528ea7ab0.html

http://msdn.microsoft.com/en-us/library/bb331824.aspx

http://www.msdnwebcast.com/

1.WINCE5.0

1.1 WINCE5.0的内存架构

因为WINCE是32位的嵌入式操作系统,所以WINCE的虚拟寻址能力可达4GB(为什呢,2^32=4GB),但是WINCE5.0和XP操作系统的每个进程独享4GB虚拟地址空间不同,WINCE5.0中所有的进程共享一个4GB的虚拟地址空间。这4GB的虚拟地址空间被分为两个2GB的区域,其中低地址的那2GB区域(0x00000000 ~ 0x7FFFFFFF)是用户虚拟空间,这块虚拟空间由应用程序的共用,也就是说应用程序申请的内存都会从低2GB虚拟内存空间分配的;而高2GB区域(0x80000000 ~ 0xFFFFFFFF)是操作系统的内核虚拟空间,供WINCE操作系统本身使用。

我们知道WINCE5.0的进程数量最多只能达到32个,而且每个进程只能独享32MB的虚拟空间(这个32MB的空间也叫一个slot),这33个进程(32+1,这个1就是指slot0,因为slot0用于映射当前在处理器上执行的线程所在的进程)占用的虚拟空间0x00000000~0x41FFFFFF(slot0~slot32),slot33~slot63对应的虚拟地址空间是0x42000000~0x7FFFFFFF,这块虚拟地址空间是由所有的进程共享的,如果每个进程独享的32MB虚拟地址空间不够用,那么进程可以在这个范围申请虚拟地址空间,这个范围包括对象存储和内存映射文件(.map文件,每个进程都有自己的map文件)。此范围的最后一个slot(slot63)从0x7E000000~0x7FFFFFFF用来存放纯资源DLL。如果某个DLL里面只有资源信息(比如图标、位图、对话框及字符串表灯),这个DLL就会被加载到这个空间内。

从0x80000000开始是WINCE内核使用的虚拟内存空间,其中0x80000000~0x9FFFFFFF(512MB)这段用来静态所有的物理地址,也就是说WINCE会把所有的物理内存1:1地址映射到这段虚拟内存上,这也就是WINCE最大支持的物理内存是512MB的由来。0xA0000000~0xBFFFFFFF(512MB)这段虚拟地址会重复映射所有的物理地址,这段对物理内存的映射与0x80000000这段最大的不同是从0x80000000开始的一段虚拟内存(何宗键老师这里写得是物理内存)是有缓冲的,而从0xA0000000开始的一段是没有缓冲的。通常,缓冲可以提高系统的I/O效率(why,有待进一步理解),但是对于一些OAL或者bootloader或者驱动来说,使用缓冲有可能会造成灾难性的后果,因为缓冲有可能会更改我们对设备的写操作顺序,因此在驱动程序中如果直接访问设备的I/O或寄存器,那么通常使用0xA0000000这段内存地址。

物理内存被映射到内核空间之后,WINCE内核如果要访问某个物理内存地址,就只需要把该物理地址加上0x80000000或者0xC0000000就可以了,这样简便的方式只能由WINCE内核使用,通常的应用程序是无法享受这种便利的。

0xC2000000~0xC3FFFFFF是slot97,此slot97是WINCE5.0的核心进程

NK.EXE,可见实现WINCE5.0操作系统的一些主要功能的NK.EXE本身的地址空间还是在和心态中的,0xE0000000~0xFFFFFFFF这段最高的地址是内核使用的地址空间,对于不同的处理器体系结构,这里保存着不同的内容,通常会放置一些供虚拟内存用的页表和中断向量表等内核使用的数据结构。

从上图我们就slot0来看看一个进程中虚拟地址空间的使用情况。一个进程的32MB虚拟地址空间中,最低的64KB地址(0x000000~0x00010000)是用来捕获野指针的,通常是空指针NULL的,如果某个指针访问了低于64KB的内存区域,那么WINCE就可以捕捉到这个错误,但是这样并不能捕获代码中所有的野指针。

64KB之上是进程的代码、数据以及堆和栈,进程申请虚拟内存是从低地址向高地址增长的。从每个32MB虚拟地址空间最高地址开始,存放的是进程加载的ROM DLL的读写数据以及RAM DLL的数据(ROM DLL的代码对所有的进程来说可以共享一个拷贝,放在slot1中,但对于DLL的数据,就不得不为每个进程设立单独的拷贝),DLL代码和数据的增长是从高地址向低地址增长的,如果这两个高低增长相遇,那么就表示进程已经耗尽了它的虚拟地址空间,就算此时有能还有多余的物理内存,但是无法使用它了,因为进程的虚拟地址空间已经用完了。

我们知道虚拟内存的申请是以64KB为边界的,这对进程加载DLL有非常重要的影响,这也就意味着每个DLL的都要至少占用64KB虚拟地址空间,从理论上来说每个进程只能加载512个DLL。要记住所有的ROM XIP DLL都会被映射到进程的虚拟地址空间中,因为进程有可能访问任何一个XIP DLL。通常一个没有图形界面的WINCE操作系统就会包含有100个左右这样的DLL,一个含有图形界面的正常WINCE包含的这种DLL更多,因此这个问题应该引起重视。可以采取一些方法避免虚拟内存耗尽,例如把几个不到64KB的小DLL合并成为一个大的DLL。

1.2 WINCE5.0的系统架构

2.WINCE6.0

2.1 WINCE6.0的内存架构

⑴WINCE6.0支持最大32000个进程。

⑵每个进程独自占用2G虚拟地址空间。

⑶统一/一元化的内核(unified kernel),把关键性的OS部分移到内核空间。

***和WINCE5.0类似,2G的用户空间被分为两部分。

***最低64KB,被系统用来捕获野指针。

***低1GB的地址空间用来加载进程的代码、数据、堆、栈等

***0x40000000~0x5FFFFFFF(512MB),这段虚拟内存空间用于加载所有的用户进行的DLL代码和数据。

***0x60000000~0x6FFFFFFF(256MB)这段内存分配给内存映射文件MMF(memory mapped files)。

***0x70000000~0x7FEFFFFF这段内存是内核程序和用户进程间的共享堆,实现内核程序和用户进程间通信(无需通过API),此区域用户程序可读,但OS可写。

***0x7FF00000~0x7FFFFFFF这段内存不可访问,作为用户和核心间的缓存。

***低1GB是静态虚拟地址。

***0xC0000000~0xC7FFFFFF(128MB)用于内核加载的XIP DLLs。

***0xC8000000~0xCFFFFFFFF(128MB)是文件系统的对象存储区。

***0xD000000~0xDFFFFFF(512MB)是内核模式的程序执行区。

***0xF000000~0xFFFFFFFF用于捕获系统调用,包含核心数据页。

WINCE6.0系统被划分为user mode(用户模式)和kernel mode(内核模式)两个“层”,CoreDLL同时出现在两个层中,驱动程序也移到了内核中,以前的.exe基本上都变成了.dll

3. WINCE5.0和WINCE6.0的OAL design

WINCE5.0和WINCE6.0的内存与系统架构相关推荐

  1. 在WinCE5.0和WinCE6.0下,编译选项介绍

    作者:ARM-WinCE 在WinCE5.0中,在"Build OS"菜单中,我们会看到不同的编译选项: "Sysgen","Build and Sy ...

  2. petshop4.0 具体解释之中的一个(系统架构设计)

    前言:PetShop是一个范例,微软用它来展示.Net企业系统开发的能力.业界有很多.Net与J2EE之争,很多数据是从微软的PetShop和Sun的PetStore而来.这样的争论不可避免带有浓厚的 ...

  3. 蓝牙架构(4)—— 2 蓝牙系统架构 (2.0 核心系统架构)

    Vol 1架构和术语概述 Part A 2 蓝牙系统架构 Agenda: 2.0 核心系统架构. 2.0.1 蓝牙BR/EDR最小系统. 2.0.3 蓝牙BR/EDR/LE最小系统. 2.0.4 蓝牙 ...

  4. WINCE6.0系统调用

    ********************************LoongEmbedded******************************** 作者:LoongEmbedded(kandi ...

  5. WINCE6.0操作系统---内核(kernel)学习

    ********************************LoongEmbedded******************************** 作者:LoongEmbedded(kandi ...

  6. WINCE6.0文件系统及存储管理器

    *******************************LoongEmbedded******************************** 作者:LoongEmbedded 时间:201 ...

  7. WinCE6.0 修改开机Logo方法集锦(二)

       中秋假期已过,回来继续该博文主题.今天讲解第二种方法,将Logo图片的数据写入到Nand Flash中,在启动初始化LCD的时候,从固定的地址将数据读出并填充到显示缓存中.<?xml:na ...

  8. VS2005工程由Pocket PC 2003 SDK转为WINCE6.0 SDK的问题

    把VS2005工程有采用的Pocket PC 2003 SDK改为WINCE6.0 SDK,具体操作见链接 http://blog.csdn.net/loongembedded/article/det ...

  9. 基于WINCE6.0下载multiple XIP镜像文件

    ********************************LoongEmbedded******************************** 作者:LoongEmbedded(kandi ...

最新文章

  1. 单片机彩灯移动实验_用S7-1200 PLC实现循环彩灯的控制,含源程序
  2. SQL SERVER 2012 第三章 使用INSERT语句添加数据
  3. 没事试试50mm1.4
  4. Linux下Makefile的automake生成全攻略--转
  5. vb编程的好帮手--资源文件
  6. PMP知识点(七、资源管理)
  7. spark之2:原理介绍
  8. appsetting mysql_给IConfiguration写一个GetAppSetting扩展方法(示例代码)
  9. 简单的PL/SQl链接远程ORACLE数据库方法
  10. MySQL课设小问题_MySQL必会的50个常见面试练习题
  11. HDU1582 AC Again【DFS】
  12. HTML和CSS实现京东登录页面(html,css代码详解)
  13. 物欲横流的社会中,有没有那么一首诗、一首歌、一句话、一个词....不经意间勾起了你心中无限的回忆,甚至心都跟着微微颤抖了一下
  14. java中的正则matches方法和find方法的区别
  15. 使用vue-preview 缩略图预览 完美解决
  16. 【计算机毕业设计】java+mysql基于SSM的生鲜超市进销存管理系统
  17. ANSYS Electronics Suite 2021 R2
  18. crontab 定时任务时间格式设置
  19. 识别win10和linux的MBR,Win10下安装ElementaryOS双系统:UEFI和Legacy引导
  20. java动态代理实现与原理详细分析

热门文章

  1. 什么样的数据适合缓存?
  2. SQL语言包含4个部分
  3. 线程和进程有什么区别
  4. 011_Vue自定义指令
  5. java clone 报错_创建ArrayList对象时显示CloneNotSupportedException错误
  6. ViewPager刷新问题详解
  7. 微型计算机与维修自测,微机系统及维护第三章自测.doc
  8. JAVA ee6 result结果集_java对数据库的表插入操作时,显示已生成用于更新的结果集...
  9. Zabbix的邮件报警配置
  10. 数据库系统概论:第十章 数据库恢复技术