New Folder/4GB.C
#include
#include
void Set4gb();
void openA20();
void main()
{
unsigned long addr;
openA20();
Set4gb();
asm push ds
asm mov ax,0
asm mov ds,ax
asm mov esi,00100000h
N1: asm mov eax,[esi]
asm mov dword ptr[esi],0
asm mov ebx,[esi]
asm mov dword ptr[esi],0ffffffffh
asm mov ecx,[esi]
asm mov [esi],eax
asm inc ecx
asm cmp ebx,ecx
asm jne N2
asm add esi,4
asm jmp N1
N2: asm mov addr,esi
asm pop ds
printf("RAM=%1d(Mb)",addr>>20);
}
void openA20()
{
while(inp(0x64)&2);
outp(0x64,0xd1);
while(inp(0x64)&2);
outp(0x60,0xdf);
while(inp(0x64)&2);
outp(0x64,0xff);
}
void Set4gb()
{
asm cli
asm push ds
asm push es
asm mov dword ptr GDT_Addr[0],(2*8-1)
asm mov eax,ds
asm shl eax,4
asm xor ebx,ebx
asm mov bx,offset GDT_def
asm add eax,ebx
asm mov dword ptr GDT_Addr[2],eax
asm lgdt fword ptr GDT_Addr
asm mov bx,8
asm mov eax,cr0
asm or al,1
asm mov cr0,eax
asm jmp flush1
flush1:
asm mov ds,bx
asm mov es,bx
asm and al,0feh
asm mov cr0,eax
asm jmp flush2
flush2:
asm pop es
asm pop ds
asm sti
}