从0开始Linux(14)——进程(5)进程空间地址(2)

欢迎来到博主的专栏:从0开始linux
博主ID:代码小豪

文章目录

    • 关于页表
      • 程序权限
      • 加载状态
    • 可执行程序分段

关于页表

在前一篇博客中博主提到,页表是链接虚拟地址(mm_struct)和物理地址(存储器)的中间商,其主要作用是映射虚拟地址与物理地址。但是除了这两属性以外还有其他的属性。博主给大家扩展几个。

程序权限

进程的空间被分为栈区,堆区,静态区与代码区,这些区域都有对应的虚拟地址存储在页表当中,我们的子进程与父进程会共用代码区中的数据,如下图所示。
在这里插入图片描述
其实页表除了记录虚拟地址和物理地址之外,还有一个属性也要记录,那就是区域对应的数据的访问权限,以代码区为例,它们在存储器当中肯定是只可读取,不可写入的,我们拿linux的文件权限(rwx)来表示这些数据的权限。
在这里插入图片描述
像变量这些,其权限则是rw,即可读可写,要注意,无论变量是否加了const修饰,它们的权限也是rw的,比如这里有个const修饰的变量i,它的权限也是rw,const限定词只会影响编译器的检查(比如改了const修饰的变量会报错),而不会影响到改变量的属性。

要注意,字面常量不在栈区和堆区当中,而是在一个称为常量区的地方,这个区域的权限是r(可读不可写)。我们以一个经典的代码为例:

char *str="hello world";
str[0]='H';//error,虽然编译器不报错,但是运行程序会崩溃

所谓的字面常量,就是比如1,2,3和"hello world"这种写在赋值符号(=)右侧的常量,在也就是我们常说的右值(rvalue)。这种数据通常都是放在常量区的,因此它们在页表中的权限为r.
在这里插入图片描述
由于,在语法上,我们并没有给*str加上const修饰,因此编译器检查语法时,这个语法1时通过的,于是编译器不报错。但是在程序运行的过程中,由于要找到str的物理地址值,因此操作系统会在页表中查看str的权限,然后发现程序在执行的过程中,对一个权限为r(可读不可写)的对象进行了写入的操作,因此操作系统觉得这个进程是非法的,直接就将进程给杀死了。所以就导致了这个代码,在编译器检查方面是通过的,但是运行起来则会崩溃。

加载状态

我们想象这么一个场景,现在有一个1GB的进程要运行,由于cpu需要切换调度进程,因此在一个时间片后,这个进程就调度结束了,那么博主这里提出一个问题:一个进程运行时,操作系统会将进程从磁盘中读取到内存,那么操作系统是不是将整个进程都读取到内存当中呢?

当然不是,因为cpu中调度一个进程的时间片很短,因此在很多时候,一个时间片内进程都不会运行结束,而是可能执行了几万行代码之后就切换到下一个进程了。而那些执行过或者还没执行到内容,有可能是不会存在到内存当中的。因为cpu并不是只执行一个进程,而是多个进程,如果一个2gb的进程全都加载到内存当中,可能还有其他内存更大的进程在运行,那么其他进程怎么办。

在页表当中还有一个属性,我们将其称为内容加载状态,如果存在则设为1,不存在则设为0。比如一些执行过的代码,还没有使用的数据,都是只有虚拟地址,而没有物理地址的,因为它们还不存在,只有当它们存在了,才会有它们相应的物理地址。
在这里插入图片描述
这样做的目的其实就是节省空间,我们以现实为例,黑神话悟空的大小有足足100gb,而我们常见的家用的电脑则只有16gb或者32gb的运存(实际就是内存大小),如果黑神话悟空是直接将所有的数据都加载到内存当中,那么16gb的内存早爆了,但是实际上我们却能正常的运行它。比如我们切换场景的时候会加载数据,或者看一下过场动画,实际上就是给游戏准备它加载到内存的空间,如果加载完成,就能继续游戏了。

可执行程序分段

现在我们都已经了解了,一个可执行程序存在栈区,堆区等等的区域分段,来保存数据。还有一个页表来映射各个段中的数据状态,以及虚拟地址和物理地址的映射关系。

但是我们来思考一个问题,博主在前一篇文章中提到过,这些可执行程序分段(其实就是进程空间分段)是由一个叫做mm_struct的结构体来管理的。写过代码都清楚,一个结构体对象其实是要初始化的,但是我们的进程,每个进程的的变量个数都不一样(栈区空间不一样),堆区的大小也不一样,甚至连代码正文的大小都不一样,那么mm_struct是怎么初始化的呢?它又是靠什么数据来初始化的呢?这些数据又是从哪获取的?

