【发布时间】:2021-06-04 16:06:53
【问题描述】:
据我所知,OS内核维护着从虚拟地址到物理地址的转换,用户空间程序使用虚拟地址,CPU使用物理地址。
既然所有的机器代码都是由 CPU 执行的,那么 OS 内核如何知道一条内存访问指令被取走,并将虚拟地址转换为物理地址呢? CPU 可以执行syscall 将控制权转移给内核,但内存读/写不是通过syscall 完成的。我很困惑。
例如,考虑下面的代码(地址3只是为了简化,不用担心读/写/执行权限):
int a = *(int *)3;
这是编译成
movl $3, %ecx
movl (%rcx), %edx
movl %edx, -8(%rbp)
OS内核加载程序后,将IP寄存器设置为入口点,并做一些其他准备,然后让CPU执行指令。当 CPU 执行movl (%rcx), %edx 时,OS 内核如何知道是它应该干预的时间,阻止 CPU 访问物理地址0x3?
【问题讨论】:
标签: linux memory operating-system kernel