Hiho,
ich hab mir mal nen paar Paging Makros gemacht, die mir enorm helfen. Hier falls jmd. Interessiere hat:
PopPage ist ne Funktion um eine freie Page zu holen...
Vielleicht hilft es ja jemandem! Ich hätte mich damals über solche Funktionen gefreut
MfG GhostCoder
ich hab mir mal nen paar Paging Makros gemacht, die mir enorm helfen. Hier falls jmd. Interessiere hat:
Code: [Auswählen]
// x86 page flags
#define PAGE_PRESENT 1
#define PAGE_WRITE 2
#define PAGE_SUPERVISOR 4
#define PAGE_WRITETHROUGH 8
#define PAGE_CACHEDISABLE 16
#define PAGE_ACCESSED 32
#define PAGE_DIRTY 64
#define PAGE_USED 512
// Do not touch these! :)
#define GetPageTableFlags(d,t) ( ((DWORD*)d)[t] & 0xFFF )
#define SetPageTableFlags(d,t,f) ( ((DWORD*)d)[t]=(((DWORD*)d)[t] & 0xFFFFF000) | (f & 0xFFF) )
#define GetPageTableOffset(d,t) ( ((DWORD*)d)[t] & 0xFFFFF000 )
#define SetPageTableOffset(d,t,o) ( ((DWORD*)d)[t]=(((DWORD*)d)[t] & 0xFFF) | (o & 0xFFFFF000) )
#define GetPageTableEntryFlags(d,t,e) ( ((DWORD*)(((DWORD*)d)[t] & 0xFFFFF000))[e] & 0xFFF )
#define SetPageTableEntryFlags(d,t,e,f) ( ((DWORD*)(((DWORD*)d)[t] & 0xFFFFF000))[e]=(((DWORD*)(((DWORD*)d)[t] & 0xFFFFF000))[e] & 0xFFFFF000) | (f & 0xFFF) )
#define GetPageTableEntryOffset(d,t,e) ( ((DWORD*)(((DWORD*)d)[t] & 0xFFFFF000))[e] & 0xFFFFF000 )
#define SetPageTableEntryOffset(d,t,e,o) ( ((DWORD*)(((DWORD*)d)[t] & 0xFFFFF000))[e]=(((DWORD*)(((DWORD*)d)[t] & 0xFFFFF000))[e] & 0xFFF) | (o & 0xFFFFF000) )
// Beispielcode um die ersten 4mb linear zu mappen, sowie 0xA0000 auf 0xB8000 (zum testen)
UINT dir=PopPage()*PAGE_SIZE;
UINT tab=PopPage()*PAGE_SIZE;
for(i=0;i<1024;i++)
{
SetPageTableFlags(dir,i,0);
SetPageTableOffset(dir,i,0);
}
SetPageTableFlags(dir,0,PAGE_PRESENT | PAGE_WRITE);
SetPageTableOffset(dir,0,tab);
for(i=0;i<1024;i++)
{
SetPageTableEntryFlags(dir,0,i,PAGE_PRESENT | PAGE_WRITE);
SetPageTableEntryOffset(dir,0,i,i*PAGE_SIZE);
}
SetPageTableEntryOffset(dir,0,0xA0,0xB8*PAGE_SIZE);
// Enable paging
asm("mov %0,%%eax\n\t"
"mov %%eax,%%cr3\n\t"
"mov %%cr0,%%eax\n\t"
"or $0x80000000,%%eax\n\t"
"mov %%eax,%%cr0\n\t"
"mov $0x10,%%ax\n\t"
"mov %%ax,%%ds\n\t"
"mov %%ax,%%es\n\t"
"mov %%ax,%%fs\n\t"
"mov %%ax,%%gs\n\t"
"mov %%ax,%%ss\n\t"
::"m"(dir) );
PopPage ist ne Funktion um eine freie Page zu holen...
Vielleicht hilft es ja jemandem! Ich hätte mich damals über solche Funktionen gefreut

MfG GhostCoder

Übersicht
Wiki
Hilfe
Suche
Einloggen
Registrieren
Drucken

Gespeichert


