【Linux】之地址空间

0x00.引言

c语言中常说的某变量的地址是真实的物理地址吗?

不是。准确来说是指进程地址空间,本文将围绕地址空间介绍虚拟地址空间,页表和mmu,以及进程地址空间与物理地址间的关系

0x01.进程地址空间

【Linux】之地址空间_第1张图片

每一个进程在启动时操作系统都会给它创建一个地址空间,即进程地址空间,每一个进程由对应的pcb(task_struct)结构体维护,所谓的进程地址空间实际上是一个叫mm_struct的结构体。

0x02.虚拟地址空间

1.概念

虚拟地址空间是指操作系统为每个运行的进程提供的抽象地址空间。在这个虚拟地址空间中,程序认为自己独占了整个计算机内存,不受底层硬件的限制。程序使用虚拟地址进行内存访问,而这些虚拟地址最终会由内存管理单元(MMU)转换为物理地址,以实际在硬件上存取数据。

就是或操作系统给每个进程“画大饼”、

2.虚拟地址空间和进程地址空间的关系

这个困扰了我很久,求助了chatgpt得到的答案是:

【Linux】之地址空间_第2张图片

简而言之就是每个进程有自己的进程地址空间,这些进程地址空间自认为自己独占整个虚拟地址空间,其实他们分布在虚拟地址空间的不同部位,共享虚拟地址空间。

0x03页表和mmu

1.概念

页表是一种数据结构,通常是有多个级别的表。用于存储虚拟地址空间和物理地址空间之间的映射关系。它记录了虚拟页面和对应的物理页面之间的映射关系。

mmu(memory management unit)内存管理单元是计算机体系结构中的一个硬件组件,负责实现虚拟地址到物理地址的转换。它是CPU和主存之间的桥梁,通过在运行时动态地将虚拟地址转换为物理地址,使得程序可以使用虚拟地址进行访问,而无需关心底层的物理地址。

地址转换过程: MMU的工作流程涉及到对页表的查询。当CPU发出一个虚拟地址请求时,MMU首先使用虚拟地址的高位(通常是页表索引)查询页表,找到相应的物理页框号,然后将虚拟地址的低位(通常是偏移量)添加到物理页框号的基地址上,得到最终的物理地址。

2.联系

  1. 共同工作: 页表和MMU共同协作以实现虚拟地址到物理地址的映射。页表提供虚拟地址和物理地址之间的映射关系,而MMU负责实际的地址转换。

  2. 地址映射: 页表中的项(表项)存储了虚拟页面和物理页面之间的映射关系。MMU根据这些映射关系执行地址转换,将程序使用的虚拟地址映射到实际的物理地址。

  3. 性能影响: 页表的设计和访问效率直接影响系统的性能。合理的页表设计可以提高内存管理的效率,而MMU的快速地址转换能力有助于加速内存访问过程。

  4. 硬件支持: MMU通常是硬件级别的支持,而页表的创建和维护是由操作系统负责的。操作系统需要与MMU紧密协作,确保页表的正确性和及时的更新。

0x04.总结

【Linux】之地址空间_第3张图片

进程创建操作系统为该进程创建pcb(task_struct),并为其分配虚拟地址空间(包括用户空间和内核空间)和页表。然后加载程序的代码和数据到虚拟地址空间中并初始化栈(用于存放函数调用和局部变量),随后操作系统将页表中的条目填充建立映射关系,并为进程分配物理内存页框,将虚拟页映射到物理页上。当新进程被调度执行时,CPU通过MMU将进程的虚拟地址转换为实际的物理地址,进程开始执行。

以上就是全部内容,如果有帮助,请点赞支持

你可能感兴趣的:(linux,运维,服务器)