【Linux】对共享库加载问题的深入理解——基本原理概述
原理概述
【linux】详解——库-CSDN博客
共享库被加载后,系统会为该共享库创建一个结构,这个结构体中的字段描述了库的各种属性。在内存中可能会加载很多库,每一个库都用一个结构体描述。把这些结构体用一些数据结构管理起来,系统对库的管理就转化成了对数据的管理
系统对加载到内存的共享库的信息是很清楚的
进程地址空间示意图
【Linux】进程地址空间-CSDN博客

每个进程都会有自己的地址空间,地址空间中的共享区用来映射共享库。
CPU在代码区执行数据时需要用到库中的方法会根据编译时就给定的地址跳转到共享区,共享区的虚拟地址通过页表的映射找到物理内存中相应的数据,然后加载到CPU运算。
如果虚拟地址在页表中没有与对应的物理地址建立映射关系就会发生缺页中断,系统会把磁盘中的对应的数据加载到内存,再让虚拟地址和物理地址建立映射关系,然后这部分数据被CPU调度执行。

多个进程的页表可能会映射同一个库,即共享库可以被多个进程使用。
当一个进程要对库中定义的全局变量做写入时,系统会检查检查该全局变量的引用计数,若库是被多个进程共享的,就会发生写时拷贝。一个进程对共享库的任何操作都不会影响其他进程。
线性地址,虚拟地址,逻辑地址,进程地址空间,其实是一个概念。采用的是全0到全1的编址,用线性地址来描述这样的编址方式是一种很形象的叫法。
虚拟地址和进程地址空间是进程层面的叫法,而逻辑地址是可执行程序中的地址分配方式。
编译器给代码的编址方式是虚拟地址,CPU执行拿到的地址也是虚拟地址。在CPU中,内置了指令集,能让CPU完成一些简单的动作。
比如函数跳转,拿着该函数的地址跳转到相应的地址空间,把相应的地址进行页表映射,拿到物理内存中相应的数据加载到CPU中调度执行。
也就是说从编译器为代码分配地址到CPU调度执行的地址都是虚拟地址,如果想拿到具体的数据只需通过虚拟地址在页表中找到对应的物理地址从而拿到相应的数据。
如果虚拟地址并没有在页表中与物理地址建立映射关系,即相应的数据并没有被加载到内存中,就会发生缺页中断,数据会从磁盘加载到内存,然后对应的虚拟地址与物理地址建立映射关系。
动态库在编译时会带上-fPIC选项,该选项表示与位置无关码。
在编译库代码时,不会按逻辑地址的方式分配。
而是采用偏移量的方式,这样任意位置的代码数据可以映射到共享区中的任意位置,只需要知道库的开始位置被加载到哪里,只需用开始位置的地址加偏移量即可拿到该指令的虚拟地址,然后就是与页表映射的一系列操作了。
相关文章:
【Linux】对共享库加载问题的深入理解——基本原理概述
原理概述 【linux】详解——库-CSDN博客 共享库被加载后,系统会为该共享库创建一个结构,这个结构体中的字段描述了库的各种属性。在内存中可能会加载很多库,每一个库都用一个结构体描述。把这些结构体用一些数据结构管理起来,系…...
easyui的topjui前端框架使用指南
博主今天也是第一次点开easyui的商业搜权页面,之前虽然一直在使用easyui前端框架(easyui是我最喜欢的前端ui框架),但是都是使用的免费版。 然后就发现了easyui的开发公司居然基于easyui开发出了一个新的前端框架,于是我…...
Java中的程序异常处理介绍
一、异常处理机制 Java提供了更加优秀的解决办法:异常处理机制。 异常处理机制能让程序在异常发生时,按照代码的预先设定的异常处理逻辑,针对性地处理异常,让程序尽最大可能恢复正常并继续执行,且保持代码的清晰。 Ja…...
Gradle学习-3 Gradle插件
1、Gredle插件是什么 Gradle插件是用于扩展和增强Gradle构建系统的功能模块通过插件,Gradle可以执行各种构建任务,如编译代码、打包应用、运行测试等 Gradle插件主要分为:二进制插件、脚本插件 二进制插件二进制插件是预编译的、可以复用的…...
百度文心智能体,创建属于自己的智能体应用
百度文心智能体平台为你开启。百度文心智能体平台,创建属于自己的智能体应用。百度文心智能体平台是百度旗下的智能AI平台,集成了先进的自然语言处理技术和人工智能技术,可以用来创建属于自己的智能体应用,访问官网链接࿱…...
【软件测试】白盒测试与接口测试详解
🍅 视频学习:文末有免费的配套视频可观看 🍅 点击文末小卡片,免费获取软件测试全套资料,资料在手,涨薪更快 一、什么是白盒测试 白盒测试是一种测试策略,这种策略允许我们检查程序的内部结构&a…...
【SpringBoot Web框架实战教程】03 SpingBoot 获取 http 请求参数
不积跬步,无以至千里;不积小流,无以成江海。大家好,我是闲鹤,微信:xxh_1459,十多年开发、架构经验,先后在华为、迅雷服役过,也在高校从事教学3年;目前已创业了…...
Mac14.1.2 M1芯片免费读写ntfs硬盘-亲测有效,免费!!!
1. 安装homebrew 打开终端,使用以下命令 /bin/zsh -c "$(curl -fsSL https://gitee.com/cunkai/HomebrewCN/raw/master/Homebrew.sh)" 根据提示逐步完成即可,镜像选择我这里都是保持1的选项。 2. 重启终端 安装完成homebrew后,需…...
手写SpringMVC之ApplicationContextListener
什么是Spring MVC? Spring Web MVC是基于Servlet API构建的原始Web框架,从一开始就包含在Spring Framework中。正式名称“Spring Web MVC”来自其源模块的名称( spring-webmvc ),但它通常被称为“Spring MVC”。 手写…...
Paimon 在汽车之家的业务实践
汽车之家基于Paimon的实践 摘要:本文分享自汽车之家的王刚、范文、李乾⽼师。介绍了汽车之家基于 Paimon 的一些实践,和一些背景。内容主要为以下四部分: 一、背景 二、业务实践 三、paimon 优化实践 四、未来规划 一、背景 在使用Paimon之前…...
2024-06-27 问AI: 介绍一下 LLM building process
文心一言 LLM(Large Language Model,大语言模型)的构建过程是一个复杂且资源密集的任务,涉及多个关键步骤。以下是LLM构建过程的主要阶段,以及每个阶段的一些关键考虑因素: 数据收集与预处理:…...
猫也有自动厕所上了吗?自费分享好用的智能猫砂盆,看完不亏。
还有人在用普通猫砂盘吗?之前我也是用的普通猫砂盘,但我发现只要我在上班时间,我就无法顾忌到小猫的便便,但又不想回家就闻到一股臭味,更何况现在夏天也快到了,便便残留一会就会发酵发臭,导致生…...
《分析模式》漫谈07-怎样把一张图从不严谨改到严谨
DDD领域驱动设计批评文集 做强化自测题获得“软件方法建模师”称号 《软件方法》各章合集 下图是《分析模式》原书第2章的图2.10,里面有一些错误和考虑不周的地方: 2004中译本和2020中译本的翻译如下: 基本上都是照搬,没有改过…...
纯干货丨知乎广告投放流程和避坑攻略
精准有效的广告投放企业获客的关键,知乎作为中国最大的知识分享平台,拥有着高质量的用户群体和高度的用户粘性,为广告主提供了独一无二的品牌传播与产品推广平台。然而,如何在知乎上高效、精准地进行广告投放,避免不必…...
mac 安装mysql启动报错 ERROR!The server quit without update PID file
发现问题: mac安装mysql初次启动报错: 一般出现这种问题,大多是文件夹权限,或者以前安装mysql卸载不干净导致。首先需要先确定问题出在哪?根据提示我们可以打开mysql的启动目录,查看启动日志。 问题解决&a…...
TypeScrip环境安装与基础
TS环境安装与基础 文章目录 一、什么是TypeScript(微软开发的)二、TypeScript的特性三、环境安装node安装配置详解(常用:outDir,strict ) 四、注释方式五、数据类型 一、什么是TypeScript(微软开…...
6.27学习总结
一、高数 1、斯托克斯公式(曲线<->曲面):看清顺时针(负)/逆时针(正) 2、曲面方程变二重积分: 前、上、右:正; 后、下、左:负; 3…...
选择第三方软件测试机构做验收测试的好处简析
企事业单位在自行开发完软件系统或委托软件开发公司生产软件之后,有一个必经流程就是验收测试,以验证该产品是否符合用户需求、是否可以上线。为了客观评估所委托生产的软件质量,第三方软件测试机构往往成为企事业单位做验收测试的首选&#…...
【图书推荐】CPython设计与实现“适合所有Python工程师阅读的书籍”
目录 一、图书推荐 |【CPython设计与实现】 1.1、书籍介绍 1.2、内容简介 1.3、适合哪些人阅读 1.4、作者译者简介 1.5、购买链接 一、图书推荐 |【CPython设计与实现】 "深入Python核心,揭秘CPython的设计智慧!📖 对于每一位热衷…...
原创作品—医疗行业软件界面UI、交互设计
在医疗行业大屏UI设计中,首要的是以用户为中心,深入理解医生、护士、管理层等用户群体的具体需求和工作流程。大屏设计应直观展示关键医疗数据、患者信息、设备状态等,确保用户能够迅速、准确地获取所需信息。同时,功能布局应合理…...
3步深度配置Obsidian Copilot:打造专属AI知识工作流
3步深度配置Obsidian Copilot:打造专属AI知识工作流 【免费下载链接】obsidian-copilot A ChatGPT Copilot in Obsidian 项目地址: https://gitcode.com/gh_mirrors/ob/obsidian-copilot 在信息爆炸时代,知识工作者面临的最大挑战不是获取信息&am…...
Windows任务栏透明化技术解析:TranslucentTB架构设计与优化实践
Windows任务栏透明化技术解析:TranslucentTB架构设计与优化实践 【免费下载链接】TranslucentTB A lightweight utility that makes the Windows taskbar translucent/transparent. 项目地址: https://gitcode.com/gh_mirrors/tr/TranslucentTB TranslucentT…...
魔兽世界游戏插件开发从入门到实战:工具详解与效率提升指南
魔兽世界游戏插件开发从入门到实战:工具详解与效率提升指南 【免费下载链接】wow_api Documents of wow API -- 魔兽世界API资料以及宏工具 项目地址: https://gitcode.com/gh_mirrors/wo/wow_api 作为魔兽世界玩家,你是否曾想过通过自定义插件提…...
Kali实战:CTF杂项题必备工具全解析
1. Kali Linux与CTF杂项题简介 第一次参加CTF比赛时,面对五花八门的杂项题完全无从下手。直到发现Kali Linux这个"瑞士军刀",才真正打开了解题新世界。Kali Linux预装了300安全工具,其中约20%专门用于处理隐写术、文件分析等杂项题…...
团队用ai写代码越来越猛但为什么改个功能像在拆炸弹背后是流程断了
最近不少团队反馈,AI Coding 跑得飞快,两周就能堆出新功能,可一旦要改个按钮颜色,整个系统却像在拆炸弹。这种“改功能崩塌”的怪圈,正让许多管理者头疼:明明用了最先进的工具,交付反而更慢了。…...
借助yakit高效构建渗透字典:从历史流量中智能提取关键参数
1. 为什么需要从历史流量中提取渗透字典? 做过渗透测试的朋友都知道,字典的质量直接影响测试效率。传统方式要么用现成的通用字典,要么手动收集整理,前者命中率低,后者耗时费力。我遇到过最头疼的情况是测试一个Web系统…...
别再乱用.pem和.key了!用ASN.1 Editor手把手拆解RSA私钥的PKCS#8格式(附OpenSSL 3.1验证)
从文件后缀到密钥本质:用ASN.1 Editor透视RSA私钥的PKCS#8结构 当你在终端输入openssl genpkey -algorithm RSA生成密钥对时,是否曾好奇过.pem文件里那些看似随机的字符究竟隐藏着什么秘密?面对invalid key format的错误提示,又是…...
OpenClaw技能开发:为QwQ-32B添加股票数据查询功能
OpenClaw技能开发:为QwQ-32B添加股票数据查询功能 1. 为什么需要开发股票查询技能 去年我在研究量化交易策略时,经常需要手动查询股票数据。每次打开浏览器、登录交易平台、输入代码、导出CSV的重复操作让我疲惫不堪。直到发现OpenClaw可以通过技能扩展…...
browser-use爆火:AI Agent接管浏览器,测试自动化正在被重构
导读 最近在实际项目和工具演进中,可以明显看到一个变化: AI 不再只是写代码,而是开始“直接干活”。 这款 browser-use开源工具非常厉害。它能让AI Agent🚀直接操控浏览器。实现网页任务自动化简单高效 (๑•̀ㅂ•́)و✧。该…...
Vision Transformers在密集预测任务中的创新应用与性能优化
1. Vision Transformers如何革新密集预测任务 第一次接触Vision Transformers(ViT)时,我完全被它的设计哲学震撼到了。传统的CNN在处理图像时,就像用固定大小的网格去观察世界,而ViT则像是一个拥有"全局视野"…...
