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(提交):映射到物理地址。

  • 相关阅读:
    从点子到产品
    基础设计模式
    SpringBoot单元测试
    结构化思维
    考试脑科学读书笔记
    爆发式成长的思维
    人人都是产品经理笔记
    文本处理工具awk
    CSP-S2019【绍兴一中集训】
    寒假集训【1.28】
  • 原文地址:https://www.cnblogs.com/liang123/p/6325697.html
Copyright © 2011-2022 走看看