forked from backup/30dayMakeOS
内存容量检查(2)
This commit is contained in:
@@ -4,7 +4,6 @@
|
||||
#include <stdio.h>
|
||||
|
||||
unsigned int memtest(unsigned int start, unsigned int end);
|
||||
unsigned int memtest_sub(unsigned int start, unsigned int end);
|
||||
|
||||
void HariMain(void)
|
||||
{
|
||||
@@ -129,28 +128,3 @@ unsigned int memtest(unsigned int start, unsigned int end)
|
||||
|
||||
return i;
|
||||
}
|
||||
|
||||
unsigned int memtest_sub(unsigned int start, unsigned int end)
|
||||
{
|
||||
unsigned int i, *p, old, pat0 = 0xaa55aa55, pat1 = 0x55aa55aa;
|
||||
for (i = start; i <= end; i += 0x1000) {
|
||||
p = (unsigned int *) (i + 0xffc);
|
||||
old = *p; /* 先记住修改前的值 */
|
||||
*p = pat0; /* 试写 */
|
||||
*p ^= 0xffffffff; /* 反转 */
|
||||
if (*p != pat1) {
|
||||
/* 检查反转结果 */
|
||||
not_memory:
|
||||
*p = old;
|
||||
break;
|
||||
}
|
||||
*p ^= 0xffffffff; /* 再次反转 */
|
||||
if (*p != pat0) {
|
||||
/* 检查值是否恢复 */
|
||||
goto not_memory;
|
||||
}
|
||||
*p = old; /* 恢复为修改前的值 */
|
||||
}
|
||||
return i;
|
||||
}
|
||||
|
||||
|
||||
@@ -13,6 +13,7 @@
|
||||
GLOBAL _load_gdtr, _load_idtr
|
||||
GLOBAL _load_cr0, _store_cr0
|
||||
GLOBAL _asm_inthandler21, _asm_inthandler27, _asm_inthandler2c
|
||||
GLOBAL _memtest_sub
|
||||
EXTERN _inthandler21, _inthandler27, _inthandler2c
|
||||
|
||||
[SECTION .text]
|
||||
@@ -148,3 +149,36 @@ _asm_inthandler2c:
|
||||
POP DS
|
||||
POP ES
|
||||
IRETD
|
||||
|
||||
_memtest_sub: ; unsigned int memtest_sub(unsigned int start, unsigned int end)
|
||||
PUSH EDI ; (由于还要使用EBX, ESI, 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
|
||||
|
||||
Reference in New Issue
Block a user