【LInux】从动态库的加载深入理解页表机制

news2024/10/6 2:00:11

在这里插入图片描述

💐 🌸 🌷 🍀 🌹 🌻 🌺 🍁 🍃 🍂 🌿 🍄🍝 🍛 🍤
📃个人主页 :阿然成长日记 👈点击可跳转
📆 个人专栏: 🔹数据结构与算法🔹C语言进阶🔹C++🔹Liunx
🚩 不能则学,不知则问,耻于问人,决无长进
🍭 🍯 🍎 🍏 🍊 🍋 🍒 🍇 🍉 🍓 🍑 🍈 🍌 🍐 🍍

文章目录

  • 动态库的链接理解:
  • 链接的三种方式
  • 问题一:谁来决定哪些库加载,哪些没加载?
  • 问题二:谈谈装入的三种方式
  • 谈谈程序的加载的地址问题
  • 动态库是如何被进程动态链接的

动态库的链接理解:

首先:你应该知道一个前提知识,每一个程序都有自己对应的进程空间,这个地址空间被划分为很多区域,例如:栈、堆、共享区~。

系统中有很多程序,这些程序会用到一些公共方法,将这些公共方法打包成动态库、共享库。首次使用到库时需要加载到内存中,之后其他程序在使用公共方法时,直接从内存中映射一份下来。不需要拷贝到自己的地址空间中,节省了内存。这种链接方式又叫动态链接

如下图,进程1和进程2都是用了同一个库中的方法,直接从内存中映射一份下来
在这里插入图片描述

链接的三种方式

  • 静态链接:在程序运行之前,先将各个目标模块以及他们所需要的库函数连接成一个完整的可执行文件(装入模块),之后不再拆开。
  • 装入时动态链接:将各目标模块装入内存时,边装入边链接
  • 运行时动态链接:在程序执行中需要该目标模块时才对他进行链接,优点是便于修改和更新,便于实现对目标模块的共享。

问题一:谁来决定哪些库加载,哪些没加载?

os操作系统,记住一句话操作系统中的管理都是先描述后组织,加载进来的一个个库,操作系统会为它们生成一个结构体类似于PCB存储它的描述信息,然后对其进行一个双向指针连接,由操作系统来进行管理。

问题二:谈谈装入的三种方式

装入的三种方式

  • 绝对装入:在编译时知道程序放在内存中的哪个位置,编译程序将产生绝对地址的目标代码。灵活性很低,只适用于单道程序环境,只有单道程序环境可以在程序运行之前就能确定程序将要放入哪个位置
  • 静态重定位:又称为可重定位装入。装入模块全部使用逻辑地址,在装入的时候将逻辑地址全部转换为物理地址。
    特点是必须分配其要求的全部内存空间,如果没有足够的内存,就不能装入作业。作业一旦进入内存后,在运行期间就不能再移动,也不能再申请内存空间。
  • 动态重定位:又称为动态运行时装入。装入模块使用相对地址。相对地址到物理地址的转变要等到实际运行的时候才能确定。因此装入内存后所有的地址仍然是逻辑地址。这种方式需要一个重定位寄存器的支持。
    重定位寄存器:存放装入模块存放的起始位置。当实际运行的时候实时地将逻辑地址转换为物理地址。采用动态重定位允许程序在内存中发生移动。可以将程序分配到不连续的存储区:在程序运行前只需要装入他的部分代码即可投入运算,然后在程序运行期间根据需要动态申请分配内存,便于程序段的共享,可以向用户提供一个比存储空间大得多的地址空间。

每个程序加载到内存中,都会有一个进程地址空间结构体,有栈区、堆区、共享区等等。它实际上就是一个个的有起始地址的空间组合在一起的一块空间。并不是连续的

首先,你的代码一定是保存在了磁盘上的,并且它会以绝对地址进行编址----又叫平坦模式。只需要拿到首地址,然后加上偏移量,

相对编址:就是每个区内的代码都是从0地址处开始编址

谈谈程序的加载的地址问题

你有没有想过一个问题,就是你写好的代码,cpu是如何找到你的代码所在位置的呢

1.你写的代码经过编译形成一个可执行程序。通常它会以绝对地址进行编址----又叫平坦模式
例如下图。一个可执行文件经过编译链接后形成了一个可执行程序。

  • 它包含一个表头一堆二进制代码
    为了方便我们看,使用反汇编将 二进制代码装换成我们看的懂的汇编指令
    在这里插入图片描述

  • 观察上图,可以看到每一条汇编指令都有一个八进制的地址,fun1和fun2是两个函数,还有一个main函数去调用。 这些地址,又叫逻辑地址。