这些东西我们也不知道,mm_struct也不知道,但是有一个人肯定知道,我们先不说,这里我们输入指令

readelf -S [可执行文件名]

这里博主随便写了一个可执行程序,命名为hello,代码也就不给大家看了。接着我们输入指令

readelf -S hello

在这里插入图片描述
这些数据其实就是一个进程的各个分段,比如栈区,堆区,代码区的地址啊,权限啊之类的东西,这说明一个进程要形成什么样的分段,并不是在该进程被运行时才产生的,而是它本来就有,但我们执行该进程时,task_struct就管理该进程,并且让mm_struct读取这些数据,在根据这些数据,创建出分段,比如代码区的地址,大小,权限等。

这说明,一个进程的分段并不是运行时才生成的,那么它是什么时候有的呢?没错,那就是编译期间生成的。编译器除了要编译我们写的代码之外,还有生成一些额外的信息,上述的分段就是由编译器生成的,然后操作系统在运行该进程时又将这些信息读取进去。这里说明一个现象,那就是编译器和操作系统其实是有关联的!!!因此我们在linux上生成的可执行程序,在windows系统下却不能运行,反之亦然。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Jmeter之GET与POST 请求的参数存放位置

根据不用的请求方式,参数的设置详细如下,二选一,否则报错 POST请求 GET请求

VMware中安装配置Ubuntu(2024最新版 超详细)

目录 一、安装虚拟机软件 二、VMware虚拟机 三、 Ubuntu 下载 (1)官网下载 (2)清华镜像网站下载 四、创建虚拟机 五、Ubuntu 系统安装过程的配置 六、更换国内镜像源 七、环境搭建完毕 全篇较长,请慢慢观看 一…

ffmpeg视频滤镜:平均模糊

滤镜简述 avgblur 官网链接> FFmpeg Filters Documentation 平均模糊滤镜会使视频变得模糊&#xff0c;模糊的程度可以通过参数进行控制。 模糊滤镜可以用于保密的场景&#xff0c;视频特效也会用到这个滤镜。 滤镜使用 参数 sizeX <int> .…

AMS1117 -3.3稳压芯片管脚图以及典型电路

AMS1117 是一个输出电流达到 1A 的三端输出低压差线性稳压器。 上面那个头不要接地&#xff0c;接了会有问题。 还有就是AMS1117不只是3.3V稳压的&#xff0c;还有5v的等&#xff0c;自己注意看左下角的数字。 如果是5就是5V&#xff1b;如果是33就是3.3V。 典型应用电路如下…

基于springboot的网上服装商城推荐系统的设计与实现

基于springboot的网上服装商城推荐系统的设计与实现 开发语言&#xff1a;Java 框架&#xff1a;springboot JDK版本&#xff1a;JDK1.8 服务器&#xff1a;tomcat7 数据库&#xff1a;mysql 5.7 数据库工具&#xff1a;Navicat11 开发软件&#xff1a;idea 源码获取&#xf…

【AI大模型】本地部署 Code Llama 大模型

要在本地部署 Code Llama 大模型并结合 Text Generation Web UI 实现远程运行 LLM&#xff08;大语言模型&#xff09;&#xff0c;你需要完成以下几个步骤&#xff1a; 1. 准备环境 1.1 硬件和软件要求 硬件&#xff1a; GPU&#xff08;如 NVIDIA 及支持 CUDA 的显卡&#…

内衣迷你洗衣机什么牌子好?内衣洗衣机2024年口碑指数排行榜推荐

内衣专用的洗衣机是一种专门设计用于洗涤内衣和贴身衣物的小型洗衣机。相比于普通的大型洗衣机&#xff0c;这样的小型洗衣机在设计和功能上有很大的区别。内衣专用的迷你洗衣机可以有效地保护内衣和贴身衣物的质量和卫生。在传统的洗衣机中&#xff0c;如果经常将内衣裤、袜子…

RabbitMQ 中的交换机学习

RabbitMQ 中的交换机学习 一、直接交换机&#xff08;Direct Exchange&#xff09; 1. 介绍 Direct 交换机将消息路由到绑定了指定 Routing Key 的队列中。每条消息都有一个 Routing Key&#xff0c;当队列绑定到 Direct 交换机时&#xff0c;它需要一个指定的 Routing Key。…

使用Python实现某易云音乐歌曲下载

前言 在这篇文章中,我们将探讨如何通过Python结合JavaScript代码来逆向网易云音乐的API接口,以获取并下载指定歌曲。请注意,本文仅用于技术学习与交流目的,实际使用时请遵守相关法律法规及服务条款。 目标网站 1. 准备工作 首先,我们需要安装一些必要的库: execjs:用…

