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

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

原理概述

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

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

进程地址空间示意图

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

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

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

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

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

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

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

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

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

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

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

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

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

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

相关文章
|
2月前
|
存储 运维 关系型数据库
2024年最全ceph的功能组件和架构概述(2),Linux运维工程面试问题
2024年最全ceph的功能组件和架构概述(2),Linux运维工程面试问题
2024年最全ceph的功能组件和架构概述(2),Linux运维工程面试问题
|
2月前
|
Shell Linux 程序员
【Linux】Shell 命令以及运行原理
【Linux】Shell 命令以及运行原理
|
19天前
|
算法 Linux 调度
Linux进程——进程的创建(fork的原理)
Linux进程——进程的创建(fork的原理)
13 2
|
25天前
|
存储 缓存 Linux
深入理解Linux中的`db_load`命令:数据库加载的利器
`db_load`是Linux下处理Berkeley DB的关键命令,用于将文本数据加载到数据库中。它支持多种文本格式,如键值对和CSV,并具有灵活的选项,如指定数据库类型、缓存大小、日志记录和错误处理。通过`-f`加载文本文件,`-s`设定数据库类型,`-l`设置缓存。本文详细介绍了`db_load`的使用方法和高级特性,并给出案例,如将CSV用户信息加载到Btree数据库。了解并善用`db_load`能提升数据处理效率和安全性。
|
5天前
|
安全 NoSQL Linux
深入探索Linux命令pldd:用途、原理与最佳实践
`pldd`是Linux下用于显示进程加载的动态链接库的工具,非标准内核组件,但对调试和分析至关重要。通过读取`/proc`目录下的信息,它列出进程依赖的`.so`文件,提供实时视图。常用选项包括`-v`(详细信息)、`-p`(按PID查看)和`-n`(按进程名查看)。使用时注意权限、进程状态及系统兼容性。结合其他工具使用,可增强系统诊断能力。
|
5天前
|
Web App开发 Linux 数据处理
深入理解Linux命令pkill:功能、原理与最佳实践
**pkill命令详解:在Linux中,pkill用于按进程名终止进程,简化了通过PID管理进程的步骤。它利用正则匹配支持模糊查找,可发送不同信号如SIGTERM或SIGKILL。常用示例包括:终止指定进程名、按用户或终端终止进程,以及使用-f进行模糊匹配。注意谨慎使用,避免误杀重要进程,先发送SIGTERM,无效再用SIGKILL。了解其权限需求和配合ps命令使用,能提升系统管理效率。**
|
20天前
|
Linux Shell 程序员
【Linux操作系统】命令的运行原理
【Linux操作系统】命令的运行原理
|
2月前
|
存储 Linux 编译器
【Linux】详解动态库链接和加载&&对可执行程序底层的理解
【Linux】详解动态库链接和加载&&对可执行程序底层的理解
|
2月前
|
存储 Linux 程序员
【Linux-14】进程地址空间&虚拟空间&页表——原理&知识点详解
【Linux-14】进程地址空间&虚拟空间&页表——原理&知识点详解
|
2月前
|
Linux Shell 程序员
【Linux】权限(shell运行原理、概念,Linux权限)
【Linux】权限(shell运行原理、概念,Linux权限)
25 2