【Linux操作系统】进程地址空间与动态库加载

当系统执行一个依赖动态库的可执行程序时,系统不仅要将该可执行程序加载到内存中还要由加载器将动态库加载到内存中(静态库没有),因此必须要让加载器知道该动态库的名称,系统会默认在/lib64路径下查找,解决动态库加载时加载器找不到库文件的问题在这篇文章的末尾有4种解决方案:http://t.csdnimg.cn/UH1AI

动态库被加载到内存中后,会被多个进程共享。也就是说当需要执行多个含同样的动态库的可执行程序时,只需要将该动态库加载一次到内存即可,不需要加载多次。系统会知道该动态库是否已经加载到了内存中。

编译器通过编译链接之后得到可执行程序,此时的可执行程序内部存储的其实已经是各语句和各数据对应以及它们对应的在进程地址空间里的虚拟地址,也就是说当可执行程序加载到内存的那一刻,可执行程序里的代码和数据把自己的虚拟地址全部填入了地址空间里,由于可执行程序一般将数据加载到物理内存中一般采取的是惰性加载机制,即不会一次性全部加载,会慢慢的将自己的代码和数据加载到内存中。当CPU指令执行到可执行程序里的动态库的虚拟地址指令时(即动态库里的函数数据的虚拟地址),CPU执行发生如下跳转:

同一动态库在不同进程中虚拟地址的虽然不同,但是可以通过页表映射得到该动态库的物理地址,进而实现多个进程共享一个动态库。

补充:一个磁盘里的文件被写入或被读取数据,首先该文件将其数据先加载到内核中相应的文件页缓冲区里(物理地址里)。

当一个可执行程序要被CPU执行时,先由操作系统为其创建内核struct file结构体、创建进程地址空间、页表等,CPU再寻址(虚拟地址),再通过缺页中断建立虚拟地址与物理地址(可执行程序将代码和数据加载到对应的页缓冲区里对应的物理内存地址)的映射关系。

  • 13
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值