linux - 两个不同进程的两个相同的线性地址?

标签 linux linux-kernel

大家好,

我是 Linux-Kernel 的新手,我目前正在引用 Understanding Linux Kernel 这本书。我读到了关于内存管理的内容,其中关于分页和分段的一切都很好,但我的问题还没有得到解答。 如果两个不同的进程具有相同的线性地址,那么它们在物理地址中的位置是否不同。因为每个 CPU 只有一个全局页面目录,通过观察 32 位线性地址再次映射到物理地址。但是两个进程如何可以内存高达4GB。请解释。

最佳答案

是的,两个不同的进程都可以使用同一个线性指针,但它可以解引用到物理内存中的两个不同位置。那是因为每个进程都有自己的页表,当从一个进程切换到另一个进程时,CPU的页表寄存器也切换为指向新进程的页表。

您是否克隆了自己的 Linux 源代码本地副本?如果没有,请立即去做。您需要在阅读本书时引用它。

现在克隆了吗?好的。转到克隆的工作目录并打开 arch/x86/include/asm/mm_context.h。向下到第 51 行,您会找到 static inline void switch_mm。这是将 CPU 从一个进程的虚拟内存空间切换到另一个进程的功能。 (我假设您对 x86 最感兴趣。)现在向下看第 64 行:load_cr3(next->pgd)。这就是奇迹发生的地方:页表被切换,现在 CPU 将使用新进程的页表解释所有指针。

关于linux - 两个不同进程的两个相同的线性地址?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29731062/

相关文章:

linux - 在 Windows Server 2012 R2 WMF 4.0 上安装 DSC 资源 nxComputerManagement 和 nxNetworking

linux - 如何在 Linux 内核模块中获取一组可用的 CPU?

linux - 内核编译找不到 .config 文件

c++ - 如何使用 C/C++ 检查文件系统是否已安装

c++ - 如何在 linux 中的多个应用程序中共享库中的变量?

c++ - Linux 管道 : Capturing realtime output of ping via popen

linux - 使用安装在 Linux 机器上的 Jenkins 在 IE 驱动程序上运行测试

linux - 选择linux上两个版本的gcc作为非管理员

c - 如何创建带有变量名的/sys属性

linux - Linux 如何以编程方式从指定文件重新启动以支持电源中断容忍升级?