Paging und Filesysteme verstehen
-
Hi,
ich schreibe gerade an einem OS(ok, was soll ich sonst tun, wenn ich mich hier melde) nach dem Lowlevel- Tutorial und verstehe 2 Sachen nicht.
1. Wie funktioniert den jetzt Paging und was genau muss ich dazu implementieren?
2. Wie greife ich dann mit Treibern auf Festplatten, CDs und DVDs zu und greife dann aufs Dateisystem zu?Ich hoffe ihr könnt mir helfen. Beim Paging bin ich soweit, das er das Paging aktiviert und die Page Tables und so aufsetzt.
- IdeCMOS
PS: ich habe vor kurzem meinen PC mit Windows 7 neu installiert und konnte bis jetzt noch nichtmal Updates machen. Also bitte nicht böse sein, wenn ich jetzt nichts Ausprobieren kann.
-
Wie funktioniert den jetzt Paging und was genau muss ich dazu implementieren?
http://henkessoft.de/OS_Dev/OS_Dev2.htm#mozTocId918986
http://wiki.osdev.org/Paging
http://en.wikipedia.org/wiki/Paging
http://de.wikipedia.org/wiki/Paging
http://www.intel.com/content/www/us/en/processors/architectures-software-developer-manuals.htmlDer Begriff "Paging" bezeichnet den Vorgang der Abbildung (Mapping) von virtuellen Adressen auf physische Adressen. Programmcode oder Daten befinden sich in diesem Umfeld also gleichzeitig an einer physischen und einer virtuellen Adresse. Beide können hierbei deckungsgleich (identisch) sein oder verschieden (wichtig für das swapping).
Bei einem 32-Bit-Prozessor umfassen die theoretisch möglichen Adressen insgesamt 4 GB = 2^32 Byte. Die Realisierung des Pagings erfolgt durch Zerlegung dieses Adressraums in viele kleine "Pages" (Seiten). Die Verwaltung erfolgt durch das Page Directory Base Register (PDBR), das als "Kontrollregister cr3" geführt wird.
Baumstrukturen von Tabellen und Zeigern (Adressvariablen) führen über das Page Directory (PD) und Page Tables (PT) zu Pages weiter, die mit Hilfe des Offsets in einer konkreten physischen Adresse münden (siehe Bild unten). Eine hervorragende Darstellung dieser Zusammenhänge mit ausführlichen Erklärungen und einem konkreten Rechenbeispiel findet sich hier.
-
Wie greife ich dann mit Treibern auf Festplatten, CDs und DVDs zu und greife dann aufs Dateisystem zu?
Dazu benötigt ein OS verschiedene Module, die sich um Devicemanagement, Busmanagement (z.B. usb) und Treiber für die einzelnen Medien (z.B. usb-Sticks oder Festplatten) kümmern. Der Zugriff auf den Speicher erfolgt entweder virtuell (z.B. auf dem Kernel- oder User-Heap oder im MMIO) oder für direkte Hardwarezugriffe (z.B. durch den xHCI) auch mit der physischen Adresse, die man durch eine im Paging-Modul befindliche Funktion erhält.
Beispiel (aus PrettyOS):
uintptr_t paging_getPhysAddr(void* virtAddress) { pageDirectory_t* pd = kernelPageDirectory; // Find the page table uint32_t pageNumber = (uintptr_t)virtAddress / PAGESIZE; pageTable_t* pt = pd->tables[pageNumber/PAGE_COUNT]; if (pt) { // Read the address, cut off the flags, append the odd part of the address return ((pt->pages[pageNumber % PAGE_COUNT] & 0xFFFFF000) + ((uintptr_t)virtAddress & 0x00000FFF)); } else { return (0); // not mapped } }
Wenn Du diese Funktion im Detail verstehst, dann hast Du auch Paging verstanden.
-
Hallo,
Danke für deine Schnelle Antwort, mit dem Code kann ich gut umgehen, ich habe den auch soweit verstanden. die Links, habe ich noch nicht angeschaut, sieht aber so aus als würden alle bei mir gehen. Muss ich jetzt nur noch ausprobieren. Da ich zurzeit noch auf der Arbeit bin, geht das jetzt gerade schlecht. und zum Glück haben wir gestern erst unsere WLAN- Passwörter gekriegt. Sobald ich die Links mal durckgeschaut habe melde ich mich wieder.- IdeCMOS
-
schau dir dabei diese Grafik an:
http://henkessoft.de/OS_Dev/Bilder/PD_PT_Pages_Frames_Bitset.PNG
Da hast Du alles auf einen Blick, auch das Bitset.
-
Das hab ich jetzt auch alles verstanden. wie sage ich aber jetzt meinem OS, dass ich ein programm an die virtuelle Adresse 2MB laden will. Ich habe jetzt nur eine vmm_alloc, die die Page Table als parameter nimmt und die Anzahl der pages. Wie mache ich das den jetzt.
-
Das ist wieder ein extra Thema, das "Laden", Analysieren und "Ausführen" von Programmen im User-Bereich.
Schau Dir dazu bitte
void elf_prepareExecution(const void* file, size_t size, pageDirectory_t* pd)*
im Modul elf.c und
FS_ERROR executeFile(const char path, size_t argc, const char* argv[], bool ownConsole)*
im Modul executable.c an.
-
Entschuldige das ich erst jetzt meine Antwort schreibe. Ich hab mal versucht weiter das auf eigene Faust zu lösen, bin aber gescheitert. jetzt versuche ich wirklich mal deinen Code dazu zu studieren. Ich werde mich jetzt aber ransetzten und meine Idee einer Community vorstellen. Ich danke dir sehr für deine Hilfe.
- IdeCMOS
-
wie steht's?