1、LINUX存储管理地址空间地址空间( address space) 是一段表示内存位置的地址范围。地址空间有两种:n物理地址空间n逻辑地址空间,也被称为虚拟地址空间在逻辑地址和物理地址之间相互转换的工作是由内核和硬件内存管理单元( MMUmemory management unit) 共同完成的。 MMU是被集成进现代的 CPU里的,它们都是同一块 CPU芯片内的一个部分。内核告诉 MMU如何为每个进程把某逻辑页面映射到某特定物理页面,而 MMU在进程提出内存请求时完成实际的转换工作。 LINUX的虚拟地址划分每一个用户进程都可以访问 4GB的线性虚拟内存空间。从 0到 3GB的虚拟内存地址是
2、用户空间,用户进程可以直接对其进行访问。从 3GB到 4GB的虚拟内存地址为核心态空间,存放仅供核心态访问的代码和数据,用户态进程不可访问。所有进程从 3GB到 4GB的虚拟空间都是一样的,有同样的页目录项,同样的页表,对应到同样的物理内存段。 LINUX以此方式让内核态进程共享代码段和数据段。内核态虚拟空间从 3GB到 3GB+4M的一段(也就是进程页目录第 768项所管辖的范围),被映射到物理空间 0到 4M段。因此,进程处于核心态时,只要通过访问虚拟空间 3GB到3GB+4M段,偏移地址 0到 4M, 即访问了物理空间 0到 4M段。虚拟地址转换PGD PMD PTE Page Fram
3、e页目录索引,页面中间目录、页表索引和偏移量虚拟内存和物理内存都分为大小固定的块,叫做页面。每一个页面有一个唯一的页面号,叫做 PFN(page frame number)。 n转换后备缓存( Translation Lookaside Buffers: TLBs)n如果简单的执行从逻辑地址到物理地址的转换过程,在跟踪指针链时将会需要几个内存引用。 RAM虽然不像磁盘那么慢,但是仍然比 CPU要慢的多,这样就容易形成性能的瓶颈。为了减少这种开销,最近被执行过的地址转换结果将被存储在 MMU的转换后备缓存( translation lookaside buffers:TLBs) 内。虚拟地址转换
4、虚存段 (VMA)的组织和管理nVMA:vitual memory area一个 vma段是某个进程的一段连续的虚存空间;在这段虚存里的所有单元拥有相同的特征。例如:属于同一进程,相同的访问权限,同时被锁定( locked), 同时受保护( protected), 等等。进程通常占用几个 vma段,分别用于代码段、数据段、堆栈段等。属于同一进程的 vma段通过 vm_next指针连接,组成链表。 对于一个给定的进程,两个 VMAs决不会重叠,一个地址最多被一个 VMA所覆盖;进程从未访问过的的一个地址将不会在任何一个 VMA中。 struct mm_struct结构的成员 struct vm_
5、area_struct * mmap 表示进程的 vma链表的表头。当一个进程有多于avl_min_map_count数目的 VMA时,内核也会创建一个 AVL树来存储它们,此时仍然是使用 VMAs自己的指针对该树进行管理。AVL树是一个平衡二叉树结构,因此这种方法在 VMA数量巨大时查找效率十分高。 虚存段 (VMA)的组织和管理AVL树PCB对内存的控制Task struct mm_struct _vm_area_struct vm_mmpgdmm vm_operations_structvm_nextmmapvm_opspgd vm_area_struct pte pte page page frame framevm_next *open