ramdisk 4g

转载地址:http://bbs.pcbeta.com/viewthread-413755-1-1.html


打开资源监视器-内存,看下使用ramdisk 4g后的内存分布情况,见图.



主要我怀疑这个东西的真实有效性,网上查了半天,也没找到ramdisk 4g的详细资料,只是说是一个家伙用MS的ramdisk的sample code改写的.我下了那个sample code,申请内存的代码是直接申请的nonpaged pool(未分页内存),这个内存还是由OS管理的,而且容量是很小的. 

我很感兴趣这家伙具体怎么实现跳过OS直接处理4G地址线以上的内存的, 因为据我所知在client版本中,4GB以上地址访问是完全被禁用的,就是说你即使在启动项里面指定用PAE也是无效的.

从下面的资料可以看出,对于超过4GB的部分,kernel根本连PFN(page frame number,cpu用来定位内存位置的结构)都没有建立,而且从bios拿到的多余内存描述符都是直接扔掉的. 如果,假设,这个驱动能够自己调用bios中断,重新拿到内存描述符,并且创建自己的pfn表,然后还要在需要使用的时候调用另一个中断把cpu当前使用的pfn表地址换成自己的,用完了再换回来,但是这样还个严重的问题:如果这个途中来了一个高级别的硬件中断,中断处理程序还是需要老的pfn表,这时候就完了,除非这个驱动能够再截获其他所有的中断处理...这个不敢想象了.

当然,更简单的办法是直接patch kernel,直接就可以用到最高128G,对于vista kernel的patch方法下面的链接里面已经有了.但是,问题是基于binary的patch,是对kernel的具体build敏感的,不同build完全不能混用,即使知道 win7 的binrary,也不可能同时patch到7000和7022两个build上去.所以也不可能采用这个方法.

so, 我真的不知道他怎么声称做到的.加上网上根本搜索不到相关这个工具的具体技术信息(因为如果这个真的真么神奇,必然有很多高手评论的),而对比下面的这么多严谨的blog,我倾向与怀疑这个东西的真实性.

详细说明可以在很多blog上面看到,大部分是微软内部人事写的.

比如很有名的blog: old new things
http://blogs.msdn.com/oldnewthing/archive/2006/08/14/699521.aspx

还有larry,微软著名的blogger:
http://blogs.msdn.com/larryosterman/archive/2009/01/08/why-do-people-think-that-a-server-sku-works-well-as-a-general-purpose-operating-system.aspx#9302522

还有这篇更是详细地说了为什么会有这个限制,以及提供了一个自己patch kernel甚至可以使用8GB内存的方法.
http://www.geoffchappell.com/viewer.htm?doc=notes/windows/license/memory.htm

另外还有微软网站上的官方文档:

http://www.microsoft.com/technet/prodtechnol/winxppro/maintain/sp2mempr.mspx  
"To constrain compatibility issues, Windows XP Service Pack 2 includes hardware abstraction layer (HAL) changes that mimic the 32-bit HAL DMA behavior. The altered HAL grants unlimited map registers when the system is running in PAE mode. In addition, the kernel memory manager ignores any physical address above 4 GB. Any system RAM beyond the 4 GB barrier would be made unaddressable by Windows and be unusable in the system. By limiting the address space to 4 GB, devices with 32-bit DMA bus master capability will not see a transaction with an address above the 4 GB barrier. Because these changes remove the need to double-buffer the transactions, they avoid a class of bugs in some drivers related to proper implementation of double buffering support."

简单翻译下就是从XPSP2开始,kernel的内存管理模块直接忽略任何超过4GB地址线的内存访问,主要原因是很多驱动程序在处理超过4GB地址线内存访问的时候会有bug.


另外需要补充一点, 论坛上的ramdisk使用方法里面提到, 要启用pae, 一定需要在启动项里面禁用nx和强制启用pae. 这个其实是一个很愚蠢的常识性错误,因为在绝大部分系统上,nx(no-execute)是自动启用的,而当nx启用的时候,pae的kernel本来就是被强制载入的,原因是需要pae kernel提供的额外pte(page table entry)长度来设置nx的bit. 而这个说面里面说为了启用pae反而要禁用nx,完全是根本不理解pae, 而要相信一个连基础都不懂的作者是相当困难的.



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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值