3

在 Windows 中,每个进程的高内存(0x80000000 或 0xc0000000)是为内核代码保留的,用户代码无法访问这些内存区域,如果它尝试这样将引发访问冲突异常。

我想知道内核空间是如何保护的?

是通过内存分段还是通过分页?

我想听听技术解释。

非常感谢,迈克尔。

4

2 回答 2

2

假设您正在谈论 x86 和 x64 架构。

内存保护是使用分页系统实现的。x86/x64 CPU 上的每个页表条目都有一个位来指示它是用户页面还是主管页面。仅允许以 CPL<3 运行的代码访问主管页面,而无论 CPL 为何,都可以访问非主管页面。

CPL 是“当前权限级别”,有时也称为环。Windows 仅使用两个环,尽管 CPU 实现了 4。环 0 是 Windows 所称的“内核模式”运行的 CPU 模式。Ring 3 是运行“用户模式”的 CPU 模式。由于以 CPL=3 运行的代码无法访问主管页面,这就是内存保护的实现方式。

ARM 的答案可能相似,但不同。

于 2013-06-10T11:05:52.710 回答
2

这很简单,不需要谈论环和内核行为。访问特定地址的虚拟内存需要映射该地址,操作系统必须为该地址分配一个内存页面。执行此操作的低级 winapi 函数是 VirtualAlloc()。它接受一个可选的地址,第一个参数。操作系统只会使对不可映射地址的请求失败。否则,完全相同的机制会阻止您在地址空间的最低 64KB 中映射任何地址。

于 2013-06-10T13:09:57.730 回答