关于VSuite Ramdisk使用是否安全的讨论

交流 VSuite Ramdisk 软件使用过程中遇到的问题以及心得等
这里提供官方的技术支持
回复
yuanjk
1级用户
1级用户
帖子: 3
注册时间: 周五 4月 01, 2011 12:36 pm

关于VSuite Ramdisk使用是否安全的讨论

帖子 yuanjk »

管理员,你好:

  我从网上看到的关于 gavotte 根据微软的Ramdisk改写的 Ramdisk4G 的讨论帖:

    http://bbs.pcbeta.com/viewthread-413755-1-1.html

  主要就是讨论关于 ramdisk是如何获取未被操作系统识别的内存的以及其访问方式是否安全的问题。在另一个帖子(http://bbs.myboyan.com/article-381567-e-2.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以上某个地址写点东西的话,你的文件就坏了.




  另外,我看到 SuperSpeed Ramdisk plus 10 号称是经过微软认证,并且可以自动识别出被主板占用的PAE中的内存:

“有些主板会强制利用部分内存,所以每台机子上显示的信息会不同。不要紧!10.0版本下,虚拟盘可以自由设定大小,软件会避开主板已占用的内存,优先使用windows没有利用到的剩下的内存,比如这块主板还有512M没被windows利用。


  我想知道,VSuite Ramdisk 可以自动识别出被主板或其他硬件占用的PAE内存吗?可以安全的使用PAE内存吗?
上次由 yuanjk 在 周六 4月 02, 2011 9:00 am,总共编辑 1 次。
头像
Support
技术支持组
技术支持组
帖子: 2670
注册时间: 周日 12月 21, 2008 10:42 am
联系:

Re: 关于VSuite Ramdisk使用问题的咨询

帖子 Support »

Primo Ramdisk | PrimoCache
Romex Software 技术支持组
yuanjk
1级用户
1级用户
帖子: 3
注册时间: 周五 4月 01, 2011 12:36 pm

Re: 关于VSuite Ramdisk使用问题的咨询

帖子 yuanjk »

关于设置使用未识别内存我知道怎么设置,我的意思是系统未识别内存有可能被主板或其他设备占用一部分,如果VSuite Ramdisk没检测这种情况,就可能会有冲突吧? 我看你给的链接里的【注意事项】也提到:部分显卡驱动可能也会使用未识别内存,可以通过保留系统未识别内存的功能来避免冲突,参考未识别内存保留。 问题是有没有可能其他设备也会占用未识别内存,会不会也引起冲突? 用户怎么知道要保留多少未识别内存给其他设备呢? VSuite Ramdisk在使用未识别内存时可以自动检测排除其他设备要占用的未识别内存吗?
头像
Support
技术支持组
技术支持组
帖子: 2670
注册时间: 周日 12月 21, 2008 10:42 am
联系:

Re: 关于VSuite Ramdisk使用问题的咨询

帖子 Support »

该网页的注意事项中已经说明了这些情况。
所有的使用未识别内存的软件都有这些风险。
Primo Ramdisk | PrimoCache
Romex Software 技术支持组
yuanjk
1级用户
1级用户
帖子: 3
注册时间: 周五 4月 01, 2011 12:36 pm

Re: 关于VSuite Ramdisk使用问题的咨询

帖子 yuanjk »

那也就是说从技术上来说是不可避免的啦? 软件是没办法从未识别内存中排除掉有可能被其他设备占用的部分内存了?

用户若使用ramdisk出现蓝屏或不稳定情况,就只能自己一点一点试验来排除掉被其他硬件使用的PAE内存了?

在【未识别内存保留】帖子:http://www.romexsoftware.com/zh-cn/vsui ... serve.html 里有如下描述:

未识别内存保留
  有些用户在启用系统未识别内存后可能出现系统假死或花屏等问题,这很可能是因为 VSuite Ramdisk 与显卡驱动或其它程序冲突造成的。某些显卡驱动,尤其是集成显卡,可能会同样使用到系统未识别内存而导致冲突。以下是两个例子:
  1.主板 Gigabyte GA-MA78GM-S2H,集成显卡,BIOS中Frame Buffer Location (FB Location)设置为"Above 4G". 此时显卡驱动会使用未识别内存作为其帧缓冲。
  2.主板 Abit F-I90HD motherboard,独立显卡 ATI Radeon HD 3850 (1GB 显存)。该显卡驱动采用ATI Hypermemory 技术使用最前 512MB 未识别内存。
  未识别内存保留有助于解决这些问题。它可以保留最前部分未识别内存给显卡驱动或其它程序使用,而不会写入任何数据到这些保留区域。以第1个情况为例,如果帧缓冲(Frame Buffer)设置为256MB,用户可以保留最前面256MB未识别内存,从而避免两者之间的冲突。在这个例子中,我们可以发现保留未识别内存之前,VSuite Ramdisk可使用的未识别内存总容量为4604MB,在保留256MB后,总容量减为4348MB。
  某些驱动或程序可能从末端向前开始使用未识别内存,这种情况下用户只需限制虚拟硬盘使用的未识别内存总容量即可避免冲突,因为 VSuite Ramdisk 采用从前端向后开始使用未识别内存的方式。


  作为普通用户怎么知道哪些设备或哪些驱动会占用未识别内存,又占用了多少呢? 又如何来选择设置要保留多少未识别内存呢?如果VSuite Ramdisk能自动识别就好了
头像
Support
技术支持组
技术支持组
帖子: 2670
注册时间: 周日 12月 21, 2008 10:42 am
联系:

Re: 关于VSuite Ramdisk使用是否安全的讨论

帖子 Support »

使用系统未识别内存是有一定风险的。所以在允许的情况下,建议还是使用64位的操作系统,以尽可能充分利用大内存。而且在性能上,系统管理的内存也比未识别内存访问速度快。
Primo Ramdisk | PrimoCache
Romex Software 技术支持组
feve
1级用户
1级用户
帖子: 2
注册时间: 周三 4月 06, 2011 6:49 am

Re: 关于VSuite Ramdisk使用是否安全的讨论

帖子 feve »

集显不要用,特别ATI,3A平台99.9%显卡都有如果显存不够去占用内存的技术,楼主的转贴和分析都很有理,学习了....


既然用到RAMDISK,除了服务器就是高端玩家为了提那点点速用的了,

普通用户象我台式独显.8G内存分了3G去做RAM盘,留了1G多,能应对所有情况,至少错误机会缩短到3/4.也可以只设1G..留3G应对特殊情况,把错误机会缩到更低,关键是机率,运气而已,有人机器用了10年硬盘都没事,,5G硬盘用到现在,有人硬盘用了2-3个月就3红,同理的.....

PS.我当然是属于运气好那个,装了这么久所有意外都没发生过,LOL
feve
1级用户
1级用户
帖子: 2
注册时间: 周三 4月 06, 2011 6:49 am

Re: 关于VSuite Ramdisk使用是否安全的讨论

帖子 feve »

顺便一说我是用破解的RAMDISK PLUS 10
至于VSUITE,我也用过,也是觉得不好..但很多人都说好
PLUS 11我也用过,但那不稳定,没10好,但很多人说11很好,反正其实就是看运气
回复