随着内存的白菜价,越来越多的机器有了4G甚至4g以上的内存,但是此时如果想要windows全部识别出来,微软告诉我们请使用x64位操作系统,但是却基于各种原因不想换系统,如何解决呢?关于32位系统最高上限的问题估计有很多的人遇到过
最近一直写iphone的程序,基于论坛童鞋的问题整理了下文
首先我们看一下微软对于这个问题的解释:
如果计算机上安装了 4 GB 随机存取内存 (RAM),则 Windows Vista 中的“系统信息”对话框中报告的系统内存将小于预期值。例如,如果某台计算机上安装了 4 GB (4,096 MB) 内存,但“系统信息”对话框可能报告系统内存为 3,120 MB。 这一行为是某些硬件和软件因素导致的预期结果。 典型计算机中的各种设备均需要内存映射访问。这称为内存映射 I/O (MMIO)。若要使 MMIO 空间可用于 32 位操作系统,MMIO 空间必须驻留在前 4 GB 地址空间内。 例如,如果您具有一个板载内存为 256 MB 的视频卡,此内存必须被映射到前 4 GB 地址空间内。如果已安装了 4 GB 系统内存,则图形内存映射必须保留部分此地址空间。此图形内存映射会覆盖一部分系统内存。这些情况降低了操作系统可用的系统内存总量。 可用系统内存的减少情况取决于计算机中安装的设备。不过,为避免潜在的驱动程序兼容性问题,Windows Vista 32 位版本将可用总内存限制为 3.12 GB。有关潜在驱动程序兼容性问题的信息,请参见“更多信息”一节。 如果计算机中安装了多台设备,则可用内存可能会减小到 3 GB 或更少。但是,在 Windows Vista 32 位版本中,最大可用内存通常为 3.12 GB。
而微软对于“不开启4g内存”似乎有一定的含糊其辞
PAE 模式引发的驱动程序兼容性问题 与数据执行保护 (DEP) 有关的驱动程序兼容性问题通常为物理地址扩展 (PAE) 模式引发的兼容性问题。 就是因为会出现兼容问题,所以微软将内存进行了一定的处理? 处理就是限制内存上限值。
接下来我们分析一下微软的内核是如何对于内存上限进行限制的,由于xp内核的缺陷所以现在拿vista sp2的内核进行试验操作。
首先说明一下系统内核的几个文件的区别
• NTOSKRNL.EXE, single-processor, without PAE; • NTKRNLMP.EXE, multi-processor, without PAE; • NTKRNLPA.EXE, single-processor, with PAE; • NTKRPAMP.EXE, multi-processor, with PAE.
内存上限的控制是由一个授权函数Kernel-WindowsMaxMemAllowedx86,通过undocumented函数 ZwQueryLicenseValue 实现。以MB为单位,0x1000对于32版本的系统的意思就是4G。
所以我们需要做的就是将之修改。
源文件代码
7C xx jl default
8B 45 FC mov eax,dword ptr [ebp-4]
85 C0 test eax,eax
74 yy je default
修改
B8 00 00 02 00 mov eax,00020000h
90 nop
90 nop
其中的eax是保留ZwQueryLicenseValue的返回值,所以我们将之强制赋值,此时系统能够识别的内存可以到128G。是不是很爽呢。
修改后文件名为ntkr128g.exe
同时我们需要打开系统的PAE
在后边启动中设置
由于ntkrlpa.exe 引导文件WINLOAD.EXE ,因此为了让WINLOAD.EXE正确的加载我们修改过的内核文件,所以我们需要进行一下签名,除非我们再patch 一下WINLOAD.EXE :)
所以,我们要进行一下签名
makecert -r -ss my -n "CN=My Own Testing Authority"
我们可以做一个试验用本地数字签名
进行签名
signtool sign -s my -n "My Own Testing Authority" ntkr128g.exe
这样文件修改部分完毕,然后我们进行系统重启的最后一步
设置引导需要的内核
bcdedit /copy {current} /d "Windows Vista Using All My Memory"
可以通过 bcdedit /enum 查看当前所有的引导项
非current的一个值 : 填写本地的值,可能不同机器不一样。
bcdedit /set {非current的一个值 } pae ForceEnable
bcdedit /set {非current的一个值} kernel ntkr128g.exe
bcdedit /set {非current的一个值} testsigning on
以上是开启pae,同时下次加载的是我们的内核文件ntkr128g.exe 同时因为我们的数字签名为试验用,所以开启试验模式。
重新启动,选择我们的Windows Vista Using All My Memory 模式。
英文版
http://www.geoffchappell.com/viewer.htm?doc=notes/windows/license/memory.htm
[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课