【Linux】对共享库加载问题的深入理解——基本原理概述

原理概述

【linux】详解——库-CSDN博客

共享库被加载后,系统会为该共享库创建一个结构,这个结构体中的字段描述了库的各种属性。在内存中可能会加载很多库,每一个库都用一个结构体描述。把这些结构体用一些数据结构管理起来,系统对库的管理就转化成了对数据的管理

系统对加载到内存的共享库的信息是很清楚的

进程地址空间示意图

【Linux】进程地址空间-CSDN博客

每个进程都会有自己的地址空间,地址空间中的共享区用来映射共享库。

CPU在代码区执行数据时需要用到库中的方法会根据编译时就给定的地址跳转到共享区,共享区的虚拟地址通过页表的映射找到物理内存中相应的数据,然后加载到CPU运算。

如果虚拟地址在页表中没有与对应的物理地址建立映射关系就会发生缺页中断,系统会把磁盘中的对应的数据加载到内存,再让虚拟地址和物理地址建立映射关系,然后这部分数据被CPU调度执行。

多个进程的页表可能会映射同一个库,即共享库可以被多个进程使用

当一个进程要对库中定义的全局变量做写入时,系统会检查检查该全局变量的引用计数,若库是被多个进程共享的,就会发生写时拷贝。一个进程对共享库的任何操作都不会影响其他进程。

线性地址虚拟地址逻辑地址进程地址空间,其实是一个概念。采用的是全0到全1的编址,用线性地址来描述这样的编址方式是一种很形象的叫法。

虚拟地址和进程地址空间是进程层面的叫法,而逻辑地址是可执行程序中的地址分配方式。

编译器给代码的编址方式是虚拟地址,CPU执行拿到的地址也是虚拟地址。在CPU中,内置了指令集,能让CPU完成一些简单的动作。

比如函数跳转,拿着该函数的地址跳转到相应的地址空间,把相应的地址进行页表映射,拿到物理内存中相应的数据加载到CPU中调度执行。

也就是说从编译器为代码分配地址到CPU调度执行的地址都是虚拟地址,如果想拿到具体的数据只需通过虚拟地址在页表中找到对应的物理地址从而拿到相应的数据。

如果虚拟地址并没有在页表中与物理地址建立映射关系,即相应的数据并没有被加载到内存中,就会发生缺页中断,数据会从磁盘加载到内存,然后对应的虚拟地址与物理地址建立映射关系。

动态库在编译时会带上-fPIC选项,该选项表示与位置无关码

在编译库代码时,不会按逻辑地址的方式分配。

而是采用偏移量的方式,这样任意位置的代码数据可以映射到共享区中的任意位置,只需要知道库的开始位置被加载到哪里,只需用开始位置的地址加偏移量即可拿到该指令的虚拟地址,然后就是与页表映射的一系列操作了。

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

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

相关文章

WordPress Dokan Pro插件 SQL注入漏洞复现(CVE-2024-3922)

0x01 产品简介 WordPress Dokan Pro插件是一款功能强大的多供应商电子商务市场解决方案,功能全面、易于使用的多供应商电子商务平台解决方案,适合各种规模的电商项目。允许管理员创建一个多卖家平台,卖家可以注册账户并在平台上创建自己的店铺,展示和销售自己的产品。提供…

kali下安装使用蚁剑(AntSword)

目录 0x00 介绍0x01 安装0x02 使用1. 设置代理2. 请求头配置3. 编码器 0x00 介绍 蚁剑(AntSword)是一个webshell管理工具。 官方文档:https://www.yuque.com/antswordproject/antsword 0x01 安装 在kali中安装蚁剑,分为两部分&am…

Zabbix 监控系统部署

Zabbix 监控系统部署 Zabbix是一个企业级开源分布式监控解决方案,可监控网络的众多参数以及服务器、虚拟机、应用程序、服务、数据库、网站、云等的运行状况和完整性。 Zabbix 使用灵活的通知机制,允许用户为几乎任何事件配置基于电子邮件的警报。这允许…

java发送图文到公众号

这两天接到了一个新任务,通过后台管理编写文章,发送到官网的同时,推送一份到公众号,研究了一下微信的文档,发现不难,只需要有几个注意点就可以了。 注意: 微信公众号只能访问微信自己上传的图片…

STM32单片机实现串口IAP升级

一.概述 1.要实现串口IAP升级,首先要编写一个bootloader程序,然后再写支持IAP的app程序; 2.keil下bootloader的程序rom和ram设置 3.app程序要用bin文件 注:本文以STM32H743举例,其他stm32单片机IAP升级原理类似。 …

达梦数据库的系统视图v$database

