基于Linux对 【进程地址空间】的详细讲解

news2024/12/28 4:06:06

研究背景:
● kernel 2.6.32

● 32位平台

–❀–❀–❀–❀–❀–❀–❀–❀–❀–❀–❀–❀–❀–❀–❀–❀–❀–❀–❀-正文开始-❀–❀–❀–❀–❀–❀–❀–❀–❀–❀–❀–❀–❀–❀–❀–❀–❀–❀–❀–

在学习操作系统中想必大家肯定都见过下面这幅图

但是其实这并不是真实的储存空间

我拿代码来切入为大家进行讲解:
大家可以运行一下下面代码

#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
int g_val = 0;
int main()
{
	pid_t id = fork();
	if (id < 0) {
		perror("fork");
		return 0;
	}
	else if (id == 0) { //child
		printf("child[%d]: %d : %p\n", getpid(), g_val, &g_val);
	}
	else { //parent
		printf("parent[%d]: %d : %p\n", getpid(), g_val, &g_val);
	}
	sleep(1);
	return 0;
}

输出:

//与环境相关,观察现象即可
parent[2995]: 0 : 0x80497d8
child[2996]: 0 : 0x80497d8
我们发现,输出出来的变量值和地址是一模一样的,很好理解呀,因为子进程按照父进程为模版,父子并没有对变量进行进行任何修改。可是将代码稍加改动 :
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
int g_val = 0;
int main()
{
	pid_t id = fork();
	if (id < 0) {
		perror("fork");
		return 0;
	}
	else if (id == 0) { //child,子进程肯定先跑完,也就是子进程先修改,完成之后,父进程再读取
		g_val = 100;
		printf("child[%d]: %d : %p\n", getpid(), g_val, &g_val);
	}
	else { //parent
		sleep(3);
		printf("parent[%d]: %d : %p\n", getpid(), g_val, &g_val);
	}
	sleep(1);
	return 0;
}

输出:

//与环境相关,观察现象即可
child[3046]: 100 : 0x80497e8
parent[3045]: 0 : 0x80497e8
我们发现,父子进程,输出地址是一致的,但是变量内容不一样!能得出如下结论 :

● 变量内容不一样,所以父子进程输出的变量绝对不是同一个

● 但地址值是一样的,说明,该地址绝对不是物理地址!

● 在 Linux 地址下,这种地址叫做 虚拟地址
● 我们在用 C/C++ 语言所看到的地址,全部都是虚拟地址!物理地址,用户一概看不到,由 OS 统一管理
OS 必须负责将 虚拟地址 转化成 物理地址

进程地址空间

所以之前说 程序的地址空间’ 是不准确的,准确的应该说成 进程地址空间 ,那该如何理解呢?看图:
分页&虚拟地址空间

在Linux操作系统中,进程运行从磁盘加载到内存,进程存储开辟内存空间都是用虚拟地址mm_struct通过页表再映射到真实的物理地址上的,而父子进程其实是通用一套物理内存空间,所以父进程的代码和数据子进程也是可以看到访问的,如果子进程要对父进程中的代码或数据做修改的话此时会发生写时拷贝,也就是在物理内存中新开辟一块空间用于子进程对数据的存储,而页表上的虚拟地址重新映射到新的物理地址但虚拟地址不变,所以我们通过代码打印地址才会看到同一地址上却显示的不同数据信息。

总结就是:同一变量,虚拟地址相同,通过页表映射到了不同的物理地址上。

这里再说明一点,虚拟地址和页表里面的地址其实都是从代码中加载进来的,因为代码本身就含有地址,大家可以将上面的代码转到反汇编即可看到每段代码对应的地址

为什么要有虚拟地址和页表?

● 数据在物理内存上开辟其实是无序的,而通过虚拟地址空间和页表可以将无序变成有序,让进程以统一的视角看待物理内存以及自己运行的各个区域

● 让进程管理模块和内存管理模块进行解耦,提高物理内存空间的利用率

● 拦截非法请求(比如越界访问等),对物理内存进行保护

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

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

相关文章

如何防止员工私自拷贝公司内部文件?安企神帮你解决泄密之忧

