Linux基础内容(12)—— 程序地址空间

news2025/7/23 21:06:26

目录

1.误区和它的由来

2.虚拟地址的证明

3.虚拟地址的实现

1.虚拟空间的解释

2.操作系统管理和规划虚拟空间

3.虚拟地址与物理地址的联系

4.多进程的虚拟地址解释

5.磁盘中可执行文件的地址

6.进程地址空间出现的原因


接上面内容

Linux基础内容(11)—— 进程理解


1.误区和它的由来

初学者会理解该地址空间就是一个容器,它用来存放不同的变量,并且会伴随一个地址的产生,使得我们以为这个程序地址空间是真实存在的,毕竟c程序还能传回指针。但是我们要知道,其实这些都是假的。


2.虚拟地址的证明

 那么如何知道它是一种虚拟的呢?

编辑这一串代码:fork产生出父子进程,子进程循环打印,当进行10次后global变为300;父进程循环打印。 

  1 #include<stdio.h>
  2 #include<unistd.h>
  3 #include<stdlib.h>
  4 
  5 int global_value = 100;
  6 
  7 int main()
  8 {
  9     pid_t id = fork();
 10     if(id < 0)
 11     {
 12         printf("fork error\n");
 13         return 1;
 14     }
 15     else if(id == 0)
 16     {
 17         int cnt = 0;
 18         while(1)
 19         {
 20             printf("我是子进程,pid:%d,ppid:%d,global_value:%d,&global_value:%p\n",getpid(),getppid(),global_value,&global_value);
 21             sleep(1);
 22             cnt++;
 23             if(cnt==10)
 24             {
 25                 global_value = 300;
 26                 printf("子进程已经更改了全局的变量了..............\n");
 27             }
 28         }
 29     }
 30     else
 31     {
 32         while(1)
 33         {
 34 
 35             printf("我是父进程,pid:%d,ppid:%d,global_value:%d,&global_value:%p\n",getpid(),getppid(),global_value,&global_value);
 36             sleep(2);
 37         }
 38     }
 39     sleep(1);
 40     return 0;
 41 } 

如果我们相信程序地址空间的格式遵循那个表图,那么运行该文件后会出现这样吊诡的结果:两个子进程的地址一致,但是地址中的变量不一样。因为一个地址不能同时存在不同的变量,所以地址空间并不是真的。

 结论:语言学习过程中的地址概念,指针绝对不是物理地址,它是虚拟地址(线性地址/逻辑地址)


3.虚拟地址的实现

1.虚拟空间的解释

1.进程认为自己独占系统的资源(运行时占领资源,不运行时不会察觉到)

就像存钱,只要你的钱存进去,你就没有了对钱的控制权,存钱方拿这比钱利滚利。当年想那会,存存钱方会把它偌大的资金堆中拿出你指定的金额让你使用。

2.操作系统运行多个进程,给每一个进程分配进程地址空间

那么操作系统要怎么分配的?操作系统对程序执行后的虚拟地址空间进行管理,用数据结构进程描述(mm_struct)后进行管理。

2.操作系统管理和规划虚拟空间

回到虚拟地址空间的思想(以32位为例,64同理可推):

1.地址空间的存储是字节存储

2.32位下,每个地址是4字节,共可以表示4G(2^32)个地址

3.每个存储单元的地址唯一,那么每个单元都可以被标记上32位的01数字,显然是独一无二的地址,从低到高依次编制数字。那么我们默认进程空间就这么大,毕竟地址最大只能描述这么大了。

4.地址空间中划分的每个区域的规定:就是从某个地址到某个地址加以规定后记录,便是所谓的区域,形成了所谓的栈区、堆区...等。这些划分的地址被操作系统描述出数据结构类型进程描述并且存储记录,并且在适当的时候(某个区域大小不够)进行调整划分,所以进程空间中对应的地址空间的划分就形成了。

所以,我们就能理解为什么是虚拟地址了,因为本质每个单元后面并没有地址标明单元到底在哪个位置,只是操作系统存储了地址的范围,其实改变地址就是改变数据结构里那32位的变量。malloc等扩大空间、free等缩小空间的行为就是修改数字而已。

当然此时我们理解的地址空间不在是依附于C/C++的空间了,其实本质是进程的地址空间。

3.虚拟地址与物理地址的联系

要知道,物理地址就是磁盘的执行文件加载到内存变为进程,这些进程存出的空间就是物理地址。虚拟地址和物理地址通过页表联系;页表一侧记录虚拟地址,一侧记录物理地址。上层拿的是虚拟地址,虚拟地址通过页表联系物理地址,使得物理地址执行命令。页表的介绍以后再解释。


4.多进程的虚拟地址解释

我们回归到之前让我们觉得吊诡的结果,其实是不同进程,操作系统开辟不同位置的物理内存,并且用虚拟地址加以描述,搞得我们觉得一个进程就决定了整个内存,其实内存被分为了很多个小片段来执行这些进程。那么虚拟地址的也只是反映了进程空间中的地址,真正的物理地址空间被页表给隐藏了,不能得到物理地址。

