【Linux】--程序地址空间

一、程序地址空间

下面我们先看一段代码的运行情况:

代码如下:

运行结果如下:

我们上面的代码是先创建一个全局变量,然后创建一个子进程,然后在子进程中对这个全局变量进行修改,然后我们的父进程的话就不会对其进行修改,然后我们将父子进程对于这个变量进行取地址,我们很惊奇的发现,其两个的地址是一样的。

那么我们就有疑问了,我们一个地址,怎么会有两幅面孔呢?

所以我们可以肯定的是,其访问的地址,肯定不是我们的真实的物理地址。

那么我们在这里就引入我们的一个新的概念,虚拟地址。

首先我们再复习一下:

进程=PCB数据结构对象+数据和代码

我们的操作系统创建一个进程的时候,会由进程中的task_struct结构体中的PCB指向这个虚拟地址,虚拟地址和物理内存地址之间,使用了一个页表进行映射,所以其虚拟地址和物理地址之间是可以互相映射的。

那么这么做的作用是啥呢?

就好比如我们去银行取钱,那么我们中间需要通过取款机,或者柜台人员一样,我们用户是无法直接去金库拿钱的吧,这是操作系统为了保护我们的物理内存的一种方式。

我们的内存中,是有很多的进程的,那么为了防止进程之间影响,所以这样操作。

那么这么做的好处就是我们的用户可以关心内存的实际布局,这个交给操作系统进行管理,我们只需要关心虚拟内存即可。

下面是我们的虚拟内存空间和物理内存之间通过页表进行联系的示意图:

页表的左边是虚拟地址的编码,右边的是物理内存对应的编码。

前面我们知道,创建一个进程,我们是先创建其内核数据结构,然后再加载数据和代码的,那么我们操作系统对于一些不着急运行的进程,那么会先不加载其数据和代码,等到要运行这个进程的时候才会将其数据和代码加载,这种就叫做懒加载。

我们创建一个子进程,子进程会和父进程共享数据和代码,在对于数据修改前,我们的页表中,对于虚拟地址和物理内存地址的映射中,其实还有一个内容,就是权限,其一开始,只能是只读的状态,然后当我们的子进程发生了数据的修改,那么物理内存就会进程报错反馈,那么操作系统此时就会立马进行反馈,然后就会在物理内存中申请一块空间,给子进程,这种叫做写时拷贝。

所以说,子进程和父进程的虚拟地址虽然一样,但是其真实的物理地址是不一样的。

相关推荐
Full Stack Developme40 分钟前
JVM 与 Linux 交互的核心原理
linux·运维·jvm
Java识堂43 分钟前
多级负载均衡架构
运维·架构·负载均衡
MXsoft6181 小时前
## 自动化巡检:从手工两小时到系统五分钟的落地实践
运维·自动化
ZLG_zhiyuan1 小时前
直击华南工博会|ZLG致远电子:EtherCAT与自动化总线应用方案动态实景呈现
运维·自动化
HackTwoHub1 小时前
最新Nessus2026.6.8版本主机漏洞扫描/探测工具Windows/Linux
linux·运维·服务器·安全·web安全·网络安全·安全架构
qq_163135751 小时前
Linux 【04-mkdir命令超详细教程】
linux
qq_163135751 小时前
Linux 【08-mv命令超详细教程】
linux
QWEDDRFTG1 小时前
C13/C19怎么选?服务器电源线电流与接口选型技巧
服务器
Nayxxu2 小时前
Gemini + RAG 企业知识库教程:从文档切片到答案生成
运维·人工智能
三雷科技3 小时前
Claude Code 命令行完全指南:从高效交互到自动化工作流
运维·自动化·交互