1
Lowlevel-Coding / Re: Problem beim Paging implementieren
« am: 12. October 2006, 17:35 »
Ah, die Instuktion kannte ich nichtmal. Vielen Dank! Habs gleich implementiert, jetzt gehts auch ohne CR3-Rewrite.
23. November 2024, 11:54
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.
POINTER OpenPhysMemory(POINTER physAddress);
sei eine Funktion, die nen Pointer (unsigned int *) zurückliefert im Virtuellen Adressraum und vorher einen Pagetable-Eintrag gemacht hat hinter dem die gewünschte physikalische Adresse steht (physAddress).UINT32 *myScreen = OpenPhysMemory((UINT32*) 0xB8000);
*myScreen = 'A';
wunderbar, auf dem Bildschirm kommt oben in der Ecke ein A!UINT32 *myScreen = OpenPhysMemory((UINT32*) 0x123456);
*myScreen = 42;
myScreen = OpenPhysMemory((UINT32*)0xB8000);
*myScreen = 'A';
Ich schreibe also vorher an eine andere Adresse, dann erst auf den Bildsch. Dazu muss man sagen, dass OpenPhysMemory immer dieselbe virtuelle Adresse nimmt. Nun kommt nichts mehr auf dem Bildschirm an, vielmehr schreibt an die vorher gemappte Adresse 0x123456! POINTER OpenPhysMemory(POINTER physAddress) {
...
ProcessorWriteCR3(ProcessorReadCR3());
}
Das kanns ja aber wohl bitte nicht sein?!?! Das muss doch anders gehen...?!
POINTER VirtualAlloc(UINT32 *pageDirectory, UINT32 reqAllocSize, UINT32 *physAddress, UINT32 Attributes) {
UINT32 reservedVirtAddress;
UINT32 tmpFreeVirtAddress;
UINT32 pageCount = reqAllocSize>>PAGE_BITS;
/* genug phys. Speicher frei? */
if (memFree < reqAllocSize) {
return NULL;
}
/* ist genug virtueller Frei? */
tmpFreeVirtAddress = FindFreeVirtMem(pageDirectory, pageCount);
if (tmpFreeVirtAddress == 0) {
/* no, it isn't */
return NULL;
}
/* jap, also (zufällige) phys. Speicher auf den virtuellen lin. mappen */
reservedVirtAddress = tmpFreeVirtAddress;
while (pageCount--) {
*physAddress = GetFreePhysChunk();
MapPhysToVirt(pageDirectory, reservedVirtAddress, *physAddress, Attributes);
reservedVirtAddress += PAGE_SIZE;
}
return (tmpFreeVirtAddress);
}