第一大模块:一文串联文件系统模块
上期文章中,我们了解了 Linux内存管理模块 的其中一大功能:内核虚拟内存管理。内核的虚拟内存是怎么管理的?
内核虚拟内存的管理是用户程序创建进程和执行各种任务的基础。没有它,我们就无法正常使用系统。
但,虚拟内存终究是要落到物理内存里面的吧?那系统内核的虚拟内存是如何落到现实中的物理内存中的呢?
本期,我们就来聊聊内核虚拟内存的基石 - Linux内核内存管理。
一、内核内存管理是什么呢?
Linux 内核内存管理主要负责管理计算机硬件中的物理内存资源。
它确保系统能够高效地利用内存,同时保证系统的稳定性和安全性。
内核内存管理涉及物理内存的分配、回收、映射、保护等多个环节,是操作系统核心功能之一。
二、为什么要用单独一个模块来管理内核的物理内存?
首先是为了保证系统的运行速度
为了保证系统的运行速度,Linux内核 需要尽可能保证自己的虚拟内存映射在连续的物理内存上面。
这样才能更方便的通过虚拟地址来计算物理地址。
其次是为了做权限隔离
试想一下,假如没有权限隔离的话,其他程序岂不是随随便便就可以改系统内核的代码了?
不做权限隔离的话,假如有坏人在程序里面写入了攻击性的代码,故意攻击你的系统,甚至于进行勒索,是不是很可怕?
三、那它是怎么管理内存的?
本张流程图看似很简单,但是实际上在分配和回收内存的时候涉及了很多机制,还有很多机制是虚拟内存管理核心的机制。
1、申请使用内存
内核模块需要使用内存时,它们会向内核内存管理模块请求分配内存。
内核内存管理模块会根据请求的大小和特性(如是否允许睡眠)来选择合适的内存区域进行分配。
常见的内存分配算法包括伙伴系统(Buddy System)和 slab 分配器等。
伙伴系统是一种物理内存管理算法,它将内存划分为多个块,并通过合并和分裂这些块来满足不同大小的内存请求。
slab 分配器则是一种针对小对象的内存分配器,它提高了内存分配和回收的效率。
2、内存不用之后,怎么回收掉呢?
内核内存管理模块会跟踪这些释放的内存块,并在需要时将它们重新分配给其他请求者。
但是怎么跟踪呢?跟踪的方法就是 Linux系统内核中有 char类型 数组来标识内存块的占用情况。
未被使用的内存块在数组中被记为 0.
此外,内存回收过程中,内核还会尝试合并相邻的空闲内存块,以减少内存碎片。
四、那它是怎么进行内存保护的呢?
上期我们已经讲到了内核虚拟内存与物理内存的映射等:
本期我们来讲讲它们怎么进行内存保护的
1、内存保护是什么?
内存保护是指防止进程非法访问其他进程的内存或内核内存。
2、它是怎么实现的?
Linux内核 通过设置页表项的访问权限来实现内存保护。页表项中包含了该页的内存访问权限信息,如可读、可写、可执行等。
用户态进程访问内核态进程的内存页就会被拒绝访问。
五、那它有没有什么优化机制来确保系统的运行速度更快?
当然是有的,在本模块的第一期,我们讲了一些优化方法:从用户角度:内核如何管理内存并保证速度
这些优化方法的具体执行还在虚拟内存管理核心模块中实现的,那我们下期就来聊聊这个模块。