查看: 148599|回复: 39

终于知道ramdisk 4g是如何使用4G以上内存了,慎用!

[复制链接]
timchenyx 发表于 2009-2-17 09:32 | 显示全部楼层 |阅读模式
快御云安全
之前帖子询问了下,没什么结果,不过我自己找到结果了.
https://bbs.pcbeta.com/thread-413755-1-1.html

我找到的是MS做kernel内存管理的developer,所以应该是最权威的了. 目前驱动程序唯一能达到访问4gb以上地址内存的方法是通过一个ddk api: MmMapIoSpace. 其实这个api本来是用来给设备驱动程序进行特殊的地址映射用的,并非用来管理内存.

简单地说, bios会把可用的内存映射到一个并不一定连续的物理地址空间中,比如0地址开始的一段空间需要留给bios自己所以无法映射内存, 3gb-4gb范围内的地址有可能留给各种pci设备,也不能用作内存,这也是为什么win7 32bit在4gb地址线下看不到全部4gb内存的原因.

当然如果bios支持memory remap,那么多余的内存会比map到4gb以上的地址空间,而由于目前win7 32bit强行忽略掉了这部分mapping,所以即使bios map了也不会被使用.

ramdisk 4g的原理就是使用MmMapIoSpace来强行读写4gb以上的地址空间,注意是跳过操作系统的强行读写,把这段地址当作是io设备来操作,而并不一定是内存.

这种做法,主要有两个问题:

第一: 作为驱动程序,你是无法确切地知道究竟哪段物理地址空间里面是映射的你的多余的内存,目前的bios架构中,只有通过中断int 25, function 0xE820才能获知, 而这个bios中断只能在实模式下调用,也就是说windows启动之后,驱动程序是无法调用这个中断去获知的. 那么,ramdisk驱动就只能靠猜, 比如说他可以知道你装了4gb内存,而目前只认了3.5gb, 那么多出来的512m应该在4g-4.5g这个物理地址段.

但是,这个只是猜测,bios并不一定会把多出来的内存映射到那里, 也可能是4.1g-4.6g区间,甚至不一定是连续的空间. 而且,各种奇怪的硬件设备也有可能自己占用特殊的物理地址空间,比如假设有一块硬件占用了4g开始的16m空间,那么显然这段地址里面就不再是内存了.

好吧,那么如果ramdisk强行去读写错误的地址空间会如何呢? 简单地说: cpu不会报错, 但是结果是不可预料的, 比如如果这段地址空间根本是一个memory hole,那么往里面写东西就是白写,读操作返回的有可能都是0xFFFFFFFF, 这样地话,作为一个虚拟磁盘而言,其结果就是数据损坏.

更为严重的是:如果有一块特殊的硬件的io空间映射在4g以上的一段地址,而ramdisk强行去写入数据,就会直接对那块硬件进行io操作,有可能会损坏硬件或者发生更奇怪的事情,比如该设备莫名其妙开始工作了等等.

第二: 即使你的运气很好,bios把多余的内存正好连续地映射在4g开始的空间,也就是ramdisk完全猜对了的情况,还有一个问题是,ramdisk无法保证有没有其他任何代码也会去读写这段地址空间. 因为ramdisk是跳过os的内存管理直接进行io的,其他驱动程序也有可能做相同的事情,这样的结果一样是数据损坏. 比如ramdisk先往里面写了一个文件的内容,之后另一个驱动程序也在相同地址写了一些其他数据,那么ramdisk再读出来的时候就拿不到原来的数据了.

综上,在你无法100%确保以上两点肯定没事的情况下,使用ramdisk还是有风险的,最坏情况是用户数据丢失甚至硬件设备损坏.

其实真的要用超过4g内存,还是有其他更安全的办法的,比如换64位系统,或者用server版本(完全支持pae的),或者直接patch kernel (这个在上面的帖子里面有链接,可以在vista 32位里面直接用到128g内存)

如果真的一定要用ramdisk,请在设置好之后一定要做一个测试: copy一个可以撑满ramdisk大小的真实文件(比如电影之类),然后再从ramdisk里面copy出来,再用fc /b和原始文件进行二进制比较.多做几次测试,以确保正确性.每一个使用ramdisk的机器都应该做这样的测试,因为每台机器bios映射的方式可能不一样.

当然这个只能基本确保第一个问题不存在,还是无法排除第二个问题的可能性.万一有个驱动突然想起来往4g以上某个地址写点东西的话,你的文件就坏了.

ps. 如果有人知道如何联系ramdisk作者的话,请替我转发下. 希望作者在发布这样一个好工具的同时,一定要详细说明可能造成的后果极其原因.

评分

4

查看全部评分

lihanmike 发表于 2009-2-17 09:40 | 显示全部楼层
好!就等这个了!这回我可以上4G内存了!
回复

使用道具 举报

oh66 发表于 2009-2-17 10:56 | 显示全部楼层
楼上没看帖子?
回复

使用道具 举报

czmcn 发表于 2009-2-17 11:03 | 显示全部楼层
楼上上是一2B呢,太搞了

点评

请认真发帖,需要PB可以通过任务获取!  发表于 2013-10-21 17:41

评分

1

查看全部评分

回复

使用道具 举报

