Autor Thema: Paging Code  (Gelesen 5054 mal)

GhostCoder

  • Beiträge: 187
    • Profil anzeigen
Gespeichert
« am: 23. November 2004, 15:47 »
Hiho,

ich hab mir mal nen paar Paging Makros gemacht, die mir enorm helfen. Hier falls jmd. Interessiere hat:


// 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
A man, a legend!

lobmann

  • Beiträge: 243
    • Profil anzeigen
    • http://www.fallek.de.vu
Gespeichert
« Antwort #1 am: 23. November 2004, 16:25 »
mir z.B. thx ;)
Man kann doch nem alten Mann nicht in den Bart spucken und sagen es hat geschneit

clemensoft

  • Beiträge: 92
    • Profil anzeigen
    • http://www.clemensoft.de
Gespeichert
« Antwort #2 am: 21. March 2005, 22:21 »
Mal schaun

 

Einloggen