1
Lowlevel-Coding / Re: Problem mit Textausgabe
« am: 29. June 2008, 06:53 »
OK. Danke. Jetz weiß ich wieder was mehr
23. November 2024, 14:33
Diese Sektion erlaubt es dir alle Beiträge dieses Mitglieds zu sehen. Beachte, dass du nur solche Beiträge sehen kannst, zu denen du auch Zugriffsrechte hast.
char* Mem = 0xC0000000; //3 GB
char* String = "Test... Dies ist an die 3 GB Grenze geschrieben!";
for(i=0;i<strlen(String);i++)
{
*Mem = *String;
Mem++;
*Mem = KVC_White;
Mem++;
}
Wenn ich diesen Teil weglasse bekomme ich auch eine Page-Fault, jedoch an Adresse 0x00102363._main proc near ; CODE XREF: seg000:0000002Dp
seg000:000002D1
seg000:000002D1 var_30 = dword ptr -30h
seg000:000002D1 var_C = byte ptr -0Ch
seg000:000002D1 arg_0 = byte ptr 4
seg000:000002D1
seg000:000002D1 lea ecx, [esp+arg_0]
seg000:000002D5 and esp, 0FFFFFFF0h
seg000:000002D8 push dword ptr [ecx-4]
seg000:000002DB push ebp
seg000:000002DC mov ebp, esp
seg000:000002DE push esi
seg000:000002DF push ebx
seg000:000002E0 push ecx
seg000:000002E1 sub esp, 18h
seg000:000002E4 mov ebx, [ecx]
seg000:000002E6 push 0
seg000:000002E8 call sub_EF0
seg000:000002ED call sub_283
seg000:000002F2 call sub_1730
seg000:000002F7 pop eax
seg000:000002F8 mov eax, [ebx+4]
seg000:000002FB pop edx
seg000:000002FC add eax, [ebx+8]
seg000:000002FF sub eax, 1000000h
seg000:00000304 push eax
seg000:00000305 push 1000000h
seg000:0000030A call sub_17B0
seg000:0000030F call sub_1805
seg000:00000314 add esp, 10h
seg000:00000317 test eax, eax
seg000:00000319 jnz short loc_334
seg000:0000031B push eax
seg000:0000031C push eax
seg000:0000031D push 0Fh
seg000:0000031F push 1002A5h
seg000:00000324 call sub_FD8
seg000:00000329 lea esp, [ebp-0Ch]
seg000:0000032C pop ecx
seg000:0000032D pop ebx
seg000:0000032E pop esi
seg000:0000032F pop ebp
seg000:00000330 lea esp, [ecx-4]
seg000:00000333 retn
[/EDIT]
__asm__ ( "movl %%eax, %%cr0\n"
"push %%eax\n"
"call _PrintUIAsHex":::"%eax");
__asm__ ( "movl %eax, %cr3\n"
"push %eax\n"
"call _PrintUIAsHex":::"%eax");
[/EDIT]
struct Paging_PageDirectory
{
unsigned int PageTableAdress[1024];
};
struct Paging_PageTable
{
unsigned int PhysPageAdress[1024];
};
/*
Aktiviert Paging.
*/
void Paging_Enable( void );
/*
Deaktiviert Paging.
*/
void Paging_Disable( void );
/*
Ändert das aktive PageDirectory und
gibt die Adresse des Alten zurück
*/
void Paging_SwapDirectory( struct Paging_PageDirectory* Directory);
/*
Gibt das aktive PageDirectory zurück.
*/
struct Paging_PageDirectory* Paging_GetActivDirectoy( void );
/*
Erstellt ein PageDirectory an übergeben Adresse.
*/
struct Paging_PageDirectory* Paging_CreatePageDirectory( void* Adress);
/*
Fügt einen Eintrag im Angebeben PageDirectory hinzu und
erstellt eine PageTable an angebener Adresse.
*/
struct Paging_PageTable* Paging_AddPageDirectoryEntry(unsigned short Entry,void* PageTableAdress,struct Paging_PageDirectory* PagingDirectory);
/*
Gibt einen Eintrag aus einem PageDirectory zurück.
*/
struct Paging_PageTable* Paging_GetPageTable(struct Paging_PageDirectory* Directory,unsigned short Entry);
/*
Fügt einen Eintrag in eine PageTable hinzu.
*/
void Paging_AddPageTableEntry(struct Paging_PageDirectory* Directory,unsigned short DirectoryEntry,unsigned short TableEntry,void* PhysAdress);
;C: void Paging_Enable( void );
_Paging_Enable:
push eax
mov eax,cr0 ;cr0 in eax laden
or eax,0x80000000 ;Bit Nr. 31 setzen
mov cr0,eax ;eax in cr0 schreiben
pop eax
ret ;zurück
;C: void Paging_Disable( void );
_Paging_Disable:
push eax
mov eax,cr0 ;cr0 in eax laden
xor eax,10000000000000000000000000000000b ;Bit Nr. 31 löschen
mov cr0,eax ;eax in cr0 schreiben
pop eax
ret
;C: void Paging_SwapDirectory( unsigned int DirectoryAdress );
_Paging_SwapDirectory: ; 1 Parameter: Adresse des neuen PageDirectory
push ebp
mov ebp, esp
push eax
mov eax, [ebp+8] ;Adresse nach eax lesen
mov cr3, eax
pop eax
mov esp, ebp
pop ebp
ret
;C: unsigned int Paging_GetActivDirectoy( void );
_Paging_GetActivDirectory:
mov eax,cr3 ;cr3 in eax laden
ret ;zurück (eax = Adresse)
/*
Erstellt ein PageDirectory an übergeben Adresse.
*/
struct Paging_PageDirectory* Paging_CreatePageDirectory( void* Adress)
{
//Überprüfen ob gültige Adress
if((((unsigned int)Adress)&0xFFFFF000)!=((unsigned int)Adress))
{
KMSG("Invalid Page DIrectory Adress\n\r");
//1 Sekunde warten
timer_waitticks(100);
}
//
memset(Adress,0x00,4096);
return (struct Paging_PageDirectory*)Adress;
};
/*
Fügt einen Eintrag im Angebeben PageDirectory hinzu und
erstellt eine PageTable an angebener Adresse.
*/
struct Paging_PageTable* Paging_AddPageDirectoryEntry(unsigned short Entry,void* PageTableAdress,struct Paging_PageDirectory* PagingDirectory)
{
//In Directory Eintragen
PagingDirectory->PageTableAdress[Entry] = (((unsigned int)PageTableAdress) | 0x007);
//Paging Table mit 0 füllen
memset(PageTableAdress,0x00,4096);
//PageTable zurückgeben
return (struct Paging_PageTable*)PageTableAdress;
};
/*
Gibt einen Eintrag aus einem PageDirectory zurück.
*/
struct Paging_PageTable* Paging_GetPageTable(struct Paging_PageDirectory* Directory,unsigned short Entry)
{
return (struct Paging_PageTable*)((Directory->PageTableAdress[Entry]) ^ 0x007);
};
/*
Fügt einen Eintrag in eine PageTable hinzu.
*/
void Paging_AddPageTableEntry(struct Paging_PageDirectory* Directory,unsigned short DirectoryEntry,unsigned short TableEntry,void* PhysAdress)
{
struct Paging_PageTable* Table = Paging_GetPageTable(Directory,DirectoryEntry);
Table->PhysPageAdress[TableEntry] = (((unsigned int)PhysAdress) | 0x007);
};
struct Paging_PageDirectory* Directory = Paging_CreatePageDirectory(highmem_alloc());
Paging_AddPageDirectoryEntry(0,highmem_alloc(),Directory);
Paging_AddPageDirectoryEntry(768,highmem_alloc(),Directory);
//die Ersten 4 MB
int i=0;
unsigned int Phys = 0x00000000;
for(;i<1024;i++)
{
Paging_AddPageTableEntry(Directory,0,i,(void*)Phys);
Phys += 0x1000;
};
//3GB Erste Page
Paging_AddPageTableEntry(Directory,768,0,(void*)0xB8000);
Paging_SwapDirectory(Directory);
Paging_Enable();
KMSG("Paging Enabled!");
timer_waitticks(200);
char* Mem = 0xC0000000; //3 GB
char* String = "Test... Dies ist an die 3 GB Grenze geschrieben!";
for(i=0;i<strlen(String);i++)
{
*Mem = *String;
Mem++;
*Mem = KVC_White;
Mem++;
}