Windows内核内存保护

3
在Windows中,每个进程的高内存(0x80000000或0xc0000000)都被保留用于内核代码,用户代码无法访问这些内存区域,如果尝试访问,则会引发访问冲突异常。
我想知道内核空间是如何受到保护的?
是通过内存分段还是通过分页?
我希望听到一个技术上的解释。
非常感谢, 迈克尔。
2个回答

3
假设您说的是x86和x64架构。
内存保护通过分页系统实现。在x86/x64 CPU上,每个页表项都有一个位用于指示它是用户页还是监管页。只有CPL<3的代码运行时才允许访问监管页,而对非监管页的访问则不受CPL限制。
CPL是“当前特权级”,有时也称为“环”。Windows仅使用两个环,但CPU实现了4个环。Ring 0是CPU模式,Windows称之为“内核模式”运行的模式。Ring 3是CPU模式,Windows称之为“用户模式”运行的模式。由于以CPL=3运行的代码无法访问监管页,因此实现了内存保护。
ARM的答案可能类似,但也有所不同。

2

这很简单,不需要讨论环和内核行为。访问特定地址的虚拟内存需要该地址被映射,操作系统必须为该地址分配一个内存页。负责此操作的低级 WinAPI 函数是 VirtualAlloc()。它有一个可选地址参数作为第一个参数。如果请求无法映射到地址,操作系统将直接拒绝。否则,与防止您映射地址空间最低 64KB 中的任何地址完全相同。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接