那么上面代码出现父子进程地址一样原因是fork创建子进程会复制父进程的地址空间和变量数据。但是后来子进程变量改变了,为了不让父子进程冲突,子进程的虚拟地址所指的页表映射不同,所有在物理地址中的变量地址也就不同了。这样的行为被叫做“写时拷贝”,这些行为都是操作系统自动执行的。


5.磁盘中可执行文件的地址

那么我们编译文件时,那些函数调用是怎么来的,进程都没有生成啊?其实不矛盾,首先PCB指向的空间进程管理的是堆区和栈区等地址。但是它是要在加载进程的时候调整的,那么进程没有生成前,其实代码段和数据区这些由编译给出的。编译器在生成可执行文件时,可执行文件中调用的代码的地址和C库函数链接生成函数表时就已经整理好函数对应的地址了,并且执行文件的变量也生成了地址,都一并在变成进程时加载到内存中去了。程序的函数等地址是逻辑地址,加载到内存之中就拥有了物理地址。最后把虚拟地址填入到页表,再联系内存的物理地址,然后加载进程后调整栈区和堆区的地址,达到整体进程空间的完整。

最后CPU访问进程的所有数据的地址,返回的地址都是虚拟地址即进程空间对应的地址。


6.进程地址空间出现的原因

1.进程如果直接访问内存,越界访问其他的文件,那么对物理地址本身有很大的影响。所以需要进程地址间接访问物理地址空间。越界也不会伤害到物理地址的内容,因为页表会进行越界判断。即保护物理内存。

2.方便进程与进程之间数据代码的解耦,保证进程的独立性

3.让进程以统一的视角来看待进程对应的代码和数据等各个区域,编译器也以统一视角编译代码,方便使用。

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

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

相关文章

在排序数组中查找元素的第一个和最后一个位置 - 力扣中等

在排序数组中查找元素的第一个和最后一个位置 题目链接 给你一个按照非递减顺序排列的整数数组 nums&#xff0c;和一个目标值 target。请你找出给定目标值在数组中的开始位置和结束位置。 如果数组中不存在目标值 target&#xff0c;返回 [-1, -1]。 你必须设计并实现时间…

2022 年 10 月 NFT 报告

Sept. 13, 2022, Daniel Data Source: October 2022 NFT Report (ENG) 10 月对于区块链来说是一个相对沉闷的月份&#xff0c;没有巨大的市场波动、项目启动或融资轮次。 由于宏观环境依然严峻&#xff0c;NFT 市场自夏末以来继续停滞不前。 从上个月的报告开始&#xff0c;F…

精准配置无线接入点发射功率

目录 1、为什么需要调节无线接入点的发射功率 2、无线接入点发送功率配置原则 2.1 802.11管理帧发射功率对接入行为影响 2.2 802.11数据帧发射功率对接入质量的影响 2.3 802.11管理帧、数据帧发射功率协调原则 1、数据帧发射功率务必大于等于管理帧发射功率 2、高频射频…

DOX-Poloxamer/DBCO-PEG-DOX 阿霉素修饰泊洛沙姆/二苯基环辛-聚乙二醇-阿霉素的探究

小编这里分享了DOX-Poloxamer/DBCO-PEG-DOX 阿霉素修饰泊洛沙姆/二苯基环辛-聚乙二醇-阿霉素的探究&#xff0c;和小编一起来看&#xff01; DBCO&#xff08;二苯并环辛炔&#xff09;是一种环炔烃&#xff0c;可以通过在水溶液中通过应变促进的1,3-偶极环加成反应与叠氮化物反…

【毕业设计】机器视觉答题卡识别系统 - python 深度学习

文章目录1 简介2 什么是机器视觉3 实现步骤4 最后1 简介 &#x1f525; Hi&#xff0c;大家好&#xff0c;这里是丹成学长的毕设系列文章&#xff01; &#x1f525; 对毕设有任何疑问都可以问学长哦! 这两年开始&#xff0c;各个学校对毕设的要求越来越高&#xff0c;难度也…

Cy7-NH2/amine氨基修饰荧光染料

伯胺基(primary amine)是生物标记反应中常用的基团。蛋白表面赖氨酸侧链(residue)官能团就是伯氨基,伯胺基可以和NHS活化酯(N-羟基琥珀酰亚胺酯,N-hydroxysuccinimide ester,succinimidyl ester),异氰酸酯(-NCS,isothiocyanate)或其它活化基团反应生成稳定链接,从而把Cy7分子连…

标志寄存器

标志寄存器 文章目录标志寄存器1.标志寄存器概念1.1 零标志位(ZF)1.2 奇偶标志位(PF)1.3 符号标志符(SF)1.4 进位标志符(CF)1.5溢出标志符(OF)2.adc指令和sbb指令3.cmp指令4.检测比较结果的条件转移指令5.DF标志和串传送指令6.pushf和popf1.标志寄存器概念 CPU内部的寄存器中&a…

