Linux内存管理

 

内存管理的基本单位是页。 描述页的结构体是page。描述的是物理页,不是虚拟页。

struct page{
    flags // 页的状态,是不是脏的等
    _count // 引用计数
    virtual // 虚拟地址
    
}

ZONE_DMA:这个区包含的页能用来执行DMA操作; ZONE_NORMAL:这个区包含的都是能正常映射的页; ZONE_HIGHEM:“高端内存”,这个区包含的页不能永久地映射到内核地址空间。 区描述的对象也是物理内存,不是虚拟内存。

内存描述符

mm_struct描述的是一个进程的地址空间,是虚拟地址。

虚拟内存区域VMA

vm_area_struct描述指定地址空间内连续区间上的一个独立内存范围。

组织

使用链表和红黑树两种结构组织VMA,前者用于遍历,后者用于定位特定内存区域。

操作进程的内存地址空间

mmap():为一个进程扩展它的内存地址空间,或创建一个新的内存地址空间。 mummap():删除一个进程的一段内存地址空间。

页表

要将虚拟地址转换为物理地址,需要用到页表。 Linux使用的是三级页表。