首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 嵌入开发 > 汇编语言 >

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

2013-08-14 
关于一段检查内存大小的代码下面一段代码是《30天自制操作系统》的一段代码,书中说:“内存检查时,要往内存里

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


PUSHEDI
PUSHESI
PUSHEBX
MOVESI,0xaa55aa55; pat0 = 0xaa55aa55;
MOVEDI,0x55aa55aa; pat1 = 0x55aa55aa;
MOVEAX,[ESP+12+4]; i = start;
mts_loop:
MOVEBX,EAX
ADDEBX,0xffc; p = i + 0xffc;
MOVEDX,[EBX]; old = *p;
MOV[EBX],ESI; *p = pat0;
XORDWORD [EBX],0xffffffff; *p ^= 0xffffffff;
CMPEDI,[EBX]; if (*p != pat1) goto fin;
JNEmts_fin
XORDWORD [EBX],0xffffffff; *p ^= 0xffffffff;
CMPESI,[EBX]; if (*p != pat0) goto fin;
JNEmts_fin
MOV[EBX],EDX; *p = old;
ADDEAX,0x1000; i += 0x1000;
CMPEAX,[ESP+12+8]; if (i <= end) goto mts_loop;
JBEmts_loop
POPEBX
POPESI
POPEDI
RET
mts_fin:
MOV[EBX],EDX; *p = old;
POPEBX
POPESI
POPEDI
RET
操作系统 内存
[解决办法]
获取内存大小一般是读取SPD的。
因为CPU会把一些硬件也映射到内存地址上面
[解决办法]
这样检测是可以的,系统加电自检(POST)中的内存检测就是这么做的,只不过如果是快速内存自检的话,不测试全部内存地址,只测试每一内存块(16K或者64K之类)的最高若干字,内存条上SPD(就是一个EEPROM芯片)中的数字只是作为参考的,没有它内存也能用,另外,检测内存错误也需要实际读写才能测出来。至于是否会写到某些硬件映射的内存地址,这其实不用担心,因为系统加电之后,硬件处于最小工作集,内存控制器只允许FEC00000(大概是这个地址,我没有核对)之上的地址用于附加硬件的RAM、ROM、I/O空间、ROM BIOS等等,低地址部分都是保留给系统内存的。


热点排行