揭秘灼口综合征:你的舌头痛竟是这些原因在作祟!

在日常生活中&#xff0c;你是否曾遭遇过舌头像被火烧般的灼痛感&#xff1f;这种让人难以忍受的症状&#xff0c;其实是一种名为“灼口综合征”的疾病表现。今天&#xff0c;我们就来深入探讨这一疾病的背后原因&#xff0c;让你了解这一病症的真相&#xff0c;从而更好地应对…

随记:有关idea中jdk版本

第一个地方&#xff1a;这个可能就是你整个项目的jdk版本的使用&#xff0c;你改了这里大概率可以改了 第二个地方&#xff1a; 就是 有关maven项目的 pom文件 一开始我的第一地方用的是 17 但是这里用的是8 但是运行的时候还是 17 这里可能是 maven的 项目这个地方只是对…

Unity导入.FBX模型设置

** Unity导入.FBX模型设置 ** 第一步、导入.fbx模型 Assets- Import New Asset 第二步、设置 Animation Type 为Legacy 这里导入的是非人形模型设置为Lagacy None&#xff1a;不导入动画Animation Clip Legacy&#xff1a;用于早期动画设置&#xff0c;其不支持状态机A…

WebSocket状态码及异常报错1006

文章目录 1.WebSocket协议简介2.WebSocket状态码的作用&#xff1a;3.WebSocket状态码1006详解1.问题原因2.解决方案 1.WebSocket协议简介 WebSocket协议是一种基于TCP的协议&#xff0c;它通过在浏览器和服务器之间建立一条持久的双向通信通道&#xff0c;实现了实时的数据传…

Web,RESTful API 在微服务中的作用是什么?

大家好&#xff0c;我是锋哥。今天分享关于【Web&#xff0c;RESTful API 在微服务中的作用是什么&#xff1f;】面试题&#xff1f;希望对大家有帮助&#xff1b; Web&#xff0c;RESTful API 在微服务中的作用是什么&#xff1f; 在微服务架构中&#xff0c;Web 和 RESTful …

NVIDIA 发布适用于网络安全的 NIM Blueprint

德勤使用适用于容器安全的 NVIDIA NIM Agent Blueprint 帮助企业利用开源软件构建安全的 AI。 文章目录 &#x1f64a; 德勤使用 NVIDIA AI 保障软件安全&#x1f64a; 通过生成式 AI 保障软件安全&#x1f64a; 适用于网络安全成功的蓝图&#x1f3a0; 什么是 NVIDIA NIM Agen…

javaWeb项目-ssm+jsp高校毕业生就业满意度调查统计系统功能介绍

本项目源码&#xff08;点击下方链接下载&#xff09;&#xff1a;java-ssmjsp毕业生就业满意度调查系统实现源码(项目源码-说明文档)资源-CSDN文库 项目关键技术 开发工具&#xff1a;IDEA 、Eclipse 编程语言: Java 数据库: MySQL5.7 框架&#xff1a;ssm、Springboot 前端&…

Java使用原生HttpURLConnection实现发送HTTP请求

Java 实现发送 HTTP 请求&#xff0c;系列文章&#xff1a; 《Java使用原生HttpURLConnection实现发送HTTP请求》 《Java使用HttpClient5实现发送HTTP请求》 《SpringBoot使用RestTemplate实现发送HTTP请求》 1、HttpURLConnection 类的介绍 HttpURLConnection 是 Java 提供的…

字幕怎么自动生成?教你5种视频加字幕方法

在这个短视频时代&#xff0c;视频内容已成为传播信息、娱乐大众的重要载体。而字幕作为视频不可或缺的一部分&#xff0c;不仅能够提升观众的观看体验&#xff0c;还能跨越语言障碍&#xff0c;让所有观众都能享受视频的魅力。但怎么给视频加上字幕呢&#xff1f;下面给大家分…

图像及视频的基本操作

文章目录 一、认识计算机中的图像二、图像数据的读取三、数据读取-视频四、图像的其他操作 一、认识计算机中的图像 一张彩色图片是由很多个像素点组合而成的&#xff0c;而一个像素点是由R G B三个通道组成。RGB代表红色&#xff08;Red&#xff09;、绿色&#xff08;Green&a…

Linux系统基础-文件系统

个人主页&#xff1a;C忠实粉丝 欢迎 点赞&#x1f44d; 收藏✨ 留言✉ 加关注&#x1f493;本文由 C忠实粉丝 原创 Linux系统基础-文件系统 收录于专栏[Linux学习] 本专栏旨在分享学习Linux的一点学习笔记&#xff0c;欢迎大家在评论区交流讨论&#x1f48c; 目录 1. 回顾C语言…