嵌入式实时Hypervisor:XtratuM (8)

 

1.1           内存管理

内存管理主要包含两个方面,一个是内存分配,另一个是内存映射。在XtratuM系统开发和移植过程中,内存分配问题主要体现在每个域或客户操作系统内部,例如PaRTiKle系统采用TLSF(Two-Level Segregate Fit)算法。关于TLSF算法,读者可以参考[36]。本节的内容主要包含域中内存使用类别和内存映射机制。

现阶段,在XtratuM系统中,所有的物理内存由Linux内存管理模块管理。当域被加载的时候,相应的物理内存也被分配。通过MMU保护机制,所有的域相互分开,从而提高了域的稳定性和可靠性,这一点对实时域,例如PaRTiKle尤其重要。在PaRTiKle中,物理内存被用在四个方面,或者有四种不同类型的物理内存:1)pgdtable 页用来保存域的虚拟内存页表;2)栈内存被用来存放域的镜像;3)堆内存用来给域中的任务分配内存空间;4)事件内存保存虚拟中断和中断处理句柄地址。其中,pgdtable和栈在XtratuM内核空间。堆和事件处理内存被映射到域空间并被上层任务使用。例如,事件内存被域内核空间用作中断驱动,堆被线程用作内存池,所有的内存分配请求从堆结构中获取。

内存映射是一种虚拟内存机制。通过内存映射,虽然虚拟地址不同,但是它们可能对应相同的物理内存,从而使多个任务可以访问相同的物理内存。在Linux系统中,用户空间进程可以通过Linux系统调用访问内核空间数据内容。离开了系统调用,通过内存映射机制,Linux进程也可以直接访问内核态内存。图2-8给出了简单的内存映射模型。

图2-1.          内存映射模型

Linux内核中,物理内存和内核空间是一对一映射的(这里不考虑大内存问题)。但是为了数据块传输数据,需要将任务地址空间映射到物理内存从而可以使进程直接访问该内存空间,并且内核任务也可以对该段内存进行直接访问。与通过系统调用的方式传递数据相比,性能得到大幅度提升。

那么,在XtratuM系统,内存是如何被映射的呢?类似LinuxXtratuM采用三级页表机制,pgd, pte and pagePGD表是最高层。每一个PGD元素指向一个PTE页面。当域被调度的时候,相应的PGD页面的物理页面被存放在CR3寄存器中。PTE元素存放这DATA页的地址。页内偏移与虚拟地址便宜相同。图2-9是一个简单的从虚拟地址到物理地址转换模型。内存映射的使用主要存在于域镜像和域间通信工具的加载过程中。域间通信内容将在2.5节中介绍,相应内存映射的实现也会详细解释。

图2-2.              域空间虚拟地址向物理地址转换模型

 

你可能感兴趣的:(linux,算法,嵌入式,工具,任务,linux内核)