【Linux】第二十九站:再谈进程地址空间

news2025/1/11 2:43:35

文章目录

  • 一、一些疑问
  • 二、程序没有加载前的地址(程序)
  • 三、程序加载后的地址
  • 四、动态库的地址

一、一些疑问

什么是虚拟地址?什么是物理地址?CPU读到的指令里面用的地址,是什么地址??

我们之前在使用动态库的时候,有一个选项-fPIC,它是与地址无关码。

二、程序没有加载前的地址(程序)

程序编译好之后,内部有地址的概念吗?

答案是有的!如下所示,其实在程序的内部,这些变量名都已经变成了地址了

image-20240115221708474

在以前还没有虚拟地址的时候,我们的程序一开始还没有被执行的时候,它就已经会被分成各个段。

而现在这些编译时的编址已经是平坦模式[0,4GB]。即它在编址的时候已经严格按照地址空间的方式进行编译代码的。所以说在磁盘上看到的可执行程序的顺序排布和以后的进程地址空间中的规则是一样的。

所以编译器也已经考虑了操作系统了!!!

如下所示

image-20240115222937589

这里的地址已经就是虚拟地址了!,也就是说可执行程序还没加载上去时候,已经是虚拟地址了,不过为了进行区分,在可执行程序还没有进行加载的时候,我们会把他叫做逻辑地址。如果是50多年前,逻辑地址和虚拟地址还是不一样的,不过现在逻辑地址,虚拟地址,线性地址等这些已经是同一个概念了,只不过逻辑地址一般是磁盘当中的可执行程序的地址

我们可以先随便写一点代码

image-20240116122853667

然后编译运行以下

image-20240116123628808

然后我们使用这个指令,这个指令可以直接将我们这个程序给反汇编出来

objdump -S a.out

比如下面的这一部分,左边的这一行就是每个指令的地址,每个指令都有不同的长度,有的是一个,有的是三个等等

三、程序加载后的地址

如下所示,当我们把代码和数据加载到内存的时候,当然要占据物理内存

image-20240116163034842

从而天然的就有了物理地址,所以当可执行程序加载到内存的时候,就有了两套地址,一套是逻辑地址,一套是物理地址。

那么如何执行第一条指令呢?

其实在可执行程序中已经有一个entry入口地址了,那么这个entry是不是物理地址呢?其实不是,因为它是在加载之前就有了,它就是一个逻辑地址。

我们之气那也说过,一个进程是有自己的cwd工作目录和exe能找到自己的可执行程序的

image-20240116165055082

当内核数据结构形成以后,我们可以将代码先加载到内存,当然也可以先不加载,我们这里先认为没有加载。它会先读取可执行程序的一些东西,将可执行程序的入口地址entry放到EIP/PC寄存器中。因为这个正好就是一个虚拟地址,所以就可以直接去正文代码中开始执行了,然后开始读取页表

image-20240116165440230

然后此时我们现在的页表并没有建立映射,那么就会产生缺页中断,就会将程序加载进去,然后它也就天然具有了物理地址。最终虚拟物理地址的映射在页表中也都有了

image-20240116165729953

然后就可以按照正常顺序去执行了。当我们读取到下面的那条函数调用指令的时候。

image-20240116170140088

我们会发现,CPU内部读到的指令,内部可能有数据,可能也有地址,而这里的地址就是虚拟地址!,这里的虚拟地址还是需要经过页表转换成物理地址,然后继续执行。如果这虚拟地址不存在,那么直接缺页中断即可。

而此时,我们就发现了,我们的程序中,从读取到的第一个指令,到CPU的处理,再到二次继续访问它,用的全部都是虚拟地址

image-20240116170541198

而这里其实就是编译器和操作系统相互协调的最重要的表现之一

四、动态库的地址

如下图所示

像这样的地址就是绝对地址

image-20240116171933485

还有一种地址是相对地址,或者称作逻辑地址,比如下面的例子,有一个100米的跑道,有一颗树在40m处,那么当我们处于50m处的时候,我们可以说绝对地址是50,也可以说相对地址是10。

image-20240116172036913

但是当这个树就在0处的时候,那么绝对地址就是相对地址或者逻辑地址

image-20240116172156637

而在我们前面的可执行程序中,就是因为相对都是从0开始的,所以可以叫做逻辑地址,虚拟地址,相对地址这些

如下图所示,是我们前面已经提过的

image-20240116175637827

现在当我们这个程序有一个printf时候,就需要调用动态库中的函数,然后它也要被加载到内存当中

