【linux进程(七)】程序地址空间深度剖析

news2025/1/15 12:49:13

💓博主CSDN主页:杭电码农-NEO💓

⏩专栏分类:Linux从入门到精通⏪

🚚代码仓库:NEO的学习日记🚚

🌹关注我🫵带你学更多操作系统知识
  🔝🔝


在这里插入图片描述

程序地址空间

  • 1. 前言
  • 2. 什么是程序地址空间?
  • 3. 程序地址空间是如何设计的?
  • 4. 虚拟地址和物理地址的关联
  • 5. 页表的结构以及作用
  • 6. 为什么要存在地址空间?
  • 7. 总结以及拓展

1. 前言

由于此Linux系列文章偏向于做
顺序学习手册,所以有些内容在
一篇文章中可能不连贯,敬请谅解!

请先阅读下面的文章的最后一段
了解打印出来的地址并不是物理地址
这一事实逻辑:

程序地址空间前言

本章重点:

本篇文章着重讲解进程中的虚拟地址
和物理地址的关系,了解虚拟地址的
内核本质是什么,以及页表和物理地址
的映射逻辑和写时拷贝的具体体现,
期间我们将回答三个问题:

  • 什么是地址空间?
  • 地址空间是如何设计的?
  • 为什么要有地址空间?

2. 什么是程序地址空间?

在理解地址空间前,我们知道一个事实:
平时看见的地址并不是真实的地址
又叫虚拟地址,真实的地址空间
被称为物理地址(物理内存)

我想通过讲一个故事来帮助理解
到底什么是程序地址空间:

有一个富豪,它有10亿资产,由于
年轻时比较浪,所以他有四个私生子
这四个私生子并不知道彼此的存在,
私生子A是个医生,私生子B是个企业家
私生子C是个街头混混,私生子D是个学生
富豪分别对小A,B,C,D说:
(1),小A啊,你要是努力做个医生,以后我的
10亿美金都是你的了
(2),小B啊,要是你把你的公司运作的很好
以后我的10亿美金就是你的了
(3),小C啊…小D啊…

在这里插入图片描述

故事还没结束,有一天,A说:老爸
给我10万美金,我要买医疗器械,
富豪想了想觉得是正事,于是给了
小A十万美金,小C又说:老爸,给我
两千美金吧,我吃不起饭了,富豪一听
就把钱打过去了,所以我们知道,这四个
人都可以用10亿美金以内的钱,但是
永远用不到10亿美金!

现在列出人物和地址的对应关系:

  1. 富豪对应操作系统
  2. 10亿美金对应物理地址
  3. 私生子对应每一个进程
  4. 富豪画的饼对应地址空间

所以可以得出结论,地址空间可以
理解为操作系统给进程画的饼
它并不是真实的物理地址!


3. 程序地址空间是如何设计的?

既然富豪给每一个私生子都画了饼
所以对应每一个进程都又一个自己的
程序地址空间,这是第一个结论

然而,OS要管理这些空间,一定
要先组织,再管理!所以地址空间
是一个struct结构,**这是第二个结论**

再来看看程序地址空间的图:

在这里插入图片描述

程序地址空间无非就是各个
区域的结合,然而各个区域的划分
无非就是两个整数begin和end
一个在区域的开头,一个在区域的结尾
这是第三个结论!
如图:

在这里插入图片描述

根据上面的推论,我们可以得出结论:
地址空间这个北河数据结构中(struct)
至少包含了各个区域的划分,它的概念
结构如下:

struct addr_room
{
	int code_start;//代码区起始
	int code_end;//代码区结束
	int init_start;//初始化区起始
	int init_end;//初始化区结束
	int heap_start;//堆区起始
	int heap_end;//堆区结束
	......
	其他属性
};

所谓的区域范围变化
实际上就是对start和end做加减!


4. 虚拟地址和物理地址的关联

当我们理解了什么是虚拟地址后,
现在再谈虚拟地址和物理地址的关系:

本质是一种映射关系!

现代计算机使用以下方法解决问题:
OS为每一个进程配对一个虚拟地址
空间和一张页表,要访问物理地址时,
需要先在页表进行映射,若访问的是
非法地址,则会在页表层阻止你的访问!

在这里插入图片描述

所以为什么一个地址会有两个值?
现在我们就能回答这个问题了:

创建子进程时,子进程的数据和
代码和父进程共享,也就是和父进程
一样,所以此时子进程的页表和程序
地址空间和父进程一样!当子进程尝试
修改变量的值时,操作系统会重新为子进程
开辟一份物理内存,并修改子进程页表的
映射关系,此时映射到物理内存的不同
区域,但是虚拟地址是一样的!

这个过程也叫写时拷贝

在这里插入图片描述


5. 页表的结构以及作用

修改常量字符串时编译器会报错,
是在哪个阶段报的错呢?

const char* p = "abcd";
*p = "123";

其实页表不仅仅只有映射关系
表这一个结构,它还附带了物理
内存中每一个区域的读写权限:

