分页系统和分段系统中共享库加载的区别

    在纯分页系统中,由于没有段的概念,那么当共享库文件加载到每个进程时,只能直接使用虚拟地址进行加载和访问,那么每个进程中,需要地址空间中一块连续的地址用来映射该共享库,因此,对于进程A来说,可能是0X30F00~0X30F30这段地址映射了物理内存中共享库的相关物理页面,而进程B中,可能是0X41F20~0x41F50这段虚拟值映射了物理内存中共享库的物理内存页面。换而言之,就每个进程的页表中,共享库的起始地址都是不一样的。

    而有了分段的机制后,虚拟地址按照段来进行划分,虚拟地址就以(段号+段内地址)组成,那么我们可以在编译时给这个共享库单独设置一个共享段,那么不管几个程序,只要用到了这个共享库,那么我们在编译的时候都将这个共享库的代码编译到同一个共享段中,那么只要这些程序中的某一个程序运行并且调用到了共享库中的代码后,共享库的代码所在的段就被映射了起始物理内存地址(以纯分段式系统为环境,每一段只要任意段内地址被引用到,那么整个段都需要在内存中),当第二,第三个使用了这个共享库的进程运行后,当调用到共享库中的代码时,获取到的段号都是一样的(同一个段,都是共享段),那么在内核中找到这个段的起始物理地址进行访问,而不需要像分页系统中,每个不同的程序的进程访问共享库的代码时对应的虚拟地址还不一样。

    上面讨论的分段的机制是纯分段式系统,而不是段页式系统。

猜你喜欢

转载自blog.csdn.net/challeng_everything/article/details/79628702
今日推荐