最近看到一篇文章,对ramdisk在32位下利用4G以上内存的方法提出了质疑。求懂Windows内存管理的大侠鉴定一下把~

我找到的是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以上某个地址写点东西的话,你的文件就坏了

] 求鉴定:《终于知道ramdisk 4g是如何使用4G以上内存了,慎用!》相关推荐

  1. c语言按照字节读取任何文件,【文件操作】【按字节读取】求鉴定问题……

    已结贴√ 问题点数:10 回复次数:3 [文件操作][按字节读取]求鉴定问题-- 最近在做Eulor Project,做到一个要求进行大数字相加的任务 然后我打算练练文件操作 所以想从记事本按字节读取 ...

  2. 我花5000块钱从黑市买了一个苹果笔记本电脑,同学说我被骗了,求鉴定

    我花5000块钱从黑市买了一个苹果笔记本电脑,同学说我被骗了,求鉴定! ­ 我花5000块钱从黑市买了一个苹果笔记本电脑,同学说我被骗了,求鉴定! ­ 我怎么看着这么奇怪,但确实是苹果~电脑呀,是不是 ...

  3. android系统怎么打开4G,4g手机怎么用4g网络【图文】

    大家要想智能手机充分发挥出智能手机它的强大性能,就必须要拥有非常流畅的4g网络.而大家要想使用4G网络,就必须要拥有一部4G智能手机,你说现在时候能实现智能手机销售非常的火爆.而人们的使用4g智能手机 ...

  4. 4G路由器解决方案 物联网 4G透明传输模块的功能

    咱实诚的工程师将4G路由器解决方案 物联网 4G透明传输模块的功能带到户外深山进行了性能等测试.虽然稳定性极好,不掉网不掉线,但还是具备有有线/4G/WIFI智能切换备份的功能,有线网络断开可以自动连 ...

  5. 汽车4G定位器和电动车4G定位器可以通用的吗?

    汽车4G定位器和电动车4G定位器基本上是可以通用的,只是有的车的电压是24V左右,速锐得科技有推出过一款宽压的4G车载定位器终端,耐压范围在9-100V,一般的汽车和电动车上都可以使用.可实现的功能和 ...

  6. 4G网络号角,4G网络音柱

    SV-7042L 4G网络号角,4G网络音柱 SV-7042L是深圳锐科达电子有限公司的一款壁挂式WIFI无线网络音柱,通过WIFI无线接入到WIFI覆盖的网络中,可将网络音源通过自带的功放和喇叭输出 ...

  7. Drawwhile计算机软件,计算机程序设计、小女纸又怒编一程序、求鉴定、

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 srand(time(NULL)); while (1) { while (!kbhit()) //在没有按键的情况下,蛇自己移动身体 { if (foo ...

  8. rndis模块 linux,【填坑求精】荔枝派rndis-host驱动合宙4G模块,荔枝派插入WIN/Unbutu识别为Rndis网卡...

    # #     拔掉模块 # # [ 1059.077876] usb 1-1: USB disconnect, device number 3 [ 1059.083457] rndis_host 1 ...

  9. linux镜像文件不要大于4g,Systemback制作大于4G的Ubuntu系统镜像

    1 安装Systemback 依此执行如下命令. sudo apt-get update sudo add-apt-repository ppa:nemh/systemback sudo apt-ge ...

最新文章

  1. python毕业设计有哪些方向-Python毕业选题档案管理系统 开题报告
  2. ajax id sort,ajax返回的json内容进行排序使用sort()方法实现
  3. ACM PKU 2559 Largest Rectangle in a Histogram http://acm.pku.edu.cn/JudgeOnline/problem?id=2559
  4. STM32H743+CubeMX-定时器TIM发送非对称PWM(使用一个通道)
  5. 代码覆盖度-NCover监控IIS和exe,结果分析
  6. 使用Flash彻底美化你的程序
  7. Java之switch的控制语句详解
  8. (转)测试端口通不通(四种方法)
  9. linux 隐藏字符 h,webpack手动配置
  10. linux操作系统基础教程第二版附录答案,Linux操作系统(第2版) 课后习题答案
  11. 电脑蓝牙耳机,蓝牙耳机能连笔记本吗_笔记本电脑怎么接蓝牙耳机吗-win7之家
  12. A002-186-2619-林斌锐
  13. 用SVM预测股票涨跌 - 免费分享全套代码
  14. 前端学习-JavaScript每日一题-数组扁平化
  15. linux之getcwd函数解析,Linux 中C语言getcwd()函数的用法
  16. Ubuntu 20.04安装绿联PL2303串口驱动
  17. 后台管理页面通过点击左侧导航栏的菜单项实现右边内容的改变
  18. 《Android源码设计模式》之迭代器模式
  19. 各大互联网公司都有哪些部门?核心部门又是什么?一文全知道!
  20. Map.Entry与entrySet与entry,getKey()与entry.getValue()的用法

热门文章

  1. 信息学奥赛一本通 1314:【例3.6】过河卒(Noip2002) | 1921:【02NOIP普及组】过河卒 | 洛谷 P1002 [NOIP2002 普及组] 过河卒
  2. 信息学奥赛一本通 1001:Hello,World | OpenJudge NOI 1.1 01:Hello, World
  3. 信息学奥赛一本通(1057:简单计算器)
  4. Array with Odd Sum(CF-1296A)
  5. LCS-最大公共子序列(DP问题)
  6. 35 WM配置-作业-定义需求类型
  7. post python爬虫_小白学 Python 爬虫(17):Requests 基础使用
  8. 如何看计算机几核,windows7系统怎么看CPU是几核的?win7查看CPU是几核的方法
  9. v4l2 框架下如何设置分辨率_【微学习】低压计量电表如何设置?(下)
  10. Win10+VSCode搭建opencv+C++环境(1)