作者: univert 时间: 2010-10-7 22:05:54 标题: patch一个字节, WINXP32 支持>=4GB 之前有人分析了Vista/win7 的memory limit http://www./viewer.htm?doc=notes/windows/license/memory.htm 现在来看看winxp啊,其实是一样的啊 ![]() 反编译结果有一个private的函数(symbol里面没有)来进行check的,IDA Pro 里可以空过xref ExVerifySuite来定位这个匿名函数,函数的源代码在这里,不过那个好像是DataCenter的源代码,XP的源代码略有差异,不过大同小异 这个函数在MmInitSystem里面被调用,用来删除系统超过4Gb的那些页面 这里有两个限制值,一个是MaxPages也就是物理页面总数,一个是HighestPhysicalAddress是最高页面地址值 winxp32默认这两个值都是0x100000,也就是4G,但是由于部分物理页面的地址由于bios Memory remap而存在>4G的空间,HighestPhysicalAddress限制了这部分地址空间,所以有4Gb的机子只有大概3-3.25G的实际空间 INIT:005BB492 MiCheckPaeLicense proc near INIT:005BB492 INIT:005BB492 var_C = dword ptr -0Ch INIT:005BB492 HighestPhysicalAddress= dword ptr -8 INIT:005BB492 MaxPages = dword ptr -4 INIT:005BB492 INIT:005BB492 mov edi, edi INIT:005BB494 push ebp INIT:005BB495 mov ebp, esp INIT:005BB497 sub esp, 0Ch INIT:005BB49A push ebx INIT:005BB49B push esi INIT:005BB49C push edi INIT:005BB49D mov ebx, 100000h 默认是4GB INIT:005BB4A2 xor edi, edi INIT:005BB4A4 push 7 ; SuiteType 检查是否DataCenter INIT:005BB4A6 mov esi, eax INIT:005BB4A8 mov [ebp+MaxPages], ebx INIT:005BB4AB mov [ebp+HighestPhysicalAddress], edi HighestPhysicalAddress初始为0即没有限制,DataCenter下该值为零 INIT:005BB4AE call _ExVerifySuite@4 ; ExVerifySuite(x) INIT:005BB4B3 cmp al, 1 改这里就可以啦 cmp al,0 INIT:005BB4B5 jnz short loc_5BB4D2 INIT:005BB4B7 cmp [esi+64h], edi 检查是否打开/3GB INIT:005BB4BA jnz short loc_5BB4C5 INIT:005BB4BC mov [ebp+MaxPages], 1000000h DataCenter是64GB INIT:005BB4C3 jmp short loc_5BB509 INIT:005BB4C5 ; --------------------------------------------------------------------------- INIT:005BB4C5 INIT:005BB4C5 loc_5BB4C5: ; CODE XREF: MiCheckPaeLicense+28j INIT:005BB4C5 mov eax, 400000h INIT:005BB4CA mov [ebp+MaxPages], eax INIT:005BB4CD mov [ebp+HighestPhysicalAddress], eax INIT:005BB4D0 jmp short loc_5BB509 INIT:005BB4D2 ; --------------------------------------------------------------------------- INIT:005BB4D2 INIT:005BB4D2 loc_5BB4D2: ; CODE XREF: MiCheckPaeLicense+23j INIT:005BB4D2 cmp ds:_MmProductType, 690057h INIT:005BB4DC jz short loc_5BB4F2 INIT:005BB4DE push 1 ; SuiteType INIT:005BB4E0 call _ExVerifySuite@4 ; ExVerifySuite(x) INIT:005BB4E5 cmp al, 1 INIT:005BB4E7 jnz short loc_5BB4F2 INIT:005BB4E9 mov [ebp+MaxPages], 800000h INIT:005BB4F0 jmp short loc_5BB509 INIT:005BB4F2 ; --------------------------------------------------------------------------- INIT:005BB4F2 INIT:005BB4F2 loc_5BB4F2: ; CODE XREF: MiCheckPaeLicense+4a INIT:005BB4F2 ; MiCheckPaeLicense+55 INIT:005BB4F2 push 0Ah ; SuiteType INIT:005BB4F4 call _ExVerifySuite@4 ; ExVerifySuite(x) INIT:005BB4F9 cmp al, 1 INIT:005BB4FB jnz short loc_5BB506 INIT:005BB4FD mov [ebp+MaxPages], 80000h INIT:005BB504 jmp short loc_5BB509 INIT:005BB506 ; --------------------------------------------------------------------------- INIT:005BB506 INIT:005BB506 loc_5BB506: ; CODE XREF: MiCheckPaeLicense+69j INIT:005BB506 mov [ebp+HighestPhysicalAddress], ebx XP下0x100000 INIT:005BB509 INIT:005BB509 loc_5BB509: ; CODE XREF: MiCheckPaeLicense+31j INIT:005BB509 ; MiCheckPaeLicense+3Ej ... INIT:005BB509 add esi, 8 INIT:005BB50C mov eax, [esi] INIT:005BB50E xor ebx, ebx INIT:005BB510 cmp eax, esi INIT:005BB512 mov [ebp+var_C], esi INIT:005BB515 jz short loc_5BB583 [attach]3198[/attach] 作者: Mancity 时间: 2010-10-7 22:15:22 “支持>=4GB”的意思是等于4G还是大于等于4G? 作者: univert 时间: 2010-10-7 22:16:33 引用第1楼Mancity于2010-10-07 19:15发表的 : 作者: Mancity 时间: 2010-10-7 22:20:59 2^32=4 294 967 296 =4G 32位CPU的寻址极限能突破? 好像在《Windows驱动开发技术详解》看到过详细的解释,32位系统所能用的物理内存极限应该只能到4G 作者: univert 时间: 2010-10-7 22:23:52 引用第3楼Mancity于2010-10-07 19:20发表的 : 希望你先看看这里http://www./viewer.htm?doc=notes/windows/license/memory.htm了解一下背景,呵呵 作者: Mancity 时间: 2010-10-7 22:28:20 That 32-bit editions of Windows Vista are limited to 4GB is not because of any technical constraint on 32-bit operating systems. The 32-bit editions of Windows Vista all contain code for using physical memory above 4GB. Microsoft just doesn’t license you to use that code. 好奇怪。。 作者: killvxk 时间: 2010-10-7 22:47:55 确实可行~ 作者: univert 时间: 2010-10-7 22:54:15 用Vmware 测试8GB,XPSP2效果 [attach]3199[/attach] 作者: achillis 时间: 2010-10-7 23:00:05 8GB,很威猛~~ 作者: Mancity 时间: 2010-10-7 23:01:07 强大,这个时候CPU还是运行在x86吧 作者: univert 时间: 2010-10-7 23:12:50 引用第9楼Mancity于2010-10-07 20:01发表的 : 作者: Mancity 时间: 2010-10-8 01:31:01 http://baike.baidu.com/view/493711.htm 原来是这个,那书上都没提到PAE…… 作者: Mancity 时间: 2010-10-8 01:36:50 不支持PAE的处理器这个方法应该无效。 作者: killvxk 时间: 2010-10-8 02:26:49 弄真机实验吧 作者: Mancity 时间: 2010-10-8 03:53:49 发现一个问题,单进程还是不能超过2GB,囧。。 作者: Mancity 时间: 2010-10-8 04:04:57 实机上测试还发现有好多驱动不能正常工作在启用了PAE的内核下 作者: jerrynpc 时间: 2010-10-8 11:36:49 windbg无法查到此函数? ![]() 作者: achillis 时间: 2010-10-8 15:21:17 引用第16楼jerrynpc于2010-10-08 08:36发表的 : 私有符号,Windbg是看不到的,按楼主说的方法找吧~ 作者: rickywong 时间: 2010-10-10 12:45:51 实用性不大,和4M内存粒度一样,很多驱动都不支持 作者: perfectdark 时间: 2010-10-10 17:14:24 兼容性如何,以前我改过,但是蓝屏了,不知道是否是我改错了, 还是驱动不兼容 作者: perfectdark 时间: 2010-10-10 18:48:44 又改了一次,还是蓝屏了 作者: wg2001wg 时间: 2010-10-10 21:39:08 确定不是ps上的?? 作者: univert 时间: 2010-10-11 16:43:27 可以用的啊,我的4G机子已经跑了3天了,没问题 有些驱动确实有问题,声明物理内存变量的时候没有用PHYSICAL_ADDRESS 宏,而是自己用int . long 如果该物理内存地址>4G的话就会出问题了,PHYSICAL_ADDRESS 其实是__int64 作者: youxyo 时间: 2010-10-13 02:03:48 用过。。偶尔蓝屏。。。偶尔启动不了 |
|