windows内核 你的内存是怎样被浪费的——Windows内存大小限制的原理及破解方法
发布时间:2022-10-14 14:56:48 所属栏目:Windows 来源:
导读: 随着操作系统的发展,所需的内存容量也在不断扩大。现在的内存容量动不动就是4GB,8GB甚至16GB。然而大家对下图的情况一定不会感到陌生。
明明自己装了4GB内存,Windows却说——只有3.24GB可用
明明自己装了4GB内存,Windows却说——只有3.24GB可用
随着操作系统的发展,所需的内存容量也在不断扩大。现在的内存容量动不动就是4GB,8GB甚至16GB。然而大家对下图的情况一定不会感到陌生。 明明自己装了4GB内存,Windows却说——只有3.24GB可用。于是有的人就认为增加内存就可以解决这一问题,然而增加内存后的结果却是这样的: 即使把内存增加到了16GB,仍然只有3.24GB可用。也就是说增加的内存非但没有用,反倒是被白白浪费了。 关于这一情况,微软的解释是这样的: Windows操作系统对内存的最大寻址空间为2^{32} B=4GB。由于操作系统会为部分硬件设备保留一部分内存,所以可用内存空间不足4GB。 资源监视器中显示的内存分配是这样的: 从图中可以看出,有778MB的内存是“为硬件保留的内存”。那么这些内存都是为硬件保留的吗?答案是否定的。这些内存中只有很小的部分是真正为硬件保留的,而其它大部分不可用的原因是——被Windows内核扣掉了。 到这里也许有的人会说:微软说过这是CPU寻址能力造成的硬限制。在这里,本人将用下列事例反驳微软的这种解释。 如果微软的这种说法正确,那么微软如何解释MS-DOS能支持640KB的内存? 按照微软的这种解释,16位的MS-DOS的最大寻址空间只有 2^{16} B,从而最多只能支持 2^{16} B=64KB的内存。但是我们都知道,MS-DOS可以使用的最大内存容量为640KB。如果微软的这种说法正确,那么如何解释这部分所谓的“为硬件保留的内存”可以通过RAMDisk间接使用而不影响系统稳定?如果微软的这种说法正确,那么如何解释Windows Server可以使用最多32GB甚至64GB的内存?另外,微软又怎么解释Linux的内核只要在启动时加一个参数,也能用大于4GB的内存? 所以说,寻址能力造成的内存限制是可以通过技术手段突破的。其原因是:程序使用的是虚拟地址,而虚拟地址需要映射到内存的物理地址上。这里所谓的“寻址空间”只是虚拟地址空间,不是内存上的物理地址空间。 虽然MS-DOS是一个16位操作系统,但是它的物理地址空间是20位,其最大寻址空间为 2^{20} B=1MB,其中640KB为用户可用内存。当时微软因为解决了16位的MS-DOS使用超过64KB的内存这一问题,在1981年曾表示在当时“640KB内存对任何用户都足够了”。 在现在的操作系统上,类似的技术被称作PAE(物理地址扩展)。早在很多年前,Pentium Pro的物理地址空间就是36位,从而最大内存容量变为64GB。作为Wintel联盟之一的微软没有理由不支持这一技术。这一点可以从Windows XP上得到验证:在Windows XP RTM与SP1版本中,只要在boot.ini中加上/pae这个参数windows内核,就完全可以使用超过4GB的内存。但是,由于当时一些第三方驱动并不兼容PAE(导致系统蓝屏),而硬件厂商也根本没考虑到大内存的发展趋势从而不愿意更新驱动,于是硬件厂商就把这个问题踢给微软。在这种情况下,微软做的不是老实承认这些驱动有问题,对这些驱动拒绝签名,将其驳回硬件厂商并要求重写;而是采取了一种最笨的方法:在之后版本的Windows内核中把物理地址空间限制为4GB,又强行关闭MMIO重映射,导致只有3GB多内存可用(因为设备需要占用一部分4GB以内的物理地址空间用于MMIO,当实际的物理内存大于或等于4GB时,就需要通过主板将设备MMIO保留的物理地址空间映射到4GB以上,这样原本被保留的内存就会被释放出来。微软官方的说法是服务器版Windows支持重映射功能,桌面版Windows不支持。但是实际上桌面版Windows不是不支持重映射,而是被微软强行禁止的)。这种做法在当时内存并没有普遍超过4GB的情况下尚且可以理解(因为多数用户会认为蓝屏是微软的问题,不是驱动的问题。即便如此,微软这样掩盖问题而不是真正解决问题也是一种只顾眼前、不顾长远的短视行为)。 然而,随着技术的发展,大内存越来越普及。Windows的安装要求也明确说明CPU必须支持PAE、NX;从而所有的驱动也必须支持在PAE模式下工作。在这种情况下,微软仍然在内核中人为限制内存大小,并以所谓“寻址空间”的理由欺骗用户。微软的这种做法就是一种纯粹的商业伎俩,其目的只有一个:通过控制PAE来限制内存大小,从而迫使大内存用户购买价格高昂且根本不适合普通用户的Windows Server这种服务器操作系统。(例如,如果没有经过设置,Windows Server就没有声音,也很难关机) 那么,Windows是怎样确定用户的可用内存大小的?下面以Windows Vista/7内核为例来说明这一过程。 在Windows启动的时候,Windows内核中的ZwQueryLicenseValue函数将会读取一个叫做Kernel-WindowsMaxMemAllowedx86的值(在Windows的许可证文件中),这个值最终确定了用户可以使用的内存。在桌面版Windows上,这个值是0x1000,单位是MB,也就是代表着4GB。 这部分的机器码与对应的汇编指令如下: 7C xx : jl default 8B 45 FC : mov eax,dword ptr [ebp-4] 85 C0 : test eax,eax 74 yy : je default 这部分代码在执行时,EAX寄存器中保存了ZwQueryLicenseValue的状态值。在通常情况下,系统跳转到default代码段,就会执行限制物理地址空间以及禁用MMIO重映射等操作,从而导致了多余的内存成为所谓的“为硬件保留”。 这里就可以破解内核了:只要在EAX里的值被读取之前将EAX的值改成一个很大的数,并去掉后面的跳转,就可以用大内存了。 修改后的机器码与对应的汇编指令如下(从8B开始修改7个字节的数据): B8 00 00 02 00 : mov eax,00020000h 90 : nop 90 : nop 修改完操作系统内核之后,还需要修改Winload.exe(或Winload.efi)。因为Winload.exe(或Winload.efi)会检查系统内核是否被修改,如果不破解Winload.exe(或Winload.efi),系统会因拒绝加载而导致蓝屏。破解后制作新的启动项,用新的内核与Winload加载破解后的系统(如果破解的是Winload.efi,还需要在固件设置中禁用Secure Boot)。 目前网上已经有这种破解工具帮助用户修改系统文件,按照步骤使用后即可破解内存限制。 破解后再查看系统属性: 没有“3.24GB可用”的字样了。再查看资源监视器 为硬件保留的内存只有18MB了,也就是说有760MB内存是被系统强制保留了。 破解后8GB内存可以完全识别并可用. (编辑:应用网_阳江站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
站长推荐