OS 内核在访问内存时如何得到通知?

How does OS kernel get notified when memory is accessed?

据我所知,OS内核维护着从虚拟地址到物理地址的转换,用户空间程序使用虚拟地址,CPU使用物理地址。

既然所有机器代码都是由CPU执行的,那么OS内核如何知道内存访问指令被执行,并将虚拟地址转换为物理地址? CPU 可以执行 syscall 将控制权转移给内核,但是内存 read/write 不是通过 syscall 完成的。我很困惑。

例如,考虑以下代码(地址 3 只是为了简化,不用担心 read/write/execute 权限):

int a = *(int *)3;

编译为

movl    , %ecx
movl    (%rcx), %edx
movl    %edx, -8(%rbp)

程序被OS内核加载后,将IP寄存器设置为入口点,并做一些其他准备工作,然后让CPU执行指令。当CPU执行movl (%rcx), %edx时,OS内核如何知道是时候介入,阻止CPU访问物理地址0x3

CPU 中有一个组件称为内存管理单元。这负责在执行内存访问指令时将虚拟地址转换为物理地址。

如果虚拟地址当前没有映射到RAM中,就会触发中断。这会暂停进程并告诉 OS 它需要将适当的内存带入 RAM。它试图访问的地址存储在一个寄存器中,因此 OS 知道要调入的内容。

您的假设是错误的,因为 CPU 转换虚拟地址。

分页和虚拟寻址由 CPU 实现,OS 使用此实现。 OS 不保留虚拟地址的数据库,它保留页表的数据库,以便在上下文切换期间需要时可以修改它们。此外,OS 需要跟踪哪个页面用于什么。

MMU 是 CPU 负责虚拟地址到物理地址转换的单元,它通过在缓存中查找页表来实现。 CPU 或 MMU 也有一个称为 TLB 的缓存,它保存虚拟地址转换以加快转换速度。否则,CPU 将需要执行多次 RAM 读取以收集所需的信息来为每次内存访问进行转换。由于 RAM 比 CPU 慢,这会使计算机慢得多。