系统相关
首页 > 系统相关> > linux – CPU如何知道哪个物理地址映射到哪个虚拟地址?

linux – CPU如何知道哪个物理地址映射到哪个虚拟地址?

作者:互联网

根据我的理解,每个进程通过虚拟地址而不是物理地址访问内存,并且CPU负责通过MMU单元将这些虚拟地址转换为物理地址,并且两个或多个进程可以具有相同的虚拟地址.

因此,假设进程A正在尝试访问虚拟地址12345,并且进程B也尝试访问虚拟地址12345.

MMU如何将每个进程的虚拟地址转换为物理地址,是否为每个进程映射表,将虚拟地址映射到物理地址(因为我认为CPU甚至不知道“进程”是什么,并且唯一的责任是盲目地执行指令而不关心哪个指令属于哪个进程,而“进程”只是一个OS概念)?

解决方法:

Linux中,内核维护一个三级页表(无论CPU的功能如何).顶级是页面全局目录,每个进程都有自己的目录pgd in mm_struct.因此每个进程可以有自己的映射,因此不同进程中的地址12345指向不同的物理地址.

CPU并不真正了解进程,但它们往往具有支持它们的功能.在x86风格的CPU上,有各种与任务相关的功能,但它们实际上往往被忽略.由于进程调度由内核管理,因此它可以自己跟踪页表更改,并在切换任务时更新切换到新进程页表所需的CPU状态.在x86 PC上,这涉及更新指向页面目录的CR3控制寄存器.

Mel Gorman的“理解Linux虚拟内存管理器”一书中的Page Table Management章给出了一个很好的概述.

标签:linux,cpu,linux-kernel,virtual-memory
来源: https://codeday.me/bug/20190810/1638015.html