一文剖析 Linux 内核的内存管理

💡 原文中文,约4300字,阅读约需11分钟。
📝

内容提要

Linux系统中的内存管理涉及物理内存的组织、虚拟地址的作用和如何组织虚拟地址。物理内存按照页面、区域和节点组织,内存分配分为大内存和小内存分配。虚拟地址对应虚拟空间,用户态和内核态分别分配虚拟空间。虚拟地址通过页表映射为物理地址,TLB用于缓存虚拟地址和物理地址的映射。虚拟内存将硬盘中的swap分区作为虚拟内存,可以运行更大内存的程序。用户空间只能映射用户内存,内核空间只能被内核使用。

🔎

延伸解读

虚拟地址:安全与隔离的基石

文章指出,直接操作物理地址会导致用户进程可能影响内核运行、干扰其他进程,带来稳定性和安全隐患。引入虚拟地址后,每个进程拥有独立的地址空间,通过逻辑地址到物理地址的映射进行内存分配。这种设计实现了进程间的隔离,也保护了内核空间不被用户进程直接访问,是Linux内存管理的基础机制。

物理内存的分级组织与分配策略

Linux将物理内存按页面、区域和节点三级组织。页面是基本单位,通常4KB;区域包括ZONE_DMA、ZONE_NORMAL和ZONE_HIGHMEM,分别服务不同用途;节点对应CPU,内存不足时可跨节点申请。分配上,大内存用伙伴系统,按2的幂次管理页块,不足时向上分裂;小内存用slub分配器,从缓存链表中快速获取,用后不立即清空,以备复用。

页表与TLB:地址转换的效率关键

虚拟地址通过页表映射到物理地址,每个进程有独立页表,内核共用一个页表。32位系统采用两级页表,将虚拟地址分为10位索引、10位页表记录偏移和12位页内偏移,用离散存储减少连续内存需求;64位系统则使用5级页表。TLB作为CPU中的缓存,存储虚拟地址到物理地址的映射,查询时先查TLB,未命中再查页表,从而提升转换效率。

虚拟内存与swap分区的权衡

虚拟内存利用硬盘上的swap分区作为扩展,将暂时不用的内存页换出,需要时再调入。这使得系统能运行比物理内存更大的程序,因为程序无需一次性加载所有数据。但swap操作涉及磁盘I/O,速度远低于物理内存,频繁换入换出会拖慢系统。因此,虚拟内存扩展了容量,却以性能为代价,适合内存紧张但非高性能要求的场景。

❓

Q&A

Linux内核的内存管理主要涉及哪些方面?

Linux内核的内存管理主要涉及物理内存的组织、虚拟地址的作用以及内存的分配和回收。

虚拟地址在Linux内存管理中有什么作用?

虚拟地址避免用户进程直接操作物理地址,从而提高系统稳定性和安全性,并为每个进程提供独立的地址空间。

Linux系统如何组织物理内存?

Linux系统将物理内存按照页面、区域和节点组织,页面是最小单位,区域包括ZONE_DMA、ZONE_NORMAL和ZONE_HIGHMEM。

大内存和小内存的分配方式有什么不同?

大内存分配利用伙伴系统,而小内存分配则使用slub分配,后者通过维护链表来管理内存。

如何将虚拟地址映射到物理内存?

虚拟地址通过页表映射到物理地址,每个进程对应一个页表,内核只有一个页表。

TLB在内存管理中起什么作用?

TLB是一个缓存,用于加速虚拟地址到物理地址的转换,提高地址转换的效率。

🏷️

标签

➡️

继续阅读