下面一段代码是《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等等,低地址部分都是保留给系统内存的。