该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
代码:
int __usercall MiCheckPaeLicense(PLOADER_PARAMETER_BLOCK LoaderBlock){ EndPage = 0; LoaderBlock1 = LoaderBlock; MaxPageCount = 0x100000u; MaxPage = 0; if ( ExVerifySuite(DataCenter) == 1 ) { if (LoaderBlock->u.I386.VirtualBias ) { MaxPageCount = 0x400000u; // booting /3gb: 16G MaxPage = 0x400000u; } else { MaxPageCount = 0x1000000u; } // DataCenter: 64G } else { if ( MmProductType == 0x690057 || ExVerifySuite(Enterprise) != 1 ) { if ( ExVerifySuite(ServerAppliance) == 1 ) MaxPageCount = 0x80000u; // 2G else MaxPage = 0x100000u; // 4G } else { MaxPageCount = 0x800000u;// Advanced Server is permitted a maximum of 32gb } }
实在是不知道这位高人的代码来自哪里,恳请各位高人给予指点。。。
从这段代码里可以看出,MiCheckPaeLicense函数会检查操作系统的版本,如果是DataCenter,就允许使用64G内存,Advanced Server为32G,如果为精简版则为2G,其他版本为4G,看来真是ntkrnlpa.exe在作怪,先别急着patch,验证内存限制的还有一个地方,在MmAddPhysicalMemoryEx函数里也会调用ExVerifySuite这个函数,代码如下:
代码:
if ( ExVerifySuite(DataCenter) == 1 ) { LimitPage = 0x1000000u; // DataCenter : 64G } else { if ( MmProductType == 0x690057 || (v9 = ExVerifySuite(Enterprise) == 1, LimitPage = 0x800000u, !v9) )// Advanced Server : 32G LimitPage = 0x100000u; // Other : 4G }
代码都差不多,要patch的话两个地方要一起改,至于怎么改?代码都在这么里,想怎么改就怎么改吧,只要两个地方都改了就行,只要其中一个地方不改,ntos都会阴魂不散的把你多出来的内存吃掉…
看成果吧
代码:
lkd> dd MmHighestPhysicalPage8088b124 00137fff 000f7399 00000040 00000000lkd> dd MmNumberOfPhysicalPages8088b128 000f7399 00000040 00000000 7fff0000lkd> !pte d0800000 VA d0800000PDE at C0603420 PTE at C0684000contains 00000001004DF963 contains E15C080000000400pfn 1004df -G-DA--KWEV not valid Proto: E15C0800
数数这个地址1004DF963,9位啊,4G以上了,不要被E15C080000000400这个地址吓到了,64位,有这么大的地址吗?查查PTE的结构体就知道了,前面的几位是标志位
再看物理内存块
代码:
lkd> dd poi(MmPhysicalMemoryBlock)8baa3c70 00000008 000f73ab 00000001 0000009d8baa3c80 00000100 000bf17c 000bf282 000000dd8baa3c90 000bf40f 00000060 000bf70f 000000088baa3ca0 000bf71f 0000004c 000bf7ff 000000018baa3cb0 00100000 00038000 0001000a 6c4d6d4d
看到了吗,我的机器现在有8块可用的内存了,多了一个100000-138000,总共有f73ab页了,0xf73ab*0x1000=3.86G,至于还有140M,主板没映射,用不到了,能不能解决呢?希望各位牛人能够给予指点。。。
后面部分比较仓促,主要是听到重任到来的消息,没时间仔细写了,补丁没写完,估计一时半会完成不了了,仓促发帖,开始潜伏。。。
忙里偷闲,补丁写好了,赶紧传上来共享,本机测试通过,如果使用过程中发现问题请给我留言。。。
——————————————————————————————————————————
最近忙死了,几天没上网了,更没时间去研究这个,让各位失望了。。。 坛子里的牛人们如果有时间去研究研究吧,MengXP执着的钻研精神让我佩服,离成功只有一步之遥了,希望大家能齐心协力,早日解决这些问题,我只能忙过这阵子再来了。。。
---------------------------------------------------------------
实在抱歉,上个版本出的太匆忙了,严重问题都没有发现,下载这个版本XP64G20110805.rar的朋友请骂我,实在是疏忽大意,抱歉抱歉。。。。
----------------------------------------------------------------------------------------------------------------------------------------------
终于有时间继续研究一下了,发现原因主要在DMA,修改之后,USB存储设备基本可以正常使用了,先上补丁,回头再发技术帖
从NT4的源代码就可以发现,物理地址使用64位长的LARGE_INTEGER表示:
typedef LARGE_INTEGER PHYSICAL_ADDRESS, *PPHYSICAL_ADDRESS;
说明从NT架构一开始,微软就已经考虑到了Windows在64位物理地址的机器上运行,至于为什么从2000一直到Win7的32位终端版本都将物理地址空间限制到4G以下,微软官方的解释是为了提高驱动程序的兼容性。
奇怪的是Windows 2003 同样是32位版本却允许用到64G的物理地址空间,2003的内核跟XP的内核相差不大,并且Win7比2003新的多吧,却同样存在4G的限制,这肯定不能用技术原因来解释,那只有一个理由:
微软我偏不让你用!很多人怀疑是出于商业原因。。。
其实,XP、Win7跟2003一样,已经完全能够胜任在4G以上物理地址空间运行,只是被强行限制。
Win7的内存限制相对简单,只是通过一个检查License的函数MxMemoryLicense限制了内存的可用量。而在XP上,除了通过版本检查函数ExVerifySuite限制内存可用量外,微软还玩了一点小花招,比如说关闭DMA映射寄存器支持,这都只是一些开关而已,打开了这些开关,XP的内核完完全全可以在4G以上物理地址运行。
945的板,BIOS 认出4G内存,2003下只认3G