加入收藏 | 设为首页 | 会员中心 | 我要投稿 应用网_阳江站长网 (https://www.0662zz.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 服务器 > 搭建环境 > Windows > 正文

windows内核 你的内存是怎样被浪费的——Windows内存大小限制的原理及破解方法

发布时间:2022-10-14 14:56:48 所属栏目:Windows 来源:
导读:  随着操作系统的发展,所需的内存容量也在不断扩大。现在的内存容量动不动就是4GB,8GB甚至16GB。然而大家对下图的情况一定不会感到陌生。

  明明自己装了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内存可以完全识别并可用.
 

(编辑:应用网_阳江站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!