image-20240116182932088

现在我们的问题是:共享库大了,具体映射到哪里呢?

我们现在这个0x1122这个地址是一个线性地址,我们的程序要跳转到对应的位置,它在共享库中也必须在对应的位置,即0x1122,否则找不到。

image-20240116183551742

所以它就必须得在固定地址处

但是这时候问题来了,一个进程可能要有十几个库,那么怎么能都加载到固定位置呢?

所以动态库被加载到固定地址空间中的位置是不可能的。

所以库要可以在虚拟内存中,任意位置加载!!!

所以库让自己内部函数不要采用绝对编址,只表示每个函数在库中的偏移量即可!!!

image-20240116184235911

这样的话,当代码要访问库中的方法时候,那么只需要起始地址+这个偏移量即可,从而进行对应找到代码

所以我们在前面说fPIC选项的时候,它是一个与位置无关码,意思就是直接用偏移量对库函数编址

静态库为什么不谈加载?不谈与位置无关?

因为静态库是直接被拷贝到可执行程序中的。就相当于库中的方法就是我们的方法。就直接用绝对编址进行编址了

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

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

相关文章

将web如vue等项目部署到宝塔docker镜像中,以便能在任意浏览器访问

文章目录 一、准备工作二、具体步骤1、从已经推送的镜像中拉取镜像2、切换到宝塔-容器,添加容器3、启动容器4、将刚刚的端口号添加到防火墙白名单5、访问部署好的项目 参考资料 一、准备工作 仅需确认宝塔面板已经有docker镜像容器 目前新版宝塔面板都已经内置了d…

数据结构之list类

前言 list是列表类。从list 类开始,我们就要接触独属于 Python 的数据类型了。Python 简单、易用,很大一部分原因就是它对基础数据类型的设计各具特色又相辅相成。 话不多说,让我们开始学习第一个 Python 数据类型一list。 1. list的赋值 输…

做完十年数据分析后的思考与总结

种一棵树最好的时间是十年前,其次是现在。十年了,本次分享大多来自工作中的日常所思所想,欢迎自取。 01 数据分析的本质 数据是基础,分析才是重点。 行业内有专门的统计岗,就是只负责做好数据统计就可以了&#xff0…

使用pycocotools打印更多数据(注意,修改后最好再还原!最好是一次性使用)

文章目录 1 写在前面2 代码效果3 代码修改 1 写在前面 夹带私货,可能有用呢:YOLOv7-tiny,通过pycocotools包得到预测大中小尺寸目标的指标值 仅供参考!写这个代码的目的是能够打印出iou0.50的AP、AR的小中大3个尺寸的值&#xff…

记录汇川:H5U与Factory IO测试14

现实53工位的物料运输。 设置了自动连续存启动:就是一个一个运,按照顺序将空的货架填满。 设置了自动连续存停止:就是完成当前循环后退出。 设置了自动连续取启动:就是一个一个运,按照顺序将有货的货架清空。 设置…

Linux系统:yum仓库

目录 一、yum 1、yum概述 2、yum仓库 3、yum实现过程原理 二、yum配置文件详解 1、主配置文件 2、yum仓库设置文件 3、yum日志文件 三、yum命令详解 1、查询 1.1 yum list [软件名] 1.2 yum info [软件名] 1.3 yum search <关键词> 1.4 yum provides <关…

从0到1:实验室设备借用小程序开发笔记

概论 实验室设备借用小程序&#xff0c;适合各大高校&#xff0c;科技园区&#xff0c;大型企业集团的实验室设备借用流程, 通过数字化的手段进一步提升相关单位设备保障水平&#xff0c;规范实验室和设备管理&#xff0c;用户通过手机小程序扫描设备的二维码&#xff0c;可以…

1 vue防抖和限流

简介 什么是防抖 防抖&#xff08;Debouncing&#xff09;是一种前端开发中常用的技术&#xff0c;用于限制函数的执行频率。在防抖的机制下&#xff0c;一个函数在一定时间内只会执行一次&#xff0c;即使它被频繁地调用。 具体来说&#xff0c;防抖的实现方式是设置一个定…

【数据库8.0备份还原】之Percona XtraBackup

目录 Percona XtraBackup备份数据库1、Percona XtraBackup的介绍2、Percona XtraBackup安装3、Percona XtraBackup8.0的使用1.全库备份和还原2.增量备份和还原3.差异备份和还原4.差异备份和增量备份的区别5.压缩备份和还原 Percona XtraBackup备份数据库 yum源安装&#xff1a…

