一文剖析 Linux 内核的内存管理
内容提要
内存管理是操作系统中重要的任务之一,Linux系统中引入了虚拟地址的概念,物理内存分为Page、Zone和Node,大内存利用伙伴系统分配,小内存利用slub分配。虚拟空间分为用户态和内核态,通过页表将虚拟地址转化为物理地址。TLB是CPU中的缓存,用于缓存虚拟地址和物理地址的映射。虚拟内存是将硬盘中的swap分区作为虚拟的内存,可以运行更大内存的程序。用户空间只能映射用户内存,内核空间只能被内核使用。
延伸解读
伙伴系统与slub分配器的适用场景
文章指出,Linux将内存分配分为大内存和小内存两种。大内存通过伙伴系统分配,以页块链表管理,分配时若没有合适大小的页块,会向上查找更大页块并分裂。小内存则用slub分配器,将几个页作为缓存,维护链表,分配和释放都在链表中操作,无需清空。这种分工让不同大小的内存请求都能高效处理。
用户态与内核态虚拟空间的设计差异
用户态虚拟空间每个进程独立,包含代码、数据、堆、栈等区域,通过页表映射到物理内存。内核态虚拟空间则被所有进程共享,分为直接映射区和动态映射区。直接映射区固定映射896M物理内存,动态映射区则允许内核灵活映射高端内存。这种设计既保证了内核访问所有物理内存的能力,又避免了用户进程间的地址冲突。
页表机制与TLB的加速作用
虚拟地址通过页表转换为物理地址,每个进程有独立页表,内核共享一个页表。为减少连续内存占用,Linux采用多级页表,32位系统使用两级,64位系统使用五级。TLB作为CPU缓存,存储最近的虚拟地址到物理地址映射,查询时先查TLB,未命中再查页表,从而加速地址转换过程。
虚拟内存的利弊与用户内核空间隔离
虚拟内存利用硬盘swap分区扩展可用内存,允许运行更大内存的程序,但数据在内存和磁盘间切换耗时,速度不及物理内存。此外,用户空间只能映射用户内存,内核空间只能被内核使用,用户进程无法直接访问内核空间。系统调用时,数据需先从内核空间拷贝到用户空间,这体现了空间隔离的安全设计。
Q&A
Linux内核的内存管理主要负责什么?
Linux内核的内存管理主要负责有效地管理物理内存,以支持各个进程的运行。
Linux中物理内存是如何组织的?
Linux中物理内存分为Page、Zone和Node三个级别,其中Page是基本单位,Zone分为ZONE_DMA、ZONE_NORMAL和ZONE_HIGHMEM。
什么是虚拟内存,它是如何工作的?
虚拟内存是将硬盘中的swap分区作为虚拟内存,允许运行更大内存的程序,通过将不常用的数据从内存调入硬盘来实现。
TLB在Linux内存管理中有什么作用?
TLB是CPU中的缓存,用于加速虚拟地址到物理地址的转换,存储虚拟地址和物理地址的映射。
用户空间和内核空间有什么区别?
用户空间只能映射用户内存,内核空间只能被内核使用,用户进程无法直接访问内核空间。
Linux如何将虚拟地址映射到物理内存?
虚拟地址通过页表转化为物理地址,每个进程有一个页表,内核有一个页表,映射过程涉及页号和页内偏移量。