两个不同进程的两个相同的线性地址?
Two Identical Linear Addresses of two different Processes?
大家好,
我是 Linux-Kernel 的新手,我目前正在参考这本书 Understanding Linux Kernel.I 阅读有关内存管理的内容,其中关于分页的一切都很好和细分,但我的问题还没有回答。
如果两个不同的进程具有相同的线性地址,那么它们是否可以位于物理地址中的不同位置。因为每个 CPU 只有一个全局页面目录,通过观察 32 位线性 Address.But 再次映射到物理地址] 两个进程如何拥有高达4GB的内存。请解释。
是的,两个不同的进程都可以使用同一个线性指针,但它可以取消对物理内存中两个不同位置的引用。那是因为每个进程都有自己的pagetables,当从一个进程切换到另一个进程时,CPU的pagetable寄存器也切换为指向pagetable 新进程。
您是否克隆了 Linux 源代码的本地副本?如果没有,请立即去做。您需要在阅读本书时参考它。
现在克隆了吗?好的。转到克隆的工作目录并打开 arch/x86/include/asm/mm_context.h
。向下到第 51 行,您会发现 static inline void switch_mm
。这是将 CPU 从一个进程的虚拟内存 space 切换到另一个进程的函数。 (我假设您对 x86 最感兴趣。)现在向下看第 64 行:load_cr3(next->pgd)
。这就是奇迹发生的地方:页面 tables 被切换,现在 CPU 将使用新进程的页面 tables.
解释所有指针。
大家好,
我是 Linux-Kernel 的新手,我目前正在参考这本书 Understanding Linux Kernel.I 阅读有关内存管理的内容,其中关于分页的一切都很好和细分,但我的问题还没有回答。 如果两个不同的进程具有相同的线性地址,那么它们是否可以位于物理地址中的不同位置。因为每个 CPU 只有一个全局页面目录,通过观察 32 位线性 Address.But 再次映射到物理地址] 两个进程如何拥有高达4GB的内存。请解释。
是的,两个不同的进程都可以使用同一个线性指针,但它可以取消对物理内存中两个不同位置的引用。那是因为每个进程都有自己的pagetables,当从一个进程切换到另一个进程时,CPU的pagetable寄存器也切换为指向pagetable 新进程。
您是否克隆了 Linux 源代码的本地副本?如果没有,请立即去做。您需要在阅读本书时参考它。
现在克隆了吗?好的。转到克隆的工作目录并打开 arch/x86/include/asm/mm_context.h
。向下到第 51 行,您会发现 static inline void switch_mm
。这是将 CPU 从一个进程的虚拟内存 space 切换到另一个进程的函数。 (我假设您对 x86 最感兴趣。)现在向下看第 64 行:load_cr3(next->pgd)
。这就是奇迹发生的地方:页面 tables 被切换,现在 CPU 将使用新进程的页面 tables.