UG NX 12装配——组件位置:装配约束

利用装配约束在装配中定位组件。 选择【装配】【组件】【装配约束】命令&#xff0c;或单击【装配】工具条上的【装配约束】按钮出现【装配约束】对话框。 &#xff08;1&#xff09;接触对齐 接触对齐约束可约束两个组件&#xff0c;使其彼此接触或对齐。这是最常用的约束。…

m无线通信信道matlab仿真,包括自由空间损耗模型,Okumura-Hata模型,COST231 Hata模型,SUI信道模型

目录 1.算法概述 2.仿真效果预览 3.MATLAB部分代码预览 4.完整MATLAB程序 1.算法概述 无线信道是移动通信的传输媒体&#xff0c;所有的信息都在这个信道中传输。信道性能的好坏直接决定着人们通信的质量&#xff0c;因此要想在有限的频谱资源上尽可能地高质量、大容量传输…

2022关键之年,国产奶粉「争霸之秋」

奶粉又到关键年。 在中国奶粉的发展历程中&#xff0c;有两个关键性的时间节点&#xff1a;2008年&#xff0c;三鹿事件打乱了国产奶粉的发展节奏&#xff0c;洋奶粉开始大行其道&#xff1b;2016年&#xff0c;婴配粉注册制实行&#xff0c;打着“更适合中国宝宝体质”旗号的…

数据库系统工程师难考吗?

数据库系统工程师属于软考中级科目&#xff0c;只要你多看书多做练习&#xff0c;熟悉考试题型&#xff0c;用对学习方法&#xff0c;并不难考的。但是你专业不对口&#xff0c;应该在备考上多下功夫&#xff0c;建议把考试大纲里的内容复习一遍&#xff0c;掌握好考纲里的知识…

使用android 提取小米手机日志

如何使用android sdk获取小米日志 下载android sdk 登录网址https://www.androiddevtools.cn/ 往下滑找到SDK tools,下载zip包并解压到电脑随便一个位置 解压缩位置打开SDK Manager.exe&#xff0c;安装相关工具&#xff08;具体可以网络搜索&#xff09; 打开电脑cmd 使用a…

世界杯听腾格尔《遥远的地方》,可以多帮助你爱的球队多进几个球

世界杯又到来啦&#xff0c;球迷朋友笑哈哈&#xff0c;听着音乐看球赛&#xff0c;球迷朋友乐开怀。——世界杯&#xff0c;中国球迷欢迎你&#xff01;随着2022年11月20号的临近&#xff0c;卡特尔世界杯即将打响&#xff0c;每一位中国球迷都为之热血沸腾。 虽然说中国的足球…

ly-tab插件动态更改高度进行多端适配

在开发移动端用ly-tab时遇到的一个小问题&#xff0c;众所周知当我们使用rem配合flexible.js时元素的高度会根据不同的设配进行自动适配&#xff0c;但是ly-tab插件的高度默认使用px为单位&#xff0c;就会导致在不同的设备中出现我们不可控的因素 比如当我们想将其定位到顶部…

[附源码]java毕业设计农产品溯源管理

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

[附源码]java毕业设计农村留守儿童援助信息系统论文2022

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

普乐蛙大型VR模拟航空体验馆vr飞船体验馆vr航天科普馆定制

普乐蛙VR科普基地&#xff0c;拥有展示VR科普体验的设备多台&#xff0c;向观众科普及现代高科技全沉浸式虚拟现实&#xff08;VR&#xff09;技术应用&#xff0c;同时通过360度全沉浸式VR动感仿真设备体验防风防震、火灾逃生、交通安全等科普常识、寓教于乐&#xff0c;其乐无…

YOLOv5实操——检测是否戴口罩

文章目录数据集和代码的准备yolov5源码下载数据集的下载制作个人数据集数据集标注json 转 txt训练阶段模型训练可视化测试阶段数据集和代码的准备 yolov5源码下载 yolov5官方下载地址 数据集的下载 直接下载别人制作好的数据集 Mask Wearing Dataset 下载 然后将其放入与yo…

模型压缩算法库 MMRazor 全面升级,更灵活、更自动

MMRazor 是 OpenMMLab 开源项目里模型压缩领域的算法工具箱&#xff0c;目前支持了知识蒸馏、模型通道剪枝和模型结构搜索&#xff0c;模型量化部分正在开发中。 量化设计 RFC&#xff08;request for comment&#xff09;链接也放在这啦&#xff0c;欢迎各位小伙伴去提需求和建…

分享一个超好看回忆相册(代码自取)

目录 前言 正文 部分代码 单面截图 更改文档标题 更改图片 更改文字 源码 前言 Calabash Brothers 《葫芦兄弟》&#xff08;又名&#xff1a;葫芦娃&#xff09;&#xff0c;是上海美术电影制片厂于1985-1987年原创出品的13集系列剪纸动画片&#xff0c;是中国动画第…