在企业运营中&#xff0c;保护公司的机密信息至关重要。员工私自拷贝公司内部文件不仅可能导致商业秘密泄露&#xff0c;还可能损害公司的声誉和经济利益。下面我们将介绍一些有效的方法来防止这种情况的发生&#xff0c;并以“安企神”软件为例进行详细说明。 1. 明确规章制度…

怎么调试python脚本

打开pycharm community 2019.1软件&#xff0c;创建一个项目。 创建一个py后缀的文件作为示范&#xff0c;文件名自己定义。 编写代码&#xff0c;然后右键点击进行运行&#xff0c;查看一下是否有问题。 点击右上角的虫子图标&#xff0c;然后下面会有控制面板出来&#xff0c…

财务会计与管理会计(四)

文章目录 月度数据统计分析OFFSET函数在图表分析中的应用 多种费用组合分析图SUMPRODUCT函数 省公司全年数据分析模板INDIRECT、OFFSET函数 多公司分季度数据筛选VLOOKUP、IFERROR函数的应用 淘宝后台数据分析OFFSET函数在跨表取数中的应用 燃气消耗台账数据统计分析图SUMPRODU…

进程的结束

回顾上节&#xff1a; 父子进程的关系 子进程是父进程的副本 子进程获得父进程的数据段&#xff0c;堆&#xff0c;栈&#xff0c;正文段共享 在fork之后&#xff0c;一般情况下那个会先运行是不确定的&#xff0c;取决于操作系统 练习&#xff1a; 用进程实现文件拷贝 …

某家用智能路由权限绕过

You can’t improve your past, but you can improve your future. 你无法改变过去&#xff0c;但你可以让未来变得更美好。 漏洞描述 某家用智能路由存在权限绕过&#xff0c;通过Drop特定的请求包访问未授权的管理员页面 漏洞实战 访问漏洞url http://x.x.x/index.html…

数据结构 AVL树

概述 AVL树的主要特点是在插入或者删除节点后&#xff0c;树会自动保持其平衡性&#xff0c;从而保证了最坏情况下&#xff0c;查找、插入和删除的时间复杂度都是O&#xff08;log n&#xff09;。注意AVL树是符合二叉搜索树的规则&#xff0c;即左子树小于根节点数值&#xf…

为什么说视频监控平台必须要有转码能力?视频汇聚平台EasyCVR视频转码能力解析

在当今数字化时代&#xff0c;视频监控技术已成为社会安全、城市管理、企业运营等多个领域不可或缺的一部分。随着监控系统的广泛应用和技术的不断进步&#xff0c;视频数据的处理与传输需求日益复杂多样&#xff0c;这使得视频监控平台必须具备强大的转码能力显得尤为重要。以…

Python模拟退火算法

目录 模拟退火算法简介模拟退火算法的步骤模拟退火算法的Python实现场景&#xff1a;函数优化问题 代码解释总结 模拟退火算法简介 模拟退火算法&#xff08;Simulated Annealing, SA&#xff09;是一种基于物理退火过程的随机搜索算法&#xff0c;用于寻找全局最优解。其灵感…

如何用OceanBase实现HBase架构升级

随着数据量的爆炸性增长&#xff0c;特别是半结构化和非结构化数据的涌现&#xff0c;传统关系型数据库如 MySQL 遭遇了前所未有的挑战。这一背景下&#xff0c;为非结构化数据管理而生的 NoSQL 数据库&#xff0c;以及旨在解决海量数据存储难题的分布式技术应运而生&#xff0…

Day08-K8S安全框架RBAC

Day08-K8S安全框架RBAC 0、昨日内容回顾:1、K8S安全框架1.1 K8S的安全架构流程图解1.2 RBAC1.3 基于用户的权限管理实战1.4 RBAC基于组的方式认证:1.5 serviceaccount 2、持久卷与动态存储2.1 传统基于存储卷的方式挂载的缺点2.2 引入PV和PVC实现后端存储解耦2.3 引入动态存储类…

鸿蒙(API 12 Beta3版)【播控特性简介】分布式媒体会话

