欢迎来到Doc100.Net免费学习资源知识分享平台!
您的位置:首页 > 程序异常 >

关于一段检察内存大小的代码

更新时间: 2014-01-05 03:17:16 责任编辑: Author_N1

 

关于一段检查内存大小的代码
下面一段代码是《30天自制操作系统》的一段代码,书中说:“内存检查时,要往内存里随便写入一个值,然后马上读取,来检查读取的值与写入的值是否相等。如果内存链接正常,则写入的值能够记在内存里,如果没连接上,则读出的值肯定是乱七八糟的”
我的问题是,根据下面的代码,如果地址增加到超过内存的范围,能够向这个地址写入和读取吗?这个是怎么判断内存大小的??有点不明白

PUSH EDI
PUSH ESI
PUSH EBX
MOV ESI,0xaa55aa55 ; pat0 = 0xaa55aa55;
MOV EDI,0x55aa55aa ; pat1 = 0x55aa55aa;
MOV EAX,[ESP+12+4] ; i = start;
mts_loop:
MOV EBX,EAX
ADD EBX,0xffc ; p = i + 0xffc;
MOV EDX,[EBX] ; old = *p;
MOV [EBX],ESI ; *p = pat0;
XOR DWORD [EBX],0xffffffff ; *p ^= 0xffffffff;
CMP EDI,[EBX] ; if (*p != pat1) goto fin;
JNE mts_fin
XOR DWORD [EBX],0xffffffff ; *p ^= 0xffffffff;
CMP ESI,[EBX] ; if (*p != pat0) goto fin;
JNE mts_fin
MOV [EBX],EDX ; *p = old;
ADD EAX,0x1000 ; i += 0x1000;
CMP EAX,[ESP+12+8] ; if (i <= end) goto mts_loop;
JBE mts_loop
POP EBX
POP ESI
POP EDI
RET
mts_fin:
MOV [EBX],EDX ; *p = old;
POP EBX
POP ESI
POP EDI
RET

--参考方法--
获取内存大小一般是读取SPD的。
因为CPU会把一些硬件也映射到内存地址上面
--参考方法--
这样检测是可以的,系统加电自检(POST)中的内存检测就是这么做的,只不过如果是快速内存自检的话,不测试全部内存地址,只测试每一内存块(16K或者64K之类)的最高若干字,内存条上SPD(就是一个EEPROM芯片)中的数字只是作为参考的,没有它内存也能用,另外,检测内存错误也需要实际读写才能测出来。至于是否会写到某些硬件映射的内存地址,这其实不用担心,因为系统加电之后,硬件处于最小工作集,内存控制器只允许FEC00000(大概是这个地址,我没有核对)之上的地址用于附加硬件的RAM、ROM、I/O空间、ROM BIOS等等,低地址部分都是保留给系统内存的。


上一篇:上一篇
下一篇:下一篇

 

随机推荐程序问答结果

 

 

如对文章有任何疑问请提交到问题反馈,或者您对内容不满意,请您反馈给我们DOC100.NET论坛发贴求解。
DOC100.NET资源网,机器学习分类整理更新日期::2014-01-05 03:17:16
如需转载,请注明文章出处和来源网址:http://www.doc100.net/bugs/t/20393/
本文WWW.DOC100.NET DOC100.NET版权所有。