Linux中虚拟内存详解

一、虚拟内存的概念

虚拟内存是现代操作系统为了有效管理内存资源、提高内存利用率以及实现多任务处理等目的而引入的一种重要的内存管理机制。它为每个程序(通常对应一个进程)提供了一个看似连续且容量较大的地址空间,而这个地址空间并不一定直接对应着实际的物理内存。

二、虚拟内存的作用

1. 地址空间扩展

在 32 位系统中,通过虚拟内存机制,每个程序可以拥有 4GB 的虚拟地址空间,在 64 位系统中这个虚拟地址空间则更为庞大。这使得程序在编写和运行时无需过于担心物理内存的实际容量限制,仿佛拥有了足够大的内存来存放数据和执行指令。

2. 内存保护

虚拟内存允许操作系统为不同的程序(进程)设置不同的内存访问权限。例如,一个进程的代码区可以被设置为只读权限,防止程序在运行过程中意外修改自身代码;而数据区可以设置为可读可写权限。通过这种权限设置,能够有效保护各个进程的内存区域不被其他进程非法侵入,保障了系统的稳定性和安全性。

3. 内存共享

不同的进程可以通过虚拟内存机制共享某些内存区域。比如,多个进程可能都需要访问同一个动态链接库,那么操作系统可以通过虚拟内存的映射方式,使得这些进程在各自的虚拟地址空间中都能 "看到" 并访问到这个共享的动态链接库所在的内存区域,提高了内存资源的利用率。

4. 便于内存管理

虚拟内存将实际的物理内存和程序使用的内存进行了分离,使得操作系统可以更加灵活地管理内存资源。例如,操作系统可以根据程序的运行需求,动态地将虚拟地址空间中的页面映射到物理内存的不同页框中,或者将暂时不使用的页面从物理内存中置换出来,存储到磁盘等外部存储设备上的交换空间(swap space)中,以腾出物理内存给更需要的程序使用。

三、虚拟内存与进程的关系

1. 进程视角下的虚拟内存

对于每个进程而言,它所看到的就是自己独立的虚拟地址空间,这个空间被划分成不同的区域,如代码区、数据区、栈区、堆区等。进程在运行过程中,通过虚拟内存机制,按照自身的需求对这些区域进行数据存储和指令执行等操作。例如,当一个进程调用一个函数时,会在自己的栈区虚拟地址空间内开辟相应的空间来存储函数调用的相关信息;当进程需要动态分配内存时,会在堆区的虚拟地址空间中进行操作。

2. 操作系统对进程虚拟内存的管理

操作系统负责为每个进程创建和维护其虚拟地址空间。当一个进程启动时,操作系统会根据进程的可执行文件等相关信息,将其虚拟地址空间的各个区域进行初始化,确定每个区域的大小、权限等属性。同时,操作系统还会通过页表等机制,将进程的虚拟地址空间中的页面不断地映射到物理内存的页框中,以保障进程的正常运行。并且,在进程运行过程中,操作系统会根据进程的运行状态和内存需求,动态地调整虚拟地址空间与物理内存之间的映射关系,比如将暂时不使用的页面置换出来,或者将需要的页面重新映射到物理内存中。

四、页表

虚拟内存和物理内存都被划分成固定大小的单元,在 Linux 中通常是 4KB 大小的页(Page)和页框(Page Frame)。虚拟内存以页为单位进行管理,物理内存以页框为单位进行管理。

在 Linux 操作系统中,task_struct是一个极为重要的结构体,它用于表示一个进程的所有信息,是进程在内核中的抽象表示。上面的图可以看出在常见的基于页式内存管理的操作系统(如 Linux)中,进程的各个内存区域包括栈区、代码区、数据区等,通常是按照固定大小(一般为 4KB,不过不同系统可能有差异,也可能采用其他如 8KB 等页大小)划分成一个个的页,然后通过页表来映射到物理内存中同样大小的一个个页框(也是 4KB 等)。

五、MMU

MMU(Memory Management Unit,内存管理单元)是现代计算机系统中非常重要的一个组件,主要负责处理虚拟内存与物理内存之间的映射关系以及提供内存访问保护等功能。

