11.程序地址空间_2
在上一章的内容之中我们已经发现此时全局变量的值已经被修改了,但是同样地址的情况下,其中的数据内容竟然是不一样的
接下来我想来详细解释一下,让我们彻底弄明白进程地址空间
进程地址空间的编址过程(32位机器下)
首先要明确一下几点
- 进程地址空间描述的基本空间大小是字节
- 32位之下可生成
2^32
个地址,一个地址指向的一块空间内容是一个字节一个地址对应唯一一个字节,同时唯一性也就是地址最大的意义 - 也就是说说我们最终生成的是一个4GB的空间
这样一块地址空间由什么管理呢?
mm_struct
mm_struct
是 Linux 内核中用于描述进程地址空间的核心数据结构,它在内存管理中扮演着至关重要的角色。下面是它如何管理进程地址空间的详细解析:
mm_struct
的作用
mm_struct
是每个进程唯一的内存描述符,主要用于管理该进程的整个虚拟地址空间。它通过多个成员变量和辅助结构来实现这一功能。
核心组成与管理机制
-
虚拟地址空间布局
mm_struct
包含指向多个vm_area_struct
的指针,这些结构体描述了虚拟地址空间中的各个区域(如代码段、数据段、堆、栈等)。- 每个
vm_area_struct
表示一个连续的虚拟地址区间,并记录其访问权限、映射类型等信息。
-
页表管理(这个暂时先忽略咱们接着往下看)
pgd
(Page Global Directory)是页表的顶层指针,mm_struct
通过它管理整个页表结构。- 页表用于将虚拟地址映射到物理地址,是内存访问的基础。
-
内存映射与文件映射
mmap
操作会在mm_struct
中添加新的vm_area_struct
,用于映射文件或设备到进程地址空间。
-
与
task_struct
的关系- 每个进程的
task_struct
中有一个指向mm_struct
的指针。 - 对于线程,
task_struct
中的mm
指针可能指向同一个mm_struct
。
- 每个进程的
task_struct和mm_struct的链接
首先一句话来介绍task_struct
他是 Linux 内核中用于全面描述一个进程的结构体,掌管其身份、状态、资源、调度信息等,是进程管理的“指挥中心”。
同时他也指向了这一个进程的虚拟地址空间.
虚拟地址和物理地址进行链接
现在我们知道这个程序跑起来之后,要运行,首先就要被task_struct
进行管理,pid,进程优先级等等信息都要被进行管理,并且会指向一块虚拟进程空间,这块空间被分成栈区、堆区、数据段、代码段,在我们取地址之后看到的也就是这里的地址。
但是我们同样也知道这个程序是一定会被放到CPU上去运行的。那这快虚拟地址和物理地址之间应该一定是有联系的。那是如何完成过这样的链接的呢?
- 页表管理(这个暂时先忽略咱们接着往下看)
pgd
(Page Global Directory)是页表的顶层指针,mm_struct
通过它管理整个页表结构。- 页表用于将虚拟地址映射到物理地址,是内存访问的基础。
现在我们可以来看这块内容了,页表将虚拟与物理地址相互链接。
页表是操作系统中用于实现虚拟地址到物理地址映射的关键数据结构,是现代内存管理的核心机制之一。下面是对页表的简明解析:
什么是页表?
页表(Page Table)是操作系统为每个进程维护的一张映射表,用于将虚拟地址空间中的“页号”转换为物理地址空间中的“页框号”。
页表的组成与工作原理
-
虚拟地址划分
- 虚拟地址通常被分为两部分:页号 + 页内偏移。
- 页号用于查找页表,页内偏移用于定位页内具体地址。
-
页表项(PTE)
- 每个页表项记录一个虚拟页对应的物理页框地址。
- 还包含访问权限、是否在内存中、是否被修改等标志位。
-
地址转换过程
- CPU 生成虚拟地址。
- 操作系统查页表,根据页号找到对应的物理页框。
- 加上页内偏移,得到最终物理地址。
-
多级页表
- 为节省内存,现代系统采用多级页表(如二级或三级页表)。
- 每级页表负责一部分地址解析,逐级定位最终页表项。
所以为什么不直接使用物理地址?
愿意也就是页表的优势
- 隔离性:每个进程有独立页表,防止互相干扰。
- 灵活性:虚拟地址空间可以远大于物理内存。
- 安全性:通过权限控制防止非法访问。