使用媒体播控&#xff0c;可以简单高效地将音视频投放到其他HarmonyOS设备上播放&#xff0c;如在手机上播放的音视频&#xff0c;可以投到2in1设备上继续播放。 HarmonyOS提供了统一的应用内音视频投播功能设计&#xff0c;通过使用系统提供的投播组件和接口&#xff0c;应用…

FLUX:AI 图像生成的新王者;VideoDoodles:在视频中添加手绘涂擦动画丨 RTE 开发者日报

开发者朋友们大家好&#xff1a; 这里是 「RTE 开发者日报」 &#xff0c;每天和大家一起看新闻、聊八卦。我们的社区编辑团队会整理分享 RTE&#xff08;Real-Time Engagement&#xff09; 领域内「有话题的新闻」、「有态度的观点」、「有意思的数据」、「有思考的文章」、「…

提升家居品质,从一颗螺丝开始:深度解析定制螺丝服务

在家具设计行业&#xff0c;每一件作品都是设计师动能的结晶&#xff0c;它们不仅背负着对审美的追寻&#xff0c;而且还具有对作用考虑。在这过程中&#xff0c;螺钉作为连接各部件的主要部件&#xff0c;其重要性不言而喻。家具的坚固性和美观度完全取决于螺钉的挑选运用。传…

【机器学习】可视化注意力的基本概念以及几种常见的注意力可视化方法

引言 在机器学习中&#xff0c;尤其是深度学习领域&#xff0c;注意力机制&#xff08;Attention Mechanism&#xff09;已经成为处理序列数据&#xff08;如自然语言处理、图像识别等&#xff09;的一种重要技术。可视化注意力可以帮助我们理解模型是如何关注输入数据的特定部…

数据结构-常见的七大排序

上节中我们学习了七大排序中的五种(插入排序、希尔排序、堆排序、选择排序、交换排序) 数据结构-常见的七大排序-CSDN博客 这节我们将要学习快速排序(hoare、指针法、挖洞法(快排的延伸)、快速排序非递归(栈)) 1.快速排序 1.1 hoare法 1.1思路 1.选出一个key&#xff0c;一…

Centos 7.9 安装 图解版 小白必看 最新

兄弟们&#xff0c;非小白就散了吧 安装VMware和CentOS7系统 CentOS7.9.io镜像下载 建议 阿里云下载cents镜像ios 链接如下 https://mirrors.aliyun.com/centos/7.9.2009/isos/x86_64/CentOS-7-x86_64-DVD-2207-02.iso VMware安装 win7用 12 win10 用 15 win11用 16.2.4 …

Layui——隐藏表单项后不再进行验证

目录 修改后的部分代码 修改后的完整代码 我编辑用户信息和添加新用户用的是同一个表单&#xff0c;不同的是编辑用户信息里没有密码项和确认密码项&#xff0c;但是把它们隐藏后仍然要进行验证&#xff0c;也就是说它们俩的验证并没有随着表单项的隐藏而关闭。原因&#xf…

阴阳脚数码管

1.小故事 最近&#xff0c;我接到了一个既“清肺”又“烧脑”的新任务&#xff0c;设计一个低功耗蓝牙肺活量计。在这个项目中我们借鉴了一款蓝牙跳绳的硬件设计方案&#xff0c;特别是它的显示方案——数码管。 在电子工程领域&#xff0c;初学者往往从操作LED开始&#xff…

JavaSE 网络编程

什么是网络编程 计算机与计算机之间通过网络进行数据传输 两种软件架构 网络编程3要素 IP IPv4 IPv6 Testpublic void test01() throws UnknownHostException { // InetAddress.getByName 可以是名字或ipInetAddress address InetAddress.getByName("LAPTOP-7I…

混剪素材哪里下载?网盘格式的素材网站分享

在今天的文章中&#xff0c;我们将深入探讨如何在互联网上寻找高质量的混剪素材&#xff0c;尤其是对于短视频和自媒体制作者来说&#xff0c;寻找合适的素材至关重要。在本文中&#xff0c;我将向大家推荐一系列优秀的素材下载网站&#xff0c;这些网站提供可以直接下载到百度…