Autor Thema: Mapping/Paging  (Gelesen 7964 mal)

d00m

  • Beiträge: 6
    • Profil anzeigen
Gespeichert
« am: 24. December 2004, 23:51 »
Hi.
Ich hab schon in einigen foren gesucht und auch schon einige tuts gesucht, leider bis jetzt ohne erfolg.
Es geht, wie der Titel es schon sagt, ums mappen.
Ich habe den sinn und alles verstanden, aber habe leider keine ahnung, wie ich das in mein "os" "reinbringe"
ich wollte mal fragen, ob mit da vieleicht jemand ein tip dazu geben kann oder gar eine art tutorial hat.
Bin für jeden hilfe dankbar.
Cya.

joachim_neu

  • Beiträge: 1 228
    • Profil anzeigen
    • http://www.joachim-neu.de
Gespeichert
« Antwort #1 am: 25. December 2004, 09:33 »
RM? PM? FRM?
http://www.joachim-neu.de | http://www.orbitalpirates.de | http://www.middleageworld.de

System: 256 RAM, GeForce 2 MX 400, AMD Athlon XP 1600+, Windows XP, 1x Diskette, 1x DVD-ROM, 1x CD-R(W) Brenner,...

d00m

  • Beiträge: 6
    • Profil anzeigen
Gespeichert
« Antwort #2 am: 25. December 2004, 16:33 »
Im oment läuft alles im PM.
Habe mein kernel in c geschrieben, aber, klar, wäre egal, ob ichs nu in asm oder c machen würd.
hoffe nur, das ich das mal hinbekomme :)

TeeJay

  • Beiträge: 630
    • Profil anzeigen
    • http://www.jay-code.de
Gespeichert
« Antwort #3 am: 25. December 2004, 17:53 »
Also wenn du es ganz genau wissen willst, solltest du dir das Intel Manuel des Pentium mal anschauen. Gibts bei Intel gratis als PDF.

Da steht genau drin wie das Paging funzt und wie man das aktiviert und benutzt.
Allerdings sind gute Englischkenntnisse erforderlich.
----------------------
Redakteur bei LowLevel

Jidder

  • Administrator
  • Beiträge: 1 625
    • Profil anzeigen
Gespeichert
« Antwort #4 am: 25. December 2004, 21:15 »
Dieser Text wird unter jedem Beitrag angezeigt.

GhostCoder

  • Beiträge: 187
    • Profil anzeigen
Gespeichert
« Antwort #5 am: 26. December 2004, 12:35 »
Hiho,

ich habs hiermit gelernt:
http://www.fh-zwickau.de/doc/prmo/start.htm

MfG GhostCoder
A man, a legend!

d00m

  • Beiträge: 6
    • Profil anzeigen
Gespeichert
« Antwort #6 am: 26. December 2004, 18:10 »
danke erstmal an alle.
es ist so, das ich nun urch verschiedene user und tutorials genau, wie ich denke, verstanden hab, wie das paging angewendet wird uns so.
aber mien problem ist einfach, das ich keien ahnugn, hab, wie ich meine wissen umsetze. es ist mir soweit klar, das ich erst das paging directory und die paging table anlegen muss.
wenn cih weiß, an welcher adresse im speicher die tabelle is, speichere ich diese adresse ins cr3 register.
und schalte danach das paging ein, indem ich cr0 auf 80000000h setze, also, das bit31 anschalte.
aber dann wars das auch scon, was ich bzgl. praxis weiß, bzw. der umsetzung.

GhostCoder

  • Beiträge: 187
    • Profil anzeigen
Gespeichert
« Antwort #7 am: 26. December 2004, 18:26 »
Hiho,

das war es ja auch schon mit Paging...

Wenn Paging an ist, kannst du dann ja mittels den PageTables und den passenden Einträgen jede Page an beliebige Stelle mappen. Sinvoll ist das natürlich erst, wenn ud Multitasking am laufen hast (beides kombiniert ist echt ne sche** Kombination :) ), damit jeder Prozess seinen eigenen Addressraum hat.

Zur Umsetzung:
Musst du Macros schreiben, die in ein DWORD Array die passenden Bits setzen, und die dann passend anwenden.. Was soll man sonst sagen??? :)

Wenn du Interesse hast, kann ich ja mal den neusten Source meines Kernels hochladen, da läuft eigentlich alles...

MfG GhostCoder
A man, a legend!

d00m

  • Beiträge: 6
    • Profil anzeigen
Gespeichert
« Antwort #8 am: 26. December 2004, 18:45 »
[edit]
ok, mein paging läuft nun, denke ich, soweit.
Ich kann, so wies aussioeht, auch wärend der lafuzeit, mittels einer Funktion, neue Page_Directorys erstellen.
Nun hab ich aber noch ein Frage.
Wie kann ich ein solches Page_Diurectory wieder löschen?
hab das mit dem erstellen so:


int PageIndex=0;
void Insert_Page-Directory(void)
{
unsigned int i;
// 4MB mappen
PageIndex++;
for(i=0; i<1024; i++)
{
page_table[i] = address | 3; // Superuser-level, read/write, present
address = address + 4096; // 4096 = 4kb
}
page_directory[PageIndex] = page_table; // Superuser-level, read/write, present
page_directory[PageIndex] = page_directory[PageIndex] | 3;
printf("New page created.\n");
}

PageIndex habe ich auf 0, bzw im code PageIndex++, da ich in der Pageing_Init() funktion, Page_Directory[0] an sich schon erstelle.
Aber wie schon gesagt, wie löscht man so ein Page_Directory? ich meine, ich kann beim löschen int PageIndex-- rechnen, dann habe ich aber trotzdem die erstellte Page_Directory.

GhostCoder

  • Beiträge: 187
    • Profil anzeigen
Gespeichert
« Antwort #9 am: 27. December 2004, 16:43 »
Hiho,

du meinst PageTables! Du hast 1 Pagedirectory (Addresse in cr3), das hat 1024 Pagetables, und jeder dieser Tables hat 1024 Einträge.

Was meinst du mit löschen?

Wenn du z.B. die ersten 4mb nicht mehr mappen willst, setzt du im PageDirectory das erste DWORD auf null. Schon kann man nicht mehr zugreifen...

Wenn du den Speicher meinst, musst du ja erstmal einen Memory Manager haben, der sich um alle physischen Pages kümmert. Ob du sowas hast, keine Ahnung... :)

MfG GhostCoder
A man, a legend!

d00m

  • Beiträge: 6
    • Profil anzeigen
Gespeichert
« Antwort #10 am: 27. December 2004, 20:16 »
oh :)
naja, hab ich noch nciht, also wird das dann alles von malloc() und free() gemacht, ok, die hab ich ja noch nicht, kommen erst als nächstes dran :)

GhostCoder

  • Beiträge: 187
    • Profil anzeigen
Gespeichert
« Antwort #11 am: 28. December 2004, 13:34 »
Hiho,

nee... malloc und free sollten Userlevel Funktionen sein. Ich meinte einen Blockallocator, der nichts anderes macht als sich darum zu kümmern, ob eine physiche Page frei oder belegt ist. Und natürlich Funktionen bereitstellt, um eine freie Page zu finden usw...

MfG GhostCoder
A man, a legend!

 

Einloggen