Linux——进程(5)进程地址空间

news2025/3/25 1:17:41

先看一个程序和现象

预期现象是,子进程和父进程相互独立,子进程的gval是100,101,102....而父进程一直都是100.

结果我们并不意外,只是我们发现,父子进程的gval的地址是一样的,这有点颠覆我们的认知,同一个地址,怎么会有两个不同的值,我们只能认为,这个地址不可能是物理意义上的地址,我们叫虚拟地址。

一、进程地址空间是什么

我们确定,虚拟地址不是物理地址,但它和物理上的内存也有一定关系,假设我们现在有许多进程运行,每一个进程都会占用一部分内存空间,这是物理意义上的,但是,我们让每一个进程都认为自己独占整个物理内存大小,即各进程间不知道彼此的存在。那么进程地址空间就是操作系统告诉每一个进程自以为独占的那块“空间"(实际并不一定存在故是虚拟)

管理进程地址空间依旧是先描述再组织,进程地址空间,本质上是一个内核数据结构对象(PCB),名为struct mm_struct。每次进程访问物理内存时,都通过这个空间进行访问的。

我们的物理内存空间分为栈堆等空间,本质是讲内存划分为若干个区域,实现方法类似于定义变量然后通过下标来划定范围。在整个内存空间内,每一个字节代表一个地址,一共有2的32次方个,地址本质其实也是数字,可以被保存在unsigned long中。对于不同区域的地址,只需要记住每个区域的头和尾就可以了,中间随便用。我们 用图片再解释一下进程地址空间到底是怎样的。

首先,我们的进程的每一行代码都是有地址的,因为需要占空间,这里是指物理地址。这里出现一个页表,是操作系统为了维护每一个进程构建的,里面存放着虚拟地址和物理地址。对于一个进程来说,假设我们有一个全局变量,那么就会在内存有一个物理地址,同时,会在虚拟地址的初始化区也有一个地址(不一定相同),这两个地址就构建了映射关系。我们进程加载时,会把其中的虚拟地址返回给用户,我们是看不到真是的物理地址的。反过来也一样,写入数据时,先占虚拟地址,然后通过虚拟地址的映射关系找到物理地址进而就可以成功写入了。这也就是Linux的虚拟内存管理方案。

当创建子进程时,会拷贝父进程的代码和虚拟空间,实际上此时指向的物理空间也是一样的,也就说如果我们不做数据的修改,父子的数据也是共享的,但当我们修改时,子进程的物理内存讲改变(重新找一个地方),这个过程我们称为写时拷贝。但此时的虚拟地址不变,也就导致了我们一个虚拟地址指向了两个物理地址。

二、关于虚拟空间mm_struct

1.初始化

我们知道,只要是结构体变量就必须要进行初始化,但虚拟空间是如何进行区域划分的初始化呢?我们通过查看某个进程发现,在其编译时,代码已经被分程好几段了,包括代码大小,地址等信息,而我们的mm_struct就是根据可执行程序初始化而划分每个区域的大小的。

三、虚拟地址存在的意义

虚拟地址+页表的方式可以有效的保护内存,其实,这个页表不仅保存着虚拟地址和物理地址以及映射关系,每个地址还存在两个标记,一个是标记着这个地址(物理)是否有某种权限(rwx),还有一个是检测该虚拟地址是否对应着虚拟地址,如果我们进行访问且该地址没有某种权限就会报错,以及访问不存在的内存地址等,这些风险都在访问页表的地址中已经得到解决。防止非法访问等问题。 我们的野指针就是属于访问虚拟地址所对应的不存在的地址而报错。

其次,我们要让进程以统一的视角看待物理内存,代码和数据加载到物理内存的任意地方,就可以用虚拟地址把特定信息加载到内存的特定位置(映射)。至于全局变量,其实就是其地址一直持续到进程结束,所以才能全局使用。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2319740.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

代码随想录_动态规划