2 .根据可执行程序文件的表头(表头中包含了入口地址,每个分区的起始地址等)填充进程的地址空间。,
在这里插入图片描述

在这里插入图片描述

3.从磁盘加载到内存,加载到内存后,又得到了一个物理地址,本身自带的就有逻辑地址。所有逻辑地址到物理地址的映射关系就有了。页表的左侧是逻辑地址,右侧是物理地址。

在这里插入图片描述

4.cup中的程序计数器pc指针用来保存正在执行指令的下一条指令

  • 执行的过程如下图,蓝色线所示,从cup的pc指针找到要执行的指令,放入到指令寄存器中,然后cpu执行这个指令。

在这里插入图片描述

动态库是如何被进程动态链接的

首先,第一次用到库的时候肯定是 先需要加载到内存中的,加载到内存后,它也会有一个页表(逻辑-物理地址)映射关系。而且库的名称对应的有加载到内存的起始地址。

逻辑(虚拟)地址就能找到所在内存位置,加上偏移量就能找到库中函数的起始地址,所以,当一个进程用到库中函数时,它会将函数代码映射到程序地址空间的共享区中。其他程序在使用时也是一个道理,不需要拷贝到自己的代码区中,只需在共享区做个映射即可。

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

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

相关文章

YOLOv8改进---BiFPN特征融合

一、BiFPN原理 1.1 基本原理 BiFPN(Bidirectional Feature Pyramid Network),双向特征金字塔网络是一种高效的多尺度特征融合网络,其基本原理概括分为以下几点: 双向特征融合:BiFPN允许特征在自顶向下和自…

DAY21-力扣刷题

1.买卖股票的最佳时机 121. 买卖股票的最佳时机 - 力扣&#xff08;LeetCode&#xff09; class Solution {public int maxProfit(int[] prices) {int minpriceInteger.MAX_VALUE;int maxprofit0;for(int i0;i<prices.length;i){if(prices[i]<minprice){minpriceprices[…

【面试八股文】java基础知识

引言 本文是java面试时的一些常见知识点总结归纳和一些拓展&#xff0c;笔者在学习这些内容时&#xff0c;特地整理记录下来&#xff0c;以供大家学习共勉。 一、数据类型 1.1 为什么要设计封装类&#xff0c;Integer和int区别是什么&#xff1f; 使用封装类的目的 对象化:…

Webpack安装以及快速入门

3 Webpack 1 什么是Webpack https://webpack.js.org/ (官网) webpack 是一个现代 javascript 应用程序的 静态模块打包器 (module bundler) 待会要学的 vue-cli 脚手架环境, 集成了 webpack, 所以才能对各类文件进行打包处理 webpack是一个 静态模块 打包器,可以做以下的这…

数据自动备份方法分享!

现在很多朋友对于第三方软件颇为青睐&#xff0c;因为它们具备许多电脑自带备份工具所不具备的功能。例如&#xff0c;自动备份数据的需求。尽管你已经备份了电脑数据&#xff0c;但日常使用中数据常会增加&#xff0c;你可能无暇顾及每天的备份工作。因此&#xff0c;使用数据…

C++ 引用做函数返回值

作用&#xff1a;引用是可以作为函数的返回值存在的 注意&#xff1a;不要返回局部变量引用 用法&#xff1a;函数调用作为左值 示例&#xff1a; 运行结果&#xff1a;

cs231n作业1——KNN

参考文章&#xff1a;assignment1——KNN KNN 测试时分别计算测试样本和训练集中的每个样本的距离&#xff0c;然后选取距离最近的k个样本的标签信息来进行分类。 方法1&#xff1a;Two Loops for i in range(num_test):for j in range(num_train):dist X[i, :] - self.X…

昇思25天学习打卡营第19天 | RNN实现情感分类

RNN实现情感分类 概述 情感分类是自然语言处理中的经典任务&#xff0c;是典型的分类问题。本节使用MindSpore实现一个基于RNN网络的情感分类模型&#xff0c;实现如下的效果&#xff1a; 输入: This film is terrible 正确标签: Negative 预测标签: Negative输入: This fil…

Vue3+.NET6前后端分离式管理后台实战(二十八)

1&#xff0c;Vue3.NET6前后端分离式管理后台实战(二十八)

初阶数据结构 二叉树常用函数(二)