达梦数据库的系统视图v$database 基础信息 OS版本: Red Hat Enterprise Linux Server release 7.9 (Maipo) DB版本: DM Database Server 64 V8 DB Version: 0x7000c 03134284132-20240115-215128-20081在达梦数据库(Dameng Database&#xf…

Java——Lambda表达式

1. 背景 Lambda表达式是JavaSE 8中一个重要的新特性。Lambda表达式允许你通过表达式来代替功能接口。 Lambda表达式就和方法一样,它提供了一个正常的参数列表和一个使用这些参数的主体(body,可以是一个表达式或一个代码块)。 Lambda 表达式(…

C# YoloV8 模型效果验证工具(OnnxRuntime+ByteTrack推理)

C# YoloV8 模型效果验证工具(OnnxRuntimeByteTrack推理) 目录 效果 项目 代码 下载 效果 模型效果验证工具 项目 代码 using ByteTrack; using OpenCvSharp; using System; using System.Collections.Generic; using System.Diagnostics; using System.Drawing; using Sys…

远程服务器配置(堡垒机samba/ssh等)

分配了新的服务器后,要下载代码首先要配置ssh。有以下两种方式: 拷贝原本服务器的在本地的重新生成ssh,再跟服务器密钥配对(如未备份.gitconfig,还需重新配置git账号邮箱。) ssh配置 如果是拷贝过来的.ss…

【win11】Mouse without Borders安装问题以管理员权限安装msi文件

【win11】Mouse without Borders安装问题&以管理员权限安装msi文件 Mouse without Borders安装问题解决&以管理员权限安装msi文件启动Windows Installer服务以管理员权限安装msi文件 参考文献 Mouse without Borders安装问题 在win11下我双击MouseWithoutBorders2.2.1…

nodejs使用mysql模块自动断开

背景 第二天早上来的时候,发现接口返回异常Cannot enqueue Query after fatal error 从日志看上去,接口是正常运行的,搜索一下之后发现是数据库的问题,连接断开了 原因 MySQL中有一个名叫wait_timeout的变量,表示操…

由监官要求下架docker hub镜像导致无法正常拉取镜像

问题:下载docker镜像超时 error pulling image configuration: download failed after attempts6: dial tcp 202.160.128.205:443: i/o timeout解决办法:配置daemon.json [rootbogon aihuidi]# cat /etc/docker/daemon.json {"registry-mirrors&qu…

java springboot过滤器

在Spring Boot应用中添加自定义过滤器,可以通过实现Filter接口或继承OncePerRequestFilter类来创建过滤器,并使用FilterRegistrationBean将其注册到Spring容器中。 以下是一个简单的示例: 1. 创建过滤器类 首先,创建一个实现Fil…

C++基础语法:类构造函数

前言 "打牢基础,万事不愁" .C的基础语法的学习 引入 类是实现面向对象思想的主要方法.前面提到:类是函数的变种,类可以通过调用静态方法或者成员函数来实现逻辑.多数情况下使用成员函数.构造函数是生成类对象成员的必须条件,对此做一些构造函数的归纳 构造函数的目…

【日志消息类的编写】

日志消息类编写 由于上篇的代码比较简单,今天就多写两段代码顺便把日志消息类编写完成。 这个类的实现就是:什么时间,哪个线程,哪个文件的哪一行,发生了什么等级的日志,日志机器名字是什么,日…

20240628 每日AI必读资讯

📚 Hugging Face 推出新版开源大模型排行榜,中国模型 Qwen-72B 夺冠 - 阿里Qwen-2-72B指令微调版本问鼎全球开源大模型排行榜榜首 - Llama-3-70B 微调版本排名第二,而 Mixtral-8x22B 微调版本位居第四。 - 另外,微软的 Phi-3-M…

三种分布式锁实现方式

目录 1、数据库自增 2、Redis自增 3、Zookeeper 4、其他 4.1、雪花算法 4.2、Tinyid 4.3、Leaf 4.4、数据库号段 1、数据库自增 利用数据库表的自增特性,或主键唯一性,实现分布式ID REPLACE INTO id_table (stub) values (’a‘) ; SELECT LA…

社交App广告优化新篇章:Xinstall引领用户体验升级,助力买量效果提升

随着移动互联网的快速发展,社交App已经成为人们生活中不可或缺的一部分。然而,在竞争激烈的市场环境下,如何有效地进行广告投放,吸引并留住用户,成为了每个社交App运营者面临的重大挑战。今天,我们就来谈谈…

自费5K,测评安德迈、小米、希喂三款宠物空气净化器谁才是高性价比之王

最近,家里的猫咪掉毛严重,简直成了一个活生生的蒲公英,家中、空气中各处都弥漫着猫浮毛甚至所有衣物都覆盖着一层厚厚的猫毛。令人难以置信的是,有时我甚至在抠出的眼屎中都能发现夹杂着几根猫毛。真的超级困扰了。但其实最空气中…

Packer-Fuzzer一款好用的前端高效安全扫描工具

★★免责声明★★ 文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与学习之用,读者将信息做其他用途,由Ta承担全部法律及连带责任,文章作者不承担任何法律及连带责任。 1、Packer Fuzzer介绍 Packer Fuzzer是一款针对Webpack…