在Microsoft Docs上,我读到:
在64位Windows中,虚拟地址空间的理论量为2 ^ 64字节(16艾字节),但实际上仅使用了16艾字节范围的一小部分。从0x000'00000000到0x7FF'FFFFFFFF的8 TB范围用于用户空间,从0xFFFF0800'00000000到0xFFFFFFFF'FFFFFFFF的248 TB范围的部分用于系统空间。
由于我有64位指针,所以我可以构造一个指向0xFFFFxxxxxxxxxxxx地址的指针。
网站继续:
在用户模式下运行的代码可以访问用户空间,但不能访问系统空间。
如果我能够猜测系统虚拟地址空间中的有效地址,那么有什么机制阻止我在其中进行写操作?
我对memory protection有所了解,但这似乎并没有提供区分用户内存和系统内存的功能。
答案 0 :(得分:0)
根据@RbMm的注释,此信息存储在PTE(页表项)中。似乎有一点定义了是否从用户模式授予访问权限。
an article on OSR online证实了这一点,该消息说
位名称:用户访问权限
该结构本身似乎不是Microsoft符号的一部分
first
CPU(特别是MMU,内存管理单元)紧密支持PTE。这就是为什么我们找到其他信息at OSDev,它表示
U,“用户/主管”位,根据特权级别控制对页面的访问。如果该位置1,则所有人都可以访问该页面。如果未设置该位,则只有主管可以访问它。
在某些leaked SDK files中,该位似乎是
0:000> dt ntdll!_page* ntdll!_PAGED_LOOKASIDE_LIST ntdll!_PAGEFAULT_HISTORY 0:000> dt ntdll!page* 0:000> dt ntdll!*pte* 00007fff324fe910 ntdll!RtlpTestHookInitialize
由于CPU支持PTE,因此我们应该在Linux中找到类似的东西。瞧,我看到this SO answer也有一点:
unsigned __int64 Owner : 1;
与OSDev的信息完全匹配。