首页 文章

操作系统如何限制用户进程访问内核内存

提问于
浏览
1

在32位Linux(或Windows,无论如何)中,用户进程无法访问内核地址空间 . 比如说0xC0100000(以3:1分割,如linux)或0x80E00000(1:1分割,如windows) .

我知道用户应用程序的以下代码会引发分段错误 .

int* a = 0xC0100000;
int b = *a;

但是,我并不是100%确定实际原因 . 我假设如果我们尝试执行上面的代码,MMU将引发段错误,因为虚拟地址0xC0100000的相应页表项具有超级用户位标志 . 这是100%正确吗?如果这是正确的,操作系统如何阻止进程通过TLB缓存访问内核虚拟地址?

我也认为使用分段,可以实现相同的限制 . 即,如果GDT的DS,CS,SS ......条目的地址限制为0xC0000000 . 无论页面表设置如何,访问0xC0100000都将从分段过程中失败 . 如果我错了,请帮我 .

一些建议会很好 . 先感谢您 .

1 回答

  • 1

    重要的只是应用程序在user space(或用户模式)中看到的address space . 内核地址空间对应用程序不可见(仅对内核可见,例如在执行system calls时) .

    当执行从用户模式切换到内核模式(例如通过系统调用或中断)时,MMU会改变状态,以访问内核页面 . 详细信息是特定于处理器的(在x86和ARM上不同),根据定义,应用程序代码不可见 . 请参阅page fault上的wikipage .

相关问题