xp系统支持64g内存_让32位XP支持64G内存

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼

代码:

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值