关于虚拟地址space和位置无关代码(PIC)的混淆
Confusion about virtual address space and position indepedent code (PIC)
在阅读 this blogpost 时,当作者试图证明共享库需要 PIC 时,我遇到了以下内容。
If your shared library is built to only work when loaded at one particular address everything may be fine — until another library comes along that was built also using that address.
如果库的起始地址决定了库进入内存的位置,那么虚拟内存管理在这里做什么?我的意思是内存映射应该能够确定某些东西已经在这个物理地址 space 中,所以我们可以将下一个共享库放在其他地方。
而且库指定的加载地址是虚拟地址space对吧?那么,如果两个库具有相同的虚拟地址 space 加载地址,为什么它甚至会产生问题。
所以我基本上有这个问题:
- 当使用非 PIC 时,两个库在同一地址有东西的问题目前对我来说意义不大。这是否与第一个库与第二个库的地址重叠有关?但是 OS 内存管理应该能够将东西放入 space 中,其中物理内存是空闲的,那么冲突在哪里呢?
问题与物理地址无关。它只依赖一件事:在虚拟地址space中,两个库不能驻留在同一个地址。
虚拟内存将每个分配的虚拟页面映射到一个物理页面(或帧)。
假设对于进程 P1,VA 0x10000 映射到 PA 0xff000。不过,多亏了虚拟内存,一个单独的进程 P2 也可以在同一地址有不同的页面。因此,P2 可以将 VA 0x10000 映射到 PA 0xee000。没有冲突,因为它们是两个 分开的 虚拟地址 spaces.
但是,post中所述的问题适用于单个进程,其地址为space。因此,对于进程 P1,VA 0x10000 不能同时映射到 PA 0xff000 和 0xee000。假设您有两个非 PIC 库(libX 和 libY),并且被编译为仅在 VA 0x10000 处工作。如果 P1 想要加载这两个库,它就会遇到问题,因为它必须将它们都加载到同一个虚拟地址 space,并且它们都想使用同一个 VA。 VA 0x10000 只能映射到其中一个库的物理页面。
对于 PIC 库,这不是问题,因为 P1 可以将 libX 放置在 VA 0x10000 并将 libY 放置在 VA 0x20000。然后虚拟内存映射可以将两个库的 VA 映射到它们各自的 PA。
在阅读 this blogpost 时,当作者试图证明共享库需要 PIC 时,我遇到了以下内容。
If your shared library is built to only work when loaded at one particular address everything may be fine — until another library comes along that was built also using that address.
如果库的起始地址决定了库进入内存的位置,那么虚拟内存管理在这里做什么?我的意思是内存映射应该能够确定某些东西已经在这个物理地址 space 中,所以我们可以将下一个共享库放在其他地方。
而且库指定的加载地址是虚拟地址space对吧?那么,如果两个库具有相同的虚拟地址 space 加载地址,为什么它甚至会产生问题。
所以我基本上有这个问题:
- 当使用非 PIC 时,两个库在同一地址有东西的问题目前对我来说意义不大。这是否与第一个库与第二个库的地址重叠有关?但是 OS 内存管理应该能够将东西放入 space 中,其中物理内存是空闲的,那么冲突在哪里呢?
问题与物理地址无关。它只依赖一件事:在虚拟地址space中,两个库不能驻留在同一个地址。
虚拟内存将每个分配的虚拟页面映射到一个物理页面(或帧)。 假设对于进程 P1,VA 0x10000 映射到 PA 0xff000。不过,多亏了虚拟内存,一个单独的进程 P2 也可以在同一地址有不同的页面。因此,P2 可以将 VA 0x10000 映射到 PA 0xee000。没有冲突,因为它们是两个 分开的 虚拟地址 spaces.
但是,post中所述的问题适用于单个进程,其地址为space。因此,对于进程 P1,VA 0x10000 不能同时映射到 PA 0xff000 和 0xee000。假设您有两个非 PIC 库(libX 和 libY),并且被编译为仅在 VA 0x10000 处工作。如果 P1 想要加载这两个库,它就会遇到问题,因为它必须将它们都加载到同一个虚拟地址 space,并且它们都想使用同一个 VA。 VA 0x10000 只能映射到其中一个库的物理页面。
对于 PIC 库,这不是问题,因为 P1 可以将 libX 放置在 VA 0x10000 并将 libY 放置在 VA 0x20000。然后虚拟内存映射可以将两个库的 VA 映射到它们各自的 PA。