在这里插入图片描述

很明显,常量字符串对应的物理地址
区域的权限是只可读,所以当虚拟内存
去映射物理内存时,在页表层面发现你的
访问是权限不允许的,就会在页表层驳回
你的请求,也就是会报错!

所以页表可以起到安全评估
保护物理内存的作用!
这是页表的第一个作用

页表的第二个作用:
将无序变有序

虚拟地址在映射物理内存时
是不是随意映射的?就是说映射
到物理内存后的顺序是全乱的?
结论是当然不是!在页表层映射时
会将不同的数据类型进行划分
使得映射到物理内存后是比较
有序的一种状态!


6. 为什么要存在地址空间?

通过以下三个方面来说明
地址空间的作用:

  1. 有效的保护了物理内存

凡是非法的访问或者映射,os都
会识别到,并且终止你这个进程!
地址空间和页表都由OS创建并
进行管理,一切访问都要在OS的监管下!

  1. 使OS的耦合度更低

因为有地址空间和页表的存在,
物理内存可以不关心未来数据的
类型,可以直接对它进行加载,这样
物理内存的分配就可以和进程的管理
分开来,做到它们并没有任何关系,
所以内存管理模块和进程管理模块
就完成了解耦合的操作!

  1. 保证进程的独立性

因为有地址空间的存在,每一个进程
都认为自己拥有4GB的空间,并且各个
区域是有序的,进而可以通过页表映射
到不同的区域,来实现进程的独立性,
每一个进程不知道也不需要知道其他
进程的存在!!!


7. 总结以及拓展

关于Linux进程基础的内容就讲到
这里,下一章是全新的章节–进程控制
讲了这么久的理论了,怎么控制一个进程?
也就是创建,回收一个进程?有了前面
的基础铺垫后,后面的学习内容也就容易了

拓展阅读:

Linux中页表的内核代码


🔎 下期预告:Linux进程控制 🔍

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

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

相关文章

中国卖家的出路:TikTok电商重塑东南亚市场

2023年10月4日,印尼政府发布了一则重要公告,宣布不再允许社交媒体作为商品销售平台。这一决策直接影响了TikTok在印尼的电商业务,迫使该平台关闭了其印尼市场的电商运营。 对于TikTok电商而言,印尼市场一直占据着重要地位&#x…

机器视觉工程师们,人的命运大多数连在一起

看着鱼池里的小鱼,很是治愈。自己的往后的生活还要继续。 有次出差,和工作经验13年机器视觉工程师,他用手指着流水线上的操作工说,他们失业,去干什么,回家种田吗?都机械化种田,回家…

程序员为啥要做副业(02)-中指备用金

点击下方“JavaEdge”,选择“设为星标” 第一时间关注技术干货! 免责声明~ 任何文章不要过度深思! 万事万物都经不起审视,因为世上没有同样的成长环境,也没有同样的认知水平,更「没有适用于所有人的解决方案…

table 部分列宽度固定,剩余列宽度等分

table 固定列固定宽度&#xff0c;剩余列给最小宽度 <thead><tr><th rowspan"2" style"width:100px">序号</th><th rowspan"2" style"width:120px">姓名</th><th v-for"date in dates&q…

如何实现可靠的数据调度同步,数据同步方案看一下!

随着企业规模不断扩大&#xff0c;分支机构越来越多&#xff0c;跨区域跨国的集团越来越多&#xff0c;越来越多的企业要求内部各种业务数据在服务器、数据中心甚至云上&#xff0c;能够进行实时的调度和同步&#xff0c;从而需要部署一套数据同步方案&#xff0c;实现服务器与…

DC电源模块如何承受超负荷电流的能力

BOSHIDA DC电源模块如何承受超负荷电流的能力 DC电源模块是现代电子设备中必不可少的部件&#xff0c;它们通常被用来将交流电转换为稳定的直流电&#xff0c;为电子设备提供所需的电力。在某些情况下&#xff0c;DC电源模块可能会遇到超负荷电流的情况&#xff0c;如启动过程…

CleanMyMacXMac4.14.4版本系统优化工具

CleanMyMac是macOS上不可或缺的清理工具&#xff0c;它的作用非常强大&#xff0c;可以帮助用户清理系统、照片、邮件、iTunes垃圾&#xff0c;甚至是隐私数据。以下是CleanMyMac的主要功能和特点&#xff1a; 首先&#xff0c;CleanMyMac可以帮助清理系统垃圾&#xff0c;包括…

Pyqt5 List Widget 用户自定义添加/删除字段

添加和删除字段的逻辑 在窗口上显示一个list widget的窗口&#xff0c;还有一个添加字段的按钮 点击添加字段会弹出一个输入框&#xff0c;将内容作为一个item添加到list widget中 点击对应的已添加的字段&#xff0c;即会显示删除按钮&#xff0c;点击即可删除该字段 效果…

登录Edge发生了错误请稍后再试。Oxcfff82e发送反馈ccf05c90-0acc-0005-3100-f2cccc0ada01

