首页
社区
课程
招聘
[分享]kernel之支持4G探究
发表于: 2010-11-18 21:28 8473

[分享]kernel之支持4G探究

2010-11-18 21:28
8473
随着内存的白菜价,越来越多的机器有了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直播授课

收藏
免费 0
支持
分享
最新回复 (6)
雪    币: 367
活跃值: (20)
能力值: ( LV5,RANK:70 )
在线值:
发帖
回帖
粉丝
2
vista或更高的系统修改没意思啦,楼主来个XP/2003的大作吧
2010-11-18 21:46
0
雪    币: 237
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
小公媛覺得,會不會留下兼容性問題的隱患呢?
2010-11-18 22:19
0
雪    币: 367
活跃值: (42)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
写文章需要提一下出处吧.
http://www.geoffchappell.com/viewer.htm?doc=notes/windows/license/memory.htm
2010-11-19 09:48
0
雪    币: 563
活跃值: (95)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
原来如此
2010-11-20 10:38
0
雪    币: 478
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
啊哈。。。。。。。。。
2010-11-20 12:38
0
雪    币: 189
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
win7 32位的用ReayFor4GB处理一下就行了!
2010-11-21 12:16
0
游客
登录 | 注册 方可回帖
返回
//