(1)从CR3寄存器中获取页面目录表(Page Directory)的基地址;
(2)以线性地址的Directory位段为下标,在目录(Page Directory)中取得相应页面表(Page Table)的基地址;
(3)以线性地址中的Table位段为下标,在所得到的页面表中获得相应的页面描述项;
(4)将页面描述项中给出的页面基地址与线性地址中的offset位段相加得到物理地址。
(1)从CR3寄存器中获取页面目录表(Page Directory)的基地址;
(2)以线性地址的Directory位段为下标,在目录(Page Directory)中取得相应页面表(Page Table)的基地址;
(3)以线性地址中的Table位段为下标,在所得到的页面表中获得相应的页面描述项;
(4)将页面描述项中给出的页面基地址与线性地址中的offset位段相加得到物理地址。
多年以来,Linux 内核使用一种称为 SLAB 的内核对象缓冲区分配器。SLAB 分配器源于 Solaris 2.4 的分配算法,工作于物理内存页框分配器之上,管理特定大小对象的缓存,进行快速而高效的内存分配。
SLAB 分配器为每种使用的内核对象建立单独的缓冲区。Linux 内核已经采用了伙伴系统(Buddy System)管理物理内存页框,因此 SLAB 分配器直接工作于伙伴系统之上。每种缓冲区由多个 slab 组成,每个 slab就是一组连续的物理内存页框,被划分成了固定数目的对象。根据对象大小的不同,缺省情况下一个 slab 最多可以由 1024 个物理内存页框构成。出于对齐等其它方面的要求,slab 中分配给对象的内存可能大于用户要求的对象实际大小,这会造成一定的内存浪费。
请问在完全内存虚拟化(Full Memory Virtualization,包括使用影子页表Shadow Page Table)中,处理缺页异常的流程是什么?
例如,KVM, VMWare都是使用完全内存虚拟化技术来虚拟化物理内存的。请问它们处理缺页异常的流程是什么样的呢?
现代操作系统及CPU硬件中,都会提供内存管理单元(memory management unit,MMU)来进行内存的有效管理。内存管理算法有许多,从简单的裸机方法到分页和分段策略。各种算法都有其优缺点,为特定系统选择内存管理算法依赖于很多因素,特别是系统的硬件设计。
内存管理的目的是为了更好的使用内存(似乎是废话-,-)。 内存是现代操作系统运行的中心。操作系统中任何一个进程的运行都需要内存,但是,操作系统中的内存是有限的;另一方面,从安全的角度出发,进程都需要有自 己的内存空间,其他的进程都不能访问这个私有的空间;同时,内存的分配会导致内存碎片问题,严重影响计算机的性能。以上这三个问题就是一般内存管理算法所 需要处理的目标。