函数一 求二叉树第K层的节点个数 还是一样 我们假设 K就是等于一 如果说是一个空数的话就返回0 如果说有值的话就返回一个1就可以 假设这个这层既不为空 又不是第K层的话 那么就说明第K层肯定是子树下面 那么就说明是左右子树的第&#xff08;K-1&#xff09;层 那么只将…

系统化学习 H264视频编码(02) I帧 P帧 B帧 引入及相关概念解读

说明&#xff1a;我们参考黄金圈学习法&#xff08;什么是黄金圈法则?->模型 黄金圈法则&#xff0c;本文使用&#xff1a;why-what&#xff09;来学习音H264视频编码。本系列文章侧重于理解视频编码的知识体系和实践方法&#xff0c;理论方面会更多地讲清楚 音视频中概念的…

STM32-Unix时间戳和BKP备份寄存器以及RTC实时时钟

本内容基于江协科技STM32视频学习之后整理而得。 文章目录 1. Unix时间戳1.1 Unix时间戳简介1.2 UTC/GMT1.3 时间戳转换 2. BKP备份寄存器2.1 BKP简介2.2 BKP基本结构2.3 BKP库函数 3. RTC实时时钟3.1 RTC简介3.2 RTC框图3.3 RTC基本结构3.4 硬件电路3.5 RTC操作注意事项3.6 R…

使用qt creator配置msvc环境(不需要安装shit一样的宇宙第一IDE vs的哈)

1. 背景 习惯使用Qt编程的童鞋&#xff0c;尤其是linux下开发Qt的童鞋一般都是使用qt creator作为首选IDE的&#xff0c;通常在windows上使用Qt用qt creator作为IDE的话一般编译器有mingw和msvc两种&#xff0c;使用mingw版本和在linux下的方式基本上一样十分简单&#xff0c;不…

在linux系统centos上面安装php7gmp扩展

ps:在ubuntu上面安装gmp(最简单) $ sudo apt-get install php7.0-gmp然后再php.ini添加extensionphp_gmp.so <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<…

论文略读: LLaMA Pro: Progressive LLaMA with Block Expansion

ACL 2024 人类通常在不损害旧技能的情况下获得新技能 然而&#xff0c;对于大型语言模型&#xff08;LLMs&#xff09;&#xff0c;例如从LLaMA到CodeLLaMA&#xff0c;情况正好相反。深度学习笔记&#xff1a;灾难性遗忘-CSDN博客——>论文提出了一种用于LLMs的新的预训练…

移动硬盘“需格式化”预警:专业数据恢复指南

移动硬盘“需格式化”危机&#xff1a;了解背后的真相 在日常的数字生活中&#xff0c;移动硬盘作为我们存储重要数据的“保险箱”&#xff0c;其稳定性与安全性直接关系到我们信息的完整与便捷访问。然而&#xff0c;当您尝试打开移动硬盘时&#xff0c;屏幕上赫然出现的“需…

Ubantu22.04 通过FlatPak安装微信

Ubuntu22.04 下使用Flatpak稳定安装微信&#xff01; 国际惯例&#xff0c;废话不多说&#xff0c;先上效果图。为啥使用Flatpak,因为Wechat官方只在FlatPak发布了最新的版本。之前使用了Wine以及Dock安装Wechat,效果都不是很理想&#xff0c;bug很多。所以使用了FlatPak。 Fl…

恢复出厂设置手机变成砖

上周&#xff0c;许多Google Pixel 6&#xff08;6、6a、6 Pro&#xff09;手机用户在恢复出厂设置后都面临着设备冻结的问题。 用户说他们在下载过程中遇到了丢失 tune2fs 文件的错误 。 这会导致屏幕显示以下消息&#xff1a;“Android 系统无法启动。您的数据可能会被损坏…

AI编程探索- iOS 实现类似苹果地图 App 中的半屏拉起效果

想要的效果 功能分析 想要实现这种效果&#xff0c;感觉有点复杂&#xff0c;于是就想搜一下相关资料看看&#xff0c;可问题是&#xff0c;我不知道如何描述这种效果&#x1f602;。 当我们遇到这种效果看着很熟悉&#xff0c;但是不知道如何描述它具体是什么的时候&#…

1、spring5.2.x源码解读之下载源码和编译

1、下载源码 1.1、git下载源码 git地址&#xff1a;https://gitcode.net/mirrors/spring-projects/spring-framework.git 1.2、源码导入idea 源码下载地址&#xff1a;https://gitcode.net/mirrors/spring-projects/spring-framework/-/archive/5.2.x/spring-framework-5.2…