Linux进程内存管理方法?

Linux系统提供了一个复杂的存储管理系统,使得进程可以访问4GB的内存。在Linux系统中,一个进程的4GB内存空间分为两部分——用户空间和内核空间。用户空间的地址一般分布在0到3~4GB(即PAGE_OFFSET,在Ox86中等于OxC0000000),所以剩下的3 ~ 4GB是内核空间,用户进程通常只能访问用户空间的虚拟地址,而不能访问内核空间的虚拟地址。用户进程只能通过系统调用的方式访问内核空间(代表在内核状态下执行的用户进程)。每个进程的用户空间完全独立,互不相关,用户进程有不同的页表。内核空间由内核映射,不随进程变化,是固定的。内核空间中虚拟地址到物理地址的映射由所有进程共享,内核的虚拟空间独立于其他程序。Linux中的1GB内核地址空间分为物理内存映射区、虚拟内存分配区、高端页面映射区、特殊页面映射区和系统预留映射区。对于x86系统,一般来说,物理内存映射区的最大长度是896MB,系统的物理内存是顺序映射在内核空间的这个区域中的。当系统的物理内存大于896MB时,超过物理内存映射区的内存称为高端内存(而没有超过物理内存映射区的内存通常称为常规内存),内核在访问高端内存时必须将它们映射到高端页面映射区。Linux保留了最上面的FIXADDR_TOP~4GB的内核空间作为保留区。当系统的物理内存超过4GB时,您必须使用CPU的扩展分页(PAE)模式提供的64位页面目录条目来访问4GB以上的物理内存,这需要CPU的支持。具有PAE功能的Intel Pentium Pro以及更高版本的CPU允许内存配置高达64GB,并且它们具有36位物理地址空间的寻址能力。可以看出,对于32位x86,在3-4gb的内核空间中,从低地址到高地址的顺序是:物理内存映射区隔离区vmalloc虚拟内存分配器区隔离区高端内存映射区专用页面映射区保留区。