【技术分享】远程透传网关-单网口快速实现西门子S7-300/400 PLC程序远程上下载

准备工作 一台可联网操作的电脑一台单网口的远程透传网关及博达远程透传配置工具网线一条&#xff0c;用于实现网络连接和连接PLC一台西门子S7- 300/400 PLC及其编程软件一张4G卡或WIFI天线实现通讯(使用4G联网则插入4G SIM卡&#xff0c;WIFI联网则将WIFI天线插入USB口&#…

H3C机架式服务器前/后视图

------H3C机架式服务器前视图------ ------------ ------H3C 机架式服务器后视图------ ------------

[WUSTCTF2020]alison_likes_jojo 1

BUUCTF:https://buuoj.cn/challenges 题目描述&#xff1a; 得到的 flag 请包上 flag{} 提交。 感谢 Iven Huang 师傅供题。 比赛平台&#xff1a;https://ctfgame.w-ais.cn/ 密文&#xff1a; 下载附件解压&#xff0c;得到两张jpg图片和一个文本文件。 解题思路&#x…

mysql简单操作集成数据模型使用方法

查看表信息&#xff0c;其中包括字段信息以及创表信息 DESCRIBE asset; show COLUMNS FROM asset; SHOW CREATE TABLE asset; 常规操作表 --查询 select * FROM device_template --插入 INSERT into asset_package (protocol,project_code,lease_id,station_name,device_id,…

【运维】安装双系统之后,如何删除主硬盘的Linux的引导,图文教程

前置条件&#xff1a;已经安装了windows10系统和Linux系统&#xff0c;而且windows10系统是C盘主要盘&#xff0c;Linux系统是安装在别的硬盘上&#xff0c;这个时候C盘主要盘里面的引导分区里是由Linux的引导的&#xff0c;所以打开电脑之后才能让你选是使用windows系统还是使…

扫雷游戏【可展开一片,超详细,保姆级别,此一篇足够】

一、C语言代码实现的扫雷游戏的运行 C语言实现扫雷 二、扫雷游戏的分析与设计 1.扫雷游戏的界面设计 在玩家玩扫雷的时候&#xff0c;它会给你一个二维的棋盘&#xff08;下面的讲解都以9x9规格为例子&#xff09;&#xff0c;然后点击你想排查的坐标&#xff0c;若不是雷的&…

【23种设计模式应用场景汇总】

23种设计模式应用场景汇总 设计模式是一种在软件开发中解决特定问题的通用解决方案。下面我将尝试将23种设计模式融入到一个场景中&#xff1a; 假设我们正在开发一个在线购物系统&#xff0c;我们可以使用以下设计模式&#xff1a; 1. 工厂方法模式&#xff1a;当用户在网站上…

红米手机录屏功能在哪?这里有你想要的答案

“有人知道红米手机录屏功能在哪吗&#xff1f;刚买了最新款的红米K70&#xff0c;本来打算用来录制游戏&#xff0c;可是找了半天&#xff0c;就是没看见录屏功能&#xff0c;真的很着急&#xff0c;有没有大佬教教我。” 在手机成为人们生活不可或缺的一部分的今天&#xff…

市场下行,中国半导体进口数量、金额双双两位数锐减 | 百能云芯

根据中国海关总署最新统计&#xff0c;2023年中国累计进口集成电路&#xff08;半导体晶圆&#xff09;数量为4795亿颗&#xff0c;较2022年下降10.8%&#xff1b;而进口金额为3494亿美元&#xff0c;下降15.4%。这一数据显示&#xff0c;中国半导体进口在数量和金额两方面均出…

基于域账户及西门子simatic logon的集中权限管理的实现

原创 Luis Wang 智能大大号引文&#xff1a;博途工控人平时在哪里技术交流博途工控人社群 西门子在工业自动化领域可谓傲视群雄&#xff0c;在制药工厂&#xff0c;有超过50%以上的自动化系统、设备都配备了西门子的PLC、DCS、HMI及SCADA(wincc)平台&#xff1b;包括配液及CIP…

Arya碎碎念 | 2023年编程之旅,2024年代码人生展望

前言 回顾过去这一年&#xff0c; 2023年编程之旅&#xff0c;2024年代码人生展望 目录 前言回望2023写博客的缘起写博客的成就参加的创作活动产出的优质博客文章 展望2024代码开发方面博客规划方面 另外另外我有了一直喵 总结 回望2023 写博客的缘起 3年前&#xff0c;注册…