代码随想录 动态规划 509.斐波那契数 509. 斐波那契数 斐波那契数 (通常用 F(n) 表示)形成的序列称为 斐波那契数列 。该数列由 0 和 1 开始,后面的每一项数字都是前面两项数字的和。也就是: F(0) 0,F(1) 1 F(n…

星越L_陡坡缓降使用讲解

目录 1.陡坡缓降 1.陡坡缓降 中控屏下滑-点击陡坡缓降功能 35km/h以下时生效。35km/h-60km/h该功能暂停 60km/h以上该功能关闭

XSS跨站脚本攻击漏洞(Cross Site Scripting)

前提概要 本文章主要用于分享XSS跨站脚本攻击漏洞基础学习,以下是对XSS跨站脚本攻击漏洞的一些个人解析,请大家结合参考其他文章中的相关信息进行归纳和补充。 XSS跨站脚本攻击漏洞描述 跨站脚本攻击(XSS)漏洞是一种常见且危害较…

html5基于Canvas的经典打砖块游戏开发实践

基于Canvas的经典打砖块游戏开发实践 这里写目录标题 基于Canvas的经典打砖块游戏开发实践项目介绍技术栈核心功能实现1. 游戏初始化2. 游戏对象设计3. 碰撞检测系统4. 动画系统5. 用户界面设计 性能优化1. 渲染优化2. 内存管理 项目亮点技术难点突破项目总结 项目介绍 在这个…

企业信息化的“双螺旋”——IT治理和数据治理

企业信息化的“双螺旋”——IT治理和数据治理 一、核心定义二、关键差异三、内在联系四、实践挑战与融合路径五、行业案例参考六、结论数据治理(Data Governance)和IT治理(IT Governance)是现代企业数字化转型中的关键概念,二者既有紧密关联又各有侧重。以下从定义、核心内…

CCBCISCN复盘

AWDP – ccfrum 自己搭了一下环境, 复现一下这道题目, 之前比赛的时候完全没想到这个漏洞要怎么打, 修也不知道要怎么修, 就仅仅是对用户名的账号和密码进行了一下过滤, 完全没起到作用, 唉, 实在太菜 如果想要尝试复现的话可以尝试拉取这个镜像, 我打完之后就直接把这个容器给…

糊涂人寄信——递推

思路分析:当有n封信,n个信封时。第k封信没有装在第k个信封里(k从1~n),就算所有的信封都装错了。我们可以得知的是,当有1封信,时,装错类别数为0。当有两封信时,装错类别为1。 当有三…

使用 OpenCV 拼接进行图像处理对比:以形态学操作为例

图像处理在计算机视觉中起着至关重要的作用,而 OpenCV 作为一个强大的图像处理库,提供了丰富的函数来实现各类图像处理任务。形态学操作(Morphological Operations)是其中常用的技术,尤其适用于二值图像的处理。常见的…

OpenHarmony 入门——ArkUI 跨页面数据同步和页面级UI状态存储LocalStorage小结(二)

文章大纲 引言一、在代码逻辑使用LocalStorage二、从UI内部使用LocalStorage三、LocalStorageProp和LocalStorage单向同步四、LocalStorageLink和LocalStorage双向同步五、兄弟组件之间同步状态变量七、将LocalStorage实例从UIAbility共享到一个或多个视图 引言 前面一篇文章主…

Python数据可视化实战:从基础图表到高级分析

Python数据可视化实战:从基础图表到高级分析 数据可视化是数据分析的重要环节,通过直观的图表可以快速洞察数据规律。本文将通过5个实际案例,手把手教你使用Python的Matplotlib库完成各类数据可视化任务,涵盖条形图、堆积面积图、…

在 Elasticsearch 中扩展后期交互模型 - 第 2 部分 - 8.18

作者:来自 Elastic Peter Straer 及 Benjamin Trent 本文探讨了如何优化后期交互向量,以适应大规模生产工作负载,例如减少磁盘空间占用和提高计算效率。 在之前关于 ColPali 的博客中,我们探讨了如何使用 Elasticsearch 创建视觉搜…

蓝桥每日打卡--区间移位

#蓝桥#JAVA#区间移位 题目描述 数轴上有n个闭区间:D1,⋯Dn。 其中区间Di用一对整数[ai,bi]来描述,满足 ai≤bi。 已知这些区间的长度之和至少有。 所以,通过适当的移动这些区间,你总可以使得他们的"并"覆盖 [0,],也…

CUDAOpenCV 基于Hessian矩阵计算特征值

文章目录 一、简介二、实现代码三、实现效果一、简介 基于之前的博客:CUDA&OpenCV Hessain矩阵计算,我们可以计算出每个像素的特征值: 二、实现代码 ComputeHessainMatrix.cuh #ifndef HESSAIN_GPU_CUH #

基于CAMEL 的Workforce 实现多智能体协同工作系统

文章目录 一、workforce 简介1.架构设计2.通信机制 二、workforce 工作流程图示例1.用户角色2.工作流程 三、workforce 中重要函数说明1.__init__函数2.add_single_agent_worker 函数3.add_role_playing_worker 函数4.add_workforce 函数 四、基于workforce实现多智能体协调&am…

PostgreSQL_数据表结构设计并创建

目录 前置: 1 数据表设计思路 2 数据表格SQL 3 创建 3.1 创建数据库 db_stock 3.2 在 pgAdmin4 中创建表 前置: 本博文是一个系列。在本人“数据库专栏”-》“PostgreSQL_”开头的博文 1 数据表设计思路 1 日数据来自优矿,优矿的数据…

如何在MCU工程中启用HardFault硬错误中断

文章目录 一、HardFault出现场景二、启动HardFault三、C代码示例 一、HardFault出现场景 HardFault(硬故障) 错误中断是 ARM Cortex-M 系列微控制器中一个较为严重的错误中断,一旦触发,表明系统遇到了无法由其他异常处理机制解决…

MySQL -- 复合查询

数据库的查询是数据库使用中比较重要的环节,前面的基础查询比较简单,不做介绍,可自行查阅。本文主要介绍复合查询,并结合用例进行讲解。 本文的用例依据Soctt模式的经典测试表,可以自行下载,也可以自己创建…

卷积神经网络 - 卷积层(具体例子)

为了更一步学习卷积神经网络之卷积层,本文我们来通过几个个例子来加深理解。 一、灰度图像和彩色图像的关于特征映射的例子 下面我们通过2个例子来形象说明卷积层中“特征映射”的概念,一个针对灰度图像,一个针对彩色图像。 例子 1&#x…

测试Claude3.7 sonnet画蛋白质

测试Claude3.7 sonnet画蛋白虽然画的很粗糙,但是大致画了出来

java项目之基于ssm的游戏攻略网站(源码+文档)

项目简介 游戏攻略网站实现了以下功能: 管理员主要负责填充图书和其类别信息,并对已填充的数据进行维护,包括修改与删除,管理员也需要审核老师注册信息,发布公告信息,管理自助租房信息等。 💕…