1、物理内存映射

MMU 的映射作用:MMU 的核心功能之一就是实现虚拟内存到物理内存的映射。它通过维护页表(Page Table)来完成这种映射关系。当 CPU 要访问一个虚拟地址时,MMU 会根据预先设置好的页表,将该虚拟地址转换为对应的物理地址,然后再去访问实际的物理内存位置。例如,在 Linux 系统中采用多级页表机制,MMU 依据这些页表结构准确地找到虚拟地址对应的物理地址,使得程序能够在虚拟地址空间中正常运行,而无需关心实际物理内存的布局和分配情况。

2、页表管理

页表存储:如前文所述,MMU 依靠页表来实现虚拟地址到物理地址的映射。页表通常存储在物理内存中,并且其结构可以是多级的,比如常见的二级页表或三级页表结构(以不同的计算机架构为准)。MMU 会根据需要从物理内存中读取页表项信息来完成地址转换操作。

页表更新与维护:在系统运行过程中,随着程序的运行和内存的动态分配与再分配,页表可能需要不断更新。例如,当一个程序新申请了一块内存,或者释放了一块已使用的内存,操作系统会相应地修改页表中的相关页表项,MMU 则依据更新后的页表继续准确地进行地址转换。同时,MMU 也可以协助操作系统进行一些页表维护工作,比如检测页表项是否有效等。

3、内存访问保护

保护机制原理:MMU 除了进行地址转换外,还提供了重要的内存访问保护功能。它通过设置不同的权限位来区分不同类型的内存访问,比如可读、可写、可执行等权限。当 CPU 试图访问一个虚拟地址时,MMU 会先检查该虚拟地址对应的页表项中设置的权限,如果访问操作不符合规定的权限,MMU 就会触发一个异常,阻止这种非法访问行为,从而保护了系统的内存资源以及各个程序的运行安全。

应用场景示例:考虑一个多用户系统,不同用户的程序在运行时都有各自的虚拟地址空间。MMU 通过对每个用户程序的虚拟地址空间设置恰当的权限,确保一个用户的程序不能随意访问另一个用户程序的内存区域,同时也防止程序对系统关键内存区域(如内核空间)进行非法访问,保障了系统的稳定性和安全性。、

六、虚拟内存在系统层面的存在形式

虚拟内存不仅仅局限于进程内部。在整个操作系统层面,虚拟内存是一种整体的内存管理策略和机制。操作系统会设置一个总的虚拟地址空间,这个空间包含了所有可能被各个进程所使用的虚拟地址空间部分,以及一些用于操作系统自身运行的虚拟地址空间部分(如内核空间)。同时,操作系统会通过一系列的机制(如页表管理、内存置换算法等)来管理这个总的虚拟地址空间与实际物理内存之间的关系,以确保整个系统的高效运行和内存资源的合理利用。

所以,虚拟内存虽然与进程紧密相关,是每个进程运行所依赖的重要机制,但它也是整个操作系统层面用于内存管理的一种重要手段,在系统层面也有其存在形式和管理方式。

相关推荐
yaoxin52112310 分钟前
第三十二章 UDP 客户端 服务器通信
服务器·网络协议·udp
筱小虾米2 小时前
解决SSL VPN客户端一直提示无法连接服务器的问题
运维·服务器
dntktop4 小时前
内嵌编辑器+AI助手,Wave Terminal打造终端新体验
运维
Peter_chq5 小时前
【计算机网络】多路转接之select
linux·c语言·开发语言·网络·c++·后端·select
太阳风暴6 小时前
Ubuntu-修改左Alt和Win键位置关系
linux·ubuntu·修改键盘·键盘映射
kaiyuanheshang6 小时前
docker 中的entrypoint和cmd指令
运维·docker·容器·cmd·entrypoint
wanhengwangluo7 小时前
裸金属服务器能够帮助企业解决哪些问题?
运维·服务器
Python私教7 小时前
除了 Docker,还有哪些类似的容器技术?
运维·docker·容器
titxixYY7 小时前
SElinux
linux·运维·服务器