zoukankan      html  css  js  c++  java
  • WINCE内核(kernel)内存架构(memory archtitecture)学习

    ********************************LoongEmbedded********************************

    作者:LoongEmbedded(kandi)

    时间:2012.02.26

    类别:WINCE系统开发

    ********************************LoongEmbedded********************************

    1.    WINCE内存模型

     

    图1  WINCE5.0和WINCE6.0内存模型对比图

    WINCE6.0之前的WINCE操作系统支持的进程最多只有32个,并且每个进程只有32MB的虚拟内存空间,并且所有的进程共享相同的4GB地址空间。在WINCE6.0中,内核进程占用4GB虚拟内存空间的高2GB,每个用户进程都有独立拥有低端的2GB虚拟内存空间,WINCE6.0支持的最大进程数达到32000个。进程数量的实际限制是受物理内存的大小来决定的。之前的WINCE版本,当前的应用在slot0执行,在WINCE6.0中,抛弃了原来的按Slot分配的方式,而是只要你需要你就可以创建内存,每个都有2GB的有效虚拟内存空间。

    因为虚拟内存访问是通过内存管理单元MMU转化为物理内存的访问,所以虚拟内存代码是依赖于CPU的。ARM和x86处理器使用硬件页表OEMAddressTable,所以硬件可以直接访问虚拟内存单元。WINCE支持的其他CPU使用一个软件转换旁路缓冲区TLB(translation look-aside buffer,可理解为页表缓冲或是快表)miss handler,这需要完里面填充虚拟内存的内容。

    WINCE6.0基于下面的目标来设计虚拟内存管理:

    ⑴ 每个进程具有大容量的虚拟内存。

    ⑵ 不存在进程数量的限制。

    ⑶ 进程直接相互保护。

    ⑷ 最低程度降低使虚拟内存管理依赖CPU的代码。

    ⑸ 有效的虚拟内存分配

    ⑹ 有效的TLB选中处理机制(miss handling)。

    2.    WINCE虚拟内存分配

    下面来看WINCE6.0虚拟内存地址空间图,先看内核模式下的虚拟内存地址空间分配。

    图2  内核模式虚拟内存空间分配图

    ⑴ 静态映射到虚拟内存,有缓冲的,范围为0x80000000~0xA0000000,大小为512MB,通过CPU的cache直接访问物理内存,这段也就是BSP包中g_oalAddressTable映射表对应于物理内存到虚拟内存的映射关系。

    ⑵ 静态映射到虚拟内存,无缓冲的,范围为0xA0000000~OxBFFFFFFF,大小为512MB,不需要通过CPU的cache,直接访问物理内存。

    ⑶ 内核XIP DLLs所在的虚拟内存空间,范围为0Xc0000000~0Xc7ffffff,大小为128MB。

    ⑷ 对象存储区域,范围为0xC8000000~0Xcfffffff,大小为128MB,主要用于存储RAM文件系统、CEDB数据库、基于RAM的注册表和遗留的数据存储(legacy data sore)。

    ⑸ 内核虚拟内存空间,为内中中装载的所有服务和驱动所共享,范围为0xD0000000~0xDFFFFFFF,大小为256MB,另外的256MB的虚拟内存空间取决于具体CPU,范围为0xE0000000~0xEfffffff。

    ⑹具体CPU的虚拟内存空间,用于系统调用的陷阱捕获区域,范围为0xF0000000~0xFFFFFFFF,大小为256MB。

    用户模式下的虚拟内存地址空间分配如下

    图3  用户模式虚拟内存空间分配图

    ⑴每个进程的进程空间,主要用于可执行代码和数据,用户堆的虚拟内存分配,

    范围为0x00000000~0x3FFFFFFF,大小为1GB。

    ⑵ 用户模式DLLs的代码和数据空间,范围为0x40000000~0x5FFFFFFF,大小为512MB。

    ⑶ 用于RAM-backed映射文件,范围为0x60000000~0x6FFFFFFF,大小为256MB。

    ⑷ 共享系统堆,范围为0x70000000~0x7FFFFFFF,大小为256MB。

    一次只能映射一个虚拟内存,不能直接通过其他进程的虚拟内存地址来访问它们的内存。虚拟内存地址只能在已被进程分配的情况下使用,比如应用程序不能在代码中调用VirtualProtect函数来改变自己已有访问保护。

    free(可用):可被分配

    reserved(保留):虚拟地址被保留,不能再分配。但不能被使用,因为它没有被映射到物理内存。

    committed(提交):映射到物理地址。

  • 相关阅读:
    ASE19团队项目 beta阶段 model组 scrum report list
    ASE19团队项目 beta阶段 model组 scrum7 记录
    ASE19团队项目 beta阶段 model组 scrum6 记录
    ASE19团队项目 beta阶段 model组 scrum5 记录
    ASE19团队项目 beta阶段 model组 scrum4 记录
    ASE19团队项目 beta阶段 model组 scrum3 记录
    ASE19团队项目 beta阶段 model组 scrum2 记录
    ASE19团队项目 beta阶段 model组 scrum1 记录
    【ASE模型组】Hint::neural 模型与case study
    【ASE高级软件工程】第二次结对作业
  • 原文地址:https://www.cnblogs.com/liang123/p/6325697.html
Copyright © 2011-2022 走看看