登录Edge 发生了错误请稍后再试。Oxcfff82e发送反馈ccf05c90-0acc-0005-3100-f2cccc0ada01 1、如果连接了 VPN &#xff0c;建议断开 VPN。 2、按 “Windows 徽标键X”&#xff0c;启动 “Windows Power Shell&#xff08;管理员&#xff09;”&#xff08;也可以自行以管理员…

【java学习—十】List集合(6)

文章目录 1. List 与 ArryList2. 应用2. ArrayList 与 Vector 1. List 与 ArryList List 代表一个元素有序、且可重复的集合&#xff0c;集合中的每个元素都有其对应的顺序索引     List 允许使用重复元素&#xff0c;可以通过索引来访问指定位置的集合元素。     List…

开源库存管理系统InvenTree的安装

本文是应网友 shijie880500 要求折腾的&#xff1b; 什么是 InvenTree &#xff1f; InvenTree 是一个开源的库存管理系统&#xff0c;提供强大的低级别库存控制和零件跟踪。InvenTree 系统的核心是 Python/Django 数据库后端&#xff0c;它提供了一个管理界面&#xff08;基于…

Mac 上免费的网络Folx Mac 下载器

Mac最好的下载工具Folx Pro 5 for Mac 是由兔八哥爱分享整理发布 。 Folx Pro 5 for Mac是目前Mac平台上数一数二的下载工具&#xff0c;功能强大&#xff0c;几乎可以满足您的所有下载需求。folx pro for mac完整版不但可以下载网上任何文件&#xff0c;而且支持断点续传&…

大数据之LibrA数据库系统告警处理(ALM-12001 审计日志转储失败)

告警解释 根据本地历史数据备份策略&#xff0c;集群的审计日志需要转储到第三方服务器上。如果转储服务器满足配置条件&#xff0c;审计日志可以成功转储。审计日志转储失败&#xff0c;系统产生此告警。如果第三方服务器的转储目录磁盘空间不足&#xff0c;或者用户修改了转…

【JavaSE】逻辑控制:顺序、分支和循环结构

目录 一、概述与顺序结构 1.逻辑控制的概述 2.顺序结构 二、分支结构 1.if语句 2.switch语句 3.switch语句与if语句的对比 三、循环结构 1.while语句 2.for语句 3.do…while循环&#xff08;选学&#xff09; 四、循环的跳转 1.break语句 2.continue语句 五、总…

【设计模式】第20节:行为型模式之“备忘录模式”

一、简介 备忘录模式也叫快照模式&#xff0c;具体来说&#xff0c;就是在不违背封装原则的前提下&#xff0c;捕获一个对象的内部状态&#xff0c;并在该对象之外保存这个状态&#xff0c;以便之后恢复对象为先前的状态。这个模式的定义表达了两部分内容&#xff1a;一部分是…

git重装后如何连接以前项目

git重装后如何连接以前项目 1、配置秘钥 点击 Git Bash Here&#xff0c;进入命令操作窗口 生成本地git仓库秘钥&#xff1a; 1、填写自己邮箱 2、一直回车 ssh-keygen -t rsa -C “xxxxxqq.com”3、使用cat查看生成的秘钥&#xff0c;粘贴并设置到gitee上 cat ~/.ssh/id_r…

3.2、Linux开发工具之gcc/g++

个人主页&#xff1a;Lei宝啊 愿所有美好如期而遇 目录 背景知识 gcc如何完成 预处理 编译 汇编 链接 函数库 gcc选项 g和gcc的区别 背景知识 二进制-->汇编-->C-->C&#xff0c;java&#xff0c;php等 刚开始&#xff0c;工程师和科学家们是通过二进制指…

Flutter PopupMenuButton下拉菜单

下拉菜单是移动应用交互中一种常见的交互方式,可以使用下拉列表来展示多个内容标签,实现页面引导的作用。在Flutter开发中,实现下拉弹框主要有两种方式,一种是继承Dialog组件使用自定义布局的方式实现,另一种则是使用官方的PopupMenuButton组件进行实现。 如果没有特殊的…

Apache Doris (四十八): Doris表结构变更-替换表

🏡 个人主页:IT贫道_大数据OLAP体系技术栈,Apache Doris,Clickhouse 技术-CSDN博客 🚩 私聊博主:加入大数据技术讨论群聊,获取更多大数据资料。 🔔 博主个人B栈地址:豹哥教你大数据的个人空间-豹哥教你大数据个人主页-哔哩哔哩视频 目录

浅析智慧水务平台在城市发展中的应用

贾丽丽 安科瑞电气股份有限公司 上海嘉定 201801 摘要&#xff1a;当下&#xff0c;以数字孪生为主的数字技术愈发成熟&#xff0c;为使得长江水环境治理能够“长治久安”&#xff0c;上海院在长江大保护先行先试城市九江城中水环境治理中启用了智慧水务先进理念&#xff0c;搭…