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

ProgrammingRing 2013-08-11 06:37:54
下面一段代码是《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
...全文
201 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
ProgrammingRing 2013-08-13
  • 打赏
  • 举报
回复
引用 6 楼 DelphiGuy 的回复:
这样检测是可以的,系统加电自检(POST)中的内存检测就是这么做的,只不过如果是快速内存自检的话,不测试全部内存地址,只测试每一内存块(16K或者64K之类)的最高若干字,内存条上SPD(就是一个EEPROM芯片)中的数字只是作为参考的,没有它内存也能用,另外,检测内存错误也需要实际读写才能测出来。至于是否会写到某些硬件映射的内存地址,这其实不用担心,因为系统加电之后,硬件处于最小工作集,内存控制器只允许FEC00000(大概是这个地址,我没有核对)之上的地址用于附加硬件的RAM、ROM、I/O空间、ROM BIOS等等,低地址部分都是保留给系统内存的。
哦,那也就是当地址超过内存大小也可以读写?那上面的代码是根据写入数据后再读出来比较和写入的数据是否相同来判断的,如果地址超过内存,写入会发生什么?因为他是根据读取的数据才判断的,那读出来的又是什么?
  • 打赏
  • 举报
回复
没有安装内存的地址也是可以读写的,写入没有效果,读出来的是全1(FF、FFFF、FFFFFFFF等等)。
WJN92 2013-08-12
  • 打赏
  • 举报
回复
引用 4 楼 ProgrammingRing 的回复:
[quote=引用 3 楼 WJN92 的回复:] [quote=引用 2 楼 ProgrammingRing 的回复:] [quote=引用 1 楼 WJN92 的回复:] 获取内存大小一般是读取SPD的。 因为CPU会把一些硬件也映射到内存地址上面
那请问上面那段代码是如何实现检查内存大小的,我有点想不明白..[/quote] 它能够正常获取内存大小吗?反正我就没有试过这个获取内存大小[/quote] 具体能不能获取,我也没实验,他书上是获取了……我的疑问是假如按照他说得那样,先写入然后读取,如果当地址超过内存大小,还可以写入或读取吗?会向他说得读出的东西是乱七八糟?[/quote] 你自己试试吧,反正我觉得这样不行。 这样做不科学,还可能引起其他硬件的错误。
  • 打赏
  • 举报
回复
这样检测是可以的,系统加电自检(POST)中的内存检测就是这么做的,只不过如果是快速内存自检的话,不测试全部内存地址,只测试每一内存块(16K或者64K之类)的最高若干字,内存条上SPD(就是一个EEPROM芯片)中的数字只是作为参考的,没有它内存也能用,另外,检测内存错误也需要实际读写才能测出来。至于是否会写到某些硬件映射的内存地址,这其实不用担心,因为系统加电之后,硬件处于最小工作集,内存控制器只允许FEC00000(大概是这个地址,我没有核对)之上的地址用于附加硬件的RAM、ROM、I/O空间、ROM BIOS等等,低地址部分都是保留给系统内存的。
ProgrammingRing 2013-08-11
  • 打赏
  • 举报
回复
引用 3 楼 WJN92 的回复:
[quote=引用 2 楼 ProgrammingRing 的回复:] [quote=引用 1 楼 WJN92 的回复:] 获取内存大小一般是读取SPD的。 因为CPU会把一些硬件也映射到内存地址上面
那请问上面那段代码是如何实现检查内存大小的,我有点想不明白..[/quote] 它能够正常获取内存大小吗?反正我就没有试过这个获取内存大小[/quote] 具体能不能获取,我也没实验,他书上是获取了……我的疑问是假如按照他说得那样,先写入然后读取,如果当地址超过内存大小,还可以写入或读取吗?会向他说得读出的东西是乱七八糟?
WJN92 2013-08-11
  • 打赏
  • 举报
回复
引用 2 楼 ProgrammingRing 的回复:
[quote=引用 1 楼 WJN92 的回复:] 获取内存大小一般是读取SPD的。 因为CPU会把一些硬件也映射到内存地址上面
那请问上面那段代码是如何实现检查内存大小的,我有点想不明白..[/quote] 它能够正常获取内存大小吗?反正我就没有试过这个获取内存大小
ProgrammingRing 2013-08-11
  • 打赏
  • 举报
回复
引用 1 楼 WJN92 的回复:
获取内存大小一般是读取SPD的。 因为CPU会把一些硬件也映射到内存地址上面
那请问上面那段代码是如何实现检查内存大小的,我有点想不明白..
WJN92 2013-08-11
  • 打赏
  • 举报
回复
获取内存大小一般是读取SPD的。 因为CPU会把一些硬件也映射到内存地址上面

21,453

社区成员

发帖
与我相关
我的任务
社区描述
汇编语言(Assembly Language)是任何一种用于电子计算机、微处理器、微控制器或其他可编程器件的低级语言,亦称为符号语言。
社区管理员
  • 汇编语言
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