1 / 11

VP1

MMU-Konfiguration für Prozess P1. Physical Memory. MMU. Virtual Memory von P1. PP1.3. PP2.3. PP1.2. VP3. PP6. VP3. PP2.2. VP2. PP4. VP2. PP2.1. VP1. PP1. VP1. PP1.1. MMU-Konfiguration für Prozess P2. Physical Memory. MMU. Virtual Memory von P2. PP1.3. PP2.3. PP1.2.

kisha
Download Presentation

VP1

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. MMU-Konfiguration für Prozess P1 Physical Memory MMU Virtual Memory von P1 PP1.3 PP2.3 PP1.2 VP3 PP6 VP3 PP2.2 VP2 PP4 VP2 PP2.1 VP1 PP1 VP1 PP1.1

  2. MMU-Konfiguration für Prozess P2 Physical Memory MMU Virtual Memory von P2 PP1.3 PP2.3 PP1.2 VP3 PP5 VP3 PP2.2 VP2 PP3 VP2 PP2.1 VP1 PP2 VP1 PP1.1

  3. Pipe registrieren P2 Virtual Memory von P1 Kernel registerPipe(myPipe) „myPip“ p* (VP1) … … … … VP3 VP2 VP1 MMU-Konfiguration für Prozess P2 PP1.3 MMU PP2.3 PP1.2 PP5 VP3 PP2.2 PP3 VP2 PP2.1 PP2 VP1 PP1.1

  4. P2  Pipe(P1) P1 P2

  5. Kernel writeToPipe(„myPipe“, *data) P1 „myPip“ p* (VP1) … … … … VP3 VP2 VP1 data Physical Memory MMU-Konfiguration für Prozess P1 PP1.3 MMU PP2.3 PP1.2 VP3 PP6 PP2.2 VP2 PP4 PP2.1 VP1 PP1 PP1.1 data

  6. P1 VoidwriteToPipe(String name, byte* data) { Pipe* curPipe = getPipe(name); curPipe->write(data); } VP3 VP2 VP1 data P2 Aktuelle MMU-Konfiguration (P1) PP1.3 VP3 MMU PP2.3 VP2 PP1.2 VP1 VP3 PP6 PP2.2 VP2 PP4 PP2.1 VP1 PP1 PP1.1 data

  7. adaptMMU(…):sucht eine leere Page, fügt einen Eintrag in die MMU ein, welcher auf den physischen Speicher der Pipe zeigt. Sie returniert einen Pointer innerhalb der neuen Page mit dem selben page-offset wie der curPipe -pointer hatte. VoidwriteToPipe(String name, byte* data) { Pipe* curPipe = getPipe(name); intownerPID = getOwner(name); curPipe = adaptMMU(curPipe, owner); curPipe->write(data); } P1 Aktuelle MMU-Konfiguration (P1) MMU PP1.3 PP2.3 VP4 VP4 PP2 PP1.2 VP3 VP3 PP6 PP2.2 VP2 VP2 PP4 PP2.1 VP1 VP1 PP1 PP1.1 data

  8. SonderFall: Pipe erstreckt sich über mehrere Pages • die Pipe besteht aus einem zusammenhängenden Array •  Array kann sich nur über benachbarte Pages erstrecken??? • Wo liegen die Read bzw. Write-Pointer (Member-Variablen)??? • direkt davor? • direkt danach? P2 • adaptMMU • muß nun alle beteiligten Pages eintragen -> wieder relativ zum neuen Basis-PointercurPipe • wie stellt adaptMMU fest auf wie vielen Pages die Pipe liegt? • [pPage + length*sizeof(char) + 2*sizeof(int)] / PAGE_SIZE •  aufrunden ??? • liegen die Member wirklich unmittelbar vor/nach dem Array? VP5 VP4 VP3 VP2 VP1

  9. Neuen Speicher reservieren Der Kernel verwaltet eine Pyhsical Memory Table in der festgehalten wird, welche physikalischen Pages von welchen Prozessen belegt werden, bzw. welche nicht verwendet werden. Kernel Physical Memory Table PP1 P1 PP2 [free] PP3 P2 PP4 [free] PP5 P1 … …

  10. Neuen Speicher reservieren • Allokiert ein Prozess neuen Speicher (new/ malloc), dann wird ihm eine virtuelle Adresse geliefert, welche genug Platz innerhalb des virtuellen Speichers bietet. • newlibc verwaltet den virtuellen Speicher • newlibc verwendet beim allokieren virtuelle adressen in pages, die möglicherweise noch gar kein mapping zu physikalischen pages haben. Wird in einer neuen virtuellen Page abgelegt char* pData = newchar[255]; P1 Aktuelle MMU-Konfiguration (P1) MMU PP1.3 PP2.3 ??? VP4 PP1.2 VP3 VP3 PP6 PP2.2 VP2 VP2 PP4 PP2.1 VP1 VP1 PP1 PP1.1

  11. Beim ersten Zugriff auf pData, welcher in einer „neuen“ virtuellen Page liegt, wird das auflösen durch die MMU fehlschlagen (Page-miss).  Prozess benötigt neue physikalische Page • voidreserveNewPage(int PID, intvPage) { • intphysPage = getFreePage(); //returniert Index einer nicht // benutzten page • markPageReserved(physPage, PID); // markiert PID als besitzer von //physPage (Physical Memory Table) • addMMUEntry(PID, vPage, physPage); // fügt einen Eintrag die MMU- //Tabelle von PID ein. • }

More Related