se7en` 发表于 2009-2-17 11:04 | 显示全部楼层
呵呵。大致浏览了下。其实LZ想要说的重点是7040吧。
回复

使用道具 举报

burde 发表于 2009-2-17 11:06 | 显示全部楼层
写的很好,学习了。
回复

使用道具 举报

头像被屏蔽
suipf 发表于 2009-2-17 11:14 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
回复

使用道具 举报

头像被屏蔽
xudaiqing 发表于 2009-2-17 11:46 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
回复

使用道具 举报

nimeima 发表于 2009-2-17 12:37 | 显示全部楼层
我用ramdisk 4G一直没有问题,我的压缩文件只要不是太大都是在ramdisk的虚拟磁盘里面解压的,那个速度超快,而且不会在磁盘上留下碎片,特别是图片,解完了想要就复制到硬盘,不要的话直接删掉。
回复

使用道具 举报

timchenyx  楼主| 发表于 2009-2-17 12:52 | 显示全部楼层
lz 是没有真正用过ramdisk的,就敢胡乱猜测。。。。。你说话要慎重。严重不同意。
suipf 发表于 2009-2-17 11:14

你看下8楼就知道了,你没问题不代表别人没问题,也不代表你一直就不会有问题. ramdisk4g他的工作原理从本质上说就是有问题的,这就是为什么没有该类型的收费产品的存在,因为搞坏了用户数据显然是赔不起的.
回复

使用道具 举报

timchenyx  楼主| 发表于 2009-2-17 12:56 | 显示全部楼层
呵呵。大致浏览了下。其实LZ想要说的重点是7040吧。
se7en` 发表于 2009-2-17 11:04

我要说7040何必写那么大段话,直接贴7040截图就行了. 无非是个围城,没7040的看到有人用7040就受不了,自己用着一点都不稀罕的,今天看了下都出7042了,实在懒得装.

相比研究windows的几个build号,你多花点时间研究研究我帖子里面说的东西,对你而言更有好处.
回复

使用道具 举报

头像被屏蔽
红雨小生 发表于 2009-2-17 13:41 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
回复

使用道具 举报

oh66 发表于 2009-2-17 13:51 | 显示全部楼层
7042了
虽然装不了,不过每天都能知道进度也挺爽的,呵呵
回复

使用道具 举报

头像被屏蔽
montoya 发表于 2009-2-17 13:56 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
回复

使用道具 举报

头像被屏蔽
ET-MAC 发表于 2009-2-17 14:01 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
回复

使用道具 举报

timchenyx  楼主| 发表于 2009-2-18 00:40 | 显示全部楼层
之前不是太懂ramdisk,干脆就不用,直接64bit
看了lz的解释后,仍似懂非懂

另外请教下lz,哪些程序可以有效的使用上PAE,据说只有微软的SQL Server
montoya 发表于 2009-2-17 13:56

pae不需要程序支持,只要系统上了pae,认出比如说8g内存,各个程序就能共用这8g内存,但是单个32位程序最大内存空间是2g.

sql server之类用的是awe技术,可以单个进程直接申请物理内存,使用超过2g空间.

如果你没有单个程序需要大内存的需求当然话,不需要考虑awe. 一般桌面环境都是众多小进程(不超过2g)的分享内存, 大头还是system cache.
回复

使用道具 举报

timchenyx  楼主| 发表于 2009-2-18 00:44 | 显示全部楼层
15# ET-MAC
如果一直能用的话是没什么问题的,我只是说了有风险.

另外你需要考虑的是ramdisk上面本身有没有关掉系统缓存的问题,因为如果没关系统缓存的话,等于同一份文件在系统缓存和ramdisk里面都放了一份,占用双倍内存. 不过相信作者应该考虑到这个问题了.

其实如果真要用全4g内存,可以考虑使用patch kernel的方法,这样不用自己考虑哪些文件需要放到ramdisk,全部由system cache来处理.
https://bbs.pcbeta.com/thread-414042-1-1.html
回复

使用道具 举报

zxx 发表于 2009-2-18 00:47 | 显示全部楼层
其实就是内存寻址
大家可以搜索,有较多介绍的
理论上来说 32位寻址能力为4GB 64位寻址能力为16777216TB(1TB=1024GB) ,但实际使用并不能完全应用,这也就是32位系统不能完全使用4gb内存的原因.
回复

使用道具 举报

vbyu 发表于 2009-2-18 11:02 | 显示全部楼层
本帖最后由 vbyu 于 2009-2-18 11:05 编辑
pae不需要程序支持,只要系统上了pae,认出比如说8g内存,各个程序就能共用这8g内存,但是单个32位程序最大内存空间是2g.

sql server之类用的是awe技术,可以单个进程直接申请物理内存,使用超过2g空间.

如果你没 ...
timchenyx 发表于 2009-2-18 00:40

有一点清晰了,但还是不完全明白,也想请教。
譬如2008数据版支持128g内存(32位),1core支持2g,如果上16g内存(主流主板的内存上限),全用上的话,至少需8core的cpu,又非常不现实。
回复

使用道具 举报

qianjiayi 发表于 2009-2-18 11:05 | 显示全部楼层
4g应该是不错把
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋手机版联系我们

Copyright © 2005-2025 PCBeta. All rights reserved.

Powered by Discuz!  CDN加速及安全服务由「快御」提供

请勿发布违反中华人民共和国法律法规的言论,会员观点不代表远景论坛官方立场。

远景在线 ( 苏ICP备17027154号 )|远景论坛 |Win11论坛 |Win10论坛 |Win8论坛 |Win7论坛 |WP论坛 |Office论坛

GMT+8, 2025-1-30 22:05

快速回复 返回顶部 返回列表