2024年1月4日发(作者:)
win7 32位其实早就支持128G内存,只是微软故意限制罢了
操作系统, 内存, Windows, 逻辑推理, 源代码
如何证明这个事情呢,最终证据这种东西,除非把Windows源代码放到你面前,否则一切证据都是浮云。
不过呢,我还是可以给你证明32位操作系统能完全利用4G以上内存,至于你看不看得懂和相不相信,就不是现在我从三个方面给你证明。分别是逻辑推理、内部原理、自己动手。
首先,从逻辑推理的角度看。
Executive层实现。换句话说,操作系统能识别和利用多少内存是内核决定的。
首先我们知道,Windows内核的实体是(当然还可能是,,ntk首先承认一个事实。32位Windows Client版本,例如xp/vista/7,在正常情况下最大只能识别4G内存。而以识别高达128G的内存。你可能说内核不一样,那么以Windows Server 2008为例,其内核和Windows识库或自己试验)。为何一个不支持4G另一个又支持呢?这显然不是32位操作系统本身的技术限制,肯定是定是支持4G以上内存的。
那么,到底是什么因素限制了32位Client版本Windows的可用内存大小呢?下面从内部原理的角度分析。很多人说32位操作系统不支持4G以上内存的理由是:32位处理器寻址能力有限,只能寻2的32次方那么是物理地址吗?错!这里的“址”,指的是虚拟地址。在Windows NT内核中,进程之间是相互隔离的,各个进虚拟地址。注意是每个进程的地址空间容量只有4G,而不是总的物理内存大小只有4G,请区分清楚!用户态统的调度,经过翻译后访问真实的物理地址。这是操作系统内存管理的精髓。
事实上,早在英特尔奔腾2的时代,处理器就从硬件层面支持了物理地址扩展(PAE)。页式地址转换技术又原址。Windows NT内核中,早就原生支持了PAE。Windows安装程序会自动选择内核的PAE版本ntkrnlpa.上内存的操作系统。
那么,Windows NT 6.x是怎样限制可用内存最大容量的呢?
事实上,Windows的许可信息保存在了注册表HKEY_LOCAL_MACHINESystemControlSet001Control被调用,用以读取ProductPolicy中的Kernel-WindowsMaxMemAllowedx86,这个值限定了特定版本的W部分反汇编结果:
7C xx jl default
8B 45 FC mov eax,dwordptr [ebp-4]
85 C0 test eax,eax
74 yy je default
eax寄存器储存了ZwQueryLicenseValue的结果,根据查询到的版本许可,超过限制的内存部分将直接被n你可能会想修改注册表键值ProductPolicy来突破限制,不过很遗憾,微软早就防着你这一手呢,ExGetLicen是否被篡改。不过如果Patch内核,直接修改,是可以绕过检查,完全利用到4G以上内存的。最后,我们自己动手亲自看看。
这里需要用到微软出品的调试器windbg。
比如我的机器安装4G内存,Windows显示可用内存2.98G。我们用windbg来看看怎么回事。
lkd>ddMmHighestPhysicalPage
8088b124 000bf7ff 000bf399 00000040 00000000
lkd>ddMmNumberOfPhysicalPages
8088b128 000bf399 00000040 00000000 7fff0000
可见最高物理内存页号MmHighestPhysicalPage值为bf7ff,物理内存总页数MmNumberOfPhysicalPag系统属性页显示的2.98G,改变这个值,系统属性页的值也会跟着变,是不是把这个值改了你就能用到更多的那是不是我的PAE没有真正启用呢?
lkd> !pte 80800000
VA 80800000
PDE at C0602020 PTE at C0404000
contains 09E3 contains 0000
pfn 800 -GLDA--KWEV LARGE PAGE pfn 800
的。
继续windbg:
lkd>dd poi(MmPhysicalMemoryBlock)
8ad75c80 00000007 000bf3ab 00000001 0000009d
8ad75c90 00000100 000bf17c 000bf282 000000dd
8ad75ca0 000bf40f 00000060 000bf70f 00000008
8ad75cb0 000bf71f 0000004c 000bf7ff 00000001
从上面可以看出,我的机器有7块可用的内存,总共有bf3ab页
此时我们patch kernel,再用windbg看
lkd>dd poi(MmPhysicalMemoryBlock)
8baa3c70 00000008 000f73ab 00000001 0000009d
8baa3c80 00000100 000bf17c 000bf282 000000dd
8baa3c90 000bf40f 00000060 000bf70f 00000008
8baa3ca0 000bf71f 0000004c 000bf7ff 00000001
8baa3cb0 00100000 00038000 0001000a 6c4d6d4d
要写的就是这么多了。真理永远是真理,无论它是否为人所知。
在传统的32位的保护模式中,x86处理器使用一种两级的转换方案。在这种方案中,控制寄存器CR3指向一个长4KiB的页目录(page directory);页目录又分为每个1024个每个4KiB的页表(page table);最后页表又分为1024个每个长4KiB的页。
启用PAE(通过设置控制寄存器CR4的第5位来启用)会改变上面的方案。默认情况下,每页的大小是4KiB的。页表和页目录中的表项都从32位扩为64位(8字节)以使用附PDE和PTE里面的物理地址09E3和0000都是64位的,而在没有启用P看到了吗,我的机器现在有8块可用的内存了,多了一个100000-138000,总共有f73ab页了,0xf73ab*
加的地址位。但是,页表和页目录的总大小不变。所以,页表和页目录现在都只有512个表项。因为这变成了原来方案的一半,所以另外的一个级加了进来:CR3现在指向的是页目录指针表,即一个包含4个页目录指针的表。
页目录里的表项的第7位叫做PS(Page Size)。如果这个位设为1,则页目录的表项不再指向页表,而是指向一个2MiB的页。页目录里还有另外一个叫NX位的标志位。它是第63位,表示No eXecute。因为页表项最高的12位,要么是这种标识位,要么是和操作系统相关的数据,所以最多可有52位在将来用于在252 字节,即4pebibyte的物理内存中寻址。
现在,x86架构只使用该52位中的36位(即最大支持内存2^36=64G)。对于在长模式(long mode)中的x86-64处理器,PAE是必须的;其中使用了52位中的40位。
CPU对PAE模式的支持可以通过CPUID标志PAE来识别。
Windows XP SP2和其他新的版本,默认在有no-execute (NX)和execute-disable (XD)特性的处理器上以PAE模式运行以允许NX。NX(或XD)在页表项的第63位。如果没有PAE,页表项只就32位;所以要利用NX这个特性的话,就必须运行在PAE模式下。但是,为了与驱动程序兼容,桌面版的Windows(Windows XP, Windows Vista)都把物理地址空间限制为4GiB


发布评论