当前位置: 首页 > article >正文

VxWorkds 内存管理(3)

虚拟内存管理

对于带MMU的目标板,VxWorks提供虚拟内存的支持,VxWorks提供了两种虚拟内存管理单元(MMU)的支持: 基本MMU和VxVMI

基本MMU邦定于VxWorks中,可以通过config.h中宏定义INCLUDE MMU BASIC或Tornado工程配置中包含基本MMU组件

VxVMI是wind River公司推出的一个可选软件模块,实现了MMU的全部功能

VxWorks中有关MMU的配置包括以下内容INCLUDE MMU BASIC: 基本MMU的支持。

        INCLUDE MMU FULL: 完整MMU的支持(需要VxVMD

        INCLUDE PROTECT TEXT: 代码段写保护支持(需要VVMD

        INCLUDE PROTECT VEC TABLE: 中断向量表写保护支持需要VxVMI

虚拟内存几个名词:

  1. 虚拟地址空间:由程序计数器的寻址能力来决定其大小,如32位的i86虚拟地址空间=4GB
  2. 物理地址:用于内存芯片级的单元寻址,与处理器连接的地址总线相对应(与地址总线相对应 )
  3. 虚拟地址:虚拟地址空间中的地址,程序中使用的都是虚拟地址
  1. 内存映射:建立虚拟地址与物理地址之间的对应关系一-处理器中MMU可以完成此功能

基本MMU与VxWorks捆绑在一起,可以指定基于页的内存区域为不可缓存,该特性能够使直接内存访问(DMA)和处理其内部通信更为有效、迅速。如当其它处理器或DMA设备访问同一段地址空间时,可以保证这些数据不被缓存。

如果系统不具备这样的不可缓存特性,那么在访问这些地址空间时,必须从全局上关闭高速缓存Cache或者手工清洗缓冲区(flush)或使缓冲区无效(invalidate)。

  1. 基本MMU使用物理内存描述来建立一种地址映射关系,这种方式是平面型的,实地址和虚地址一一对应
  2. BSP负责提供物理内存描述的支持:

1:sysLib.c中定义PHYS MEM DESC 结构体类型的数组sysPhysMemDesc[]。

2:sysPhysMemdesc[]描述了虚拟地址和实地址之间的对应关系及内存页的初始状态

3:定义的内存区必须是页对齐的,并且必须跨越完整的页

4:页面大小VM PAGE SIZE在config.h中定义,一般为4KB或8KB

·PHYS MEM DESC 数据结构定义如下( vmLib.h) :

typedef struct phys_mem_desc

{

        void *virtualAddr;void *physicalAddr;UNIT len;

        UNIT initialStateMask;

        UNIT initialState;

} PHYS MEM DESC;

virtualAddr和physicalAddr通常是相等的.

sysPhysMemDesc [] 中可能包含的映射空间有内存、flash、rom、I/O设备和外部总线地址空间等·

下面是多cpu嵌入式系统中使用共享内存网络时各目标板的MMU配置示例:

{

        (void *) 0x4000000,/* virtual address */

        (void *) 0x4000000,/* physical address */

        0x20000,/* length */

        /* initial state mask */

        VM_STATE_MASK_VALID | VM_STATE_MASK_WRITABLE | VM_STATE_CACHEABLE,

        /* initial state */

        VM_STATE_VALID | VM_STATE_WRITABLE | VM_STATE_CACHEABLE_NOT,

        ……

}

虚拟内存状态标志:

VM_STATE_VALID

VM_STATE_VALID_NOT

VM_STATE_WRITABLE

VM_STATE_WRITABLE_NOT

VM_STATE_CACHEABLE

VM_STATE_CACHEABLE_NOT

有效性: 有效状态指示虚到实转换是正确的。当转换表被初始化时,全局虚内存被标记为有效的,所有其他虚内存被初始化为无效的.

可写性:通过设置状态为不可写,也可以被设置为只读。这被VxWorks用于写保护所有text段.

可cache: 内存页的cache可以通过设置状态标志为cache被禁止。这对处理器间共享的内存及DMA设备是有用的.

屏蔽标志:描述哪一标志可以被改变

VM_STATE_MASK_VALID

VM_STATE_MASK WRITABLE

VM_STATE_MASK_CACHEABLE

有两种方法可以修改虚地址和实地址之间的映射关系;

        静态方式:通过修改结构体sysPhyMemDesc的内容

        动态方式:通过调用vmBaseStateSet函数来修改一块虚拟内存空间的状态

        所有可能会在应用程序中被访问的物理内存(包括内存映射设备,比如以太网设备、PCI设备、SCSI设备等) 都应该被映射到不同的虚拟内存空间.

在MMU使能的情况下,如果某一段物理地址没有被映射,而试图对这样的地址进行些操作时,将会引起总线错误.

        一个较完整的内存映射实例, 此实例是一款基于mpc860开发板的内存映射表。这款开发板上的器件有mpc860, mpc860内嵌64K存储器, 外挂内存(SDRAM) 、Boot flash、版本fIash.

PHYS MEM_DESC sysPhysMemDesc [] =
{

    {

        (void*)LOCAL_MEM_LOCAL_ADRS,

        (void*)LOCAL_MEM_LOCAL ADRS,

        LOCAL_MEM_SIZE, /*SDRAM*/

        VM_STATE_MASK_VALID | VM_STATE_MASK_ WRITABLE |

        VM_STATE_MASK_CACHEABLE |

        VW_STATE_VALID | VM_STATE_WRITABLE | VM_STATE_CACHEABLE

    },

    ……


}


http://www.kler.cn/a/2165.html

相关文章:

  • 【Vulkan入门】16-IndexBuffer
  • 基于langchain的Agent(实现实时查询天气)
  • Kingbase数据库备份还原操作手册
  • OpenHarmony-3.HDF Display子系统(6)
  • 气象与旅游之间的关系,如果借助高精度预测提高旅游的质量
  • 在Linux上将 `.sh` 脚本、`.jar` 包或其他脚本文件添加到开机自启动
  • 单元测试、反射、注解、动态代理
  • c++STL急急急
  • 禁用非必需插件,让 IDEA 飞起
  • uboot学习之Makefile之配置过程
  • 【数据结构】顺序栈的C语言实现
  • 刷题记录(2023.3.14 - 2023.3.18)
  • Vue实战【封装一个简单的列表组件,实现增删改查】
  • 栈应用——逆波兰算法
  • 华为MetaERP最佳的免费开源平替方案:Odoo生产制造功能简介
  • 【Java进阶篇】——反射机制
  • 蓝桥杯刷题第十三天
  • ChatGPT和百度文心一言写用例,谁更强?
  • 移除元素(双指针)
  • 《剑指Offer》笔记题解思路技巧优化——精心编写(1)
  • “你要多弄弄算法”
  • 南京邮电大学数据库第三次课后作业
  • 什么是推挽输出,开漏输出?
  • 【嵌入式硬件芯片开发笔记】HART协议调制解调芯片AD5700配置流程
  • Qt优秀开源项目之十七:QtPromise
  • PostgreSQL学习总结(12)—— PostgreSQL 内置函数汇总