Lowlevel
Lowlevel => OS-Design => Thema gestartet von: zacK am 02. May 2005, 10:27
-
Juden dasch! (sprich: Guten Tag -> nix mit juden... ;)
ehm, ich wollte eigendlich mal paging coden damit ich ein anständiges gui machen kann (wegen malloc und free...etc) aber irgendwie blicke ich da nicht so ganz durch...
wenn ich nun platz für eine structur brauche -> myObj = malloc(...)... Das objekt/structur ist aber nur einige bytes gross. muss ich da ne ganze page freigeben?
oder wie oder was?
und wie mappe ich einen bereich linear?
und von wo bis wo mappt ihr...? gewisse speicherbereiche sind ja besetzt im ram.. oder?
thx4help
-
Jo, mindestens 1 Page. Sagt, mal, kann net einer mal ein Tut fürs Maga über Paging schreiben ;) Das fehlt irgendwie noch, dann hamma so die wichtigen Elemente wie MT und PAGING...
-
Hej,
besser als hier (http://www.fh-zwickau.de/doc/prmo/pmtutor/text/p_spez1.htm) kann man es garnicht erklären.
Habe auch mal versucht ein Tutorial darüber zu schreiben, aber ist mir net so gelungen, daher kann ich das o.g. Tut nur empfehlen...
Stehe bei Fragen aber gerne zur Verfügung :)
MfG GhostCoder
-
ich habe das tut/theorie zum zweiten mal gelesen und kapiere nun die adressbildung von der virtuellen/logischen adresse zur physischen...
aber wie mappe ich zum beispiel den bereich 0x7C00 - 0x7E00 linear??
thx4help
-
die Theorie denk ich is net das schwere, die Praxis eher...
Du kannst nur in 4k-Blöcken mappen, also 0x7000 nach 0x5000 oder so, aber nicht kleinere bereiche... das ganze machste, indem du in den pagetables und dem -dir die werte richtig stellst, wie sie sein sollen, inkl. den bits...
-
ja dass ist schon klar...
aber wie mappe ich dann halt den beriech 0x7000 nach 0x8000? wo schreibe ich nund die 0x7000 rein?
das ist mir vollkommen unklar.. :(
-
Also. Du hast ja Pagetables und ein Pagedir. In dem Pagedir gibste die Pagetables an. In der 1. Pagetable brauchste nun den 7. eintrag weil, denn die eintragnummer = adresse / 0x1000. ein eintrag ist ja 4 bytes lang, sprich du musst bei dem 7*4 = 28. Byte das hinschreiben. Und da musste eben 0x8000 hinschreiben (die physische adresse) und die bits setzen.
dann landet alles, was du an 0x7000 schreibst an phys. 0x8000...
J!N
-
Falls die Frage mit der 4kb Seite für eine Struktur im Raum steht -
du wirst natürlich in eine 4kb Speicherseite mehr als eine Struktur packen (wenn die Struktur nicht zu gross ist ;) ).
Deswegen gibt es generell immer zwei Instanzen zur Speicherverwaltung.
Der Kernel gibt 4kb Seiten an die Anwendungen raus, und in der Anwendung (in der eigentlich malloc implementation) werden diese 4kb Seiten noch mal unterteilt!
-
vielen dank für die antworten!
nun ist mir einiges klar geworden.
aber könnte ich nun im ganzen pagedir die einträge auf die pagetables setzten dann aber bei den pagetables den eintrag auf auf "ungesetz machn"... dann hätte ich nichts mehr mit dem pagedir zu tun...
:D
sonst ist mir die logarythmik (<- deutsch auch) nicht so klar...
-
das FH-Zwickau Tut ist zawr ganz gut, aber da fehlt noch wichtiges^^ Z.B. die 4MB Pages (die es erst ab dem Pentium gibt)
Und auch das ganze mit dem U/S-Bit geht irgendwie total unter. Manchmal liegts an diesem Bit das nix geht weil man seinem Kernel die Ausführung verweigert dadurch^^
-
könnte mir jemand einen pseudo-code geben? ich raffe die logarythmik nicht... :(
-
Das ganze hat mit Logarythmen nix zu tun^^ eher Algorithmen *g*
-
auch gut ;)
-
@Legend: Oder du machst es (wie ich) nach dem "hol dir was du brauchst" Prinzip ohne malloc, sondern, dass die Exceptions den Speicher verteilen...
-
Stimmt, das funktioniert natürlich, aber damit wirst halt jeglichen Fehler in der Speicherhandhabung eines Programmes gleich mit legalisieren! ;)
Aber die Diskussion hatten wir schonmal ...
-
@Legend: jo, die hatten wir schonmal
@ZacK: läufts jetzt? welche methode nimmst du?
-
bei mir geht das Tutorial nich auf. "You have no Permission to access..."
Wo gibt es das noch? Oder kann jemand das als PDF zur Verfügung stellen?
mfg
hackgod
-
nun um erlich zu sein habe ich kein plan was für methoden das sind...
bin noch nicht weiter gekommen da ich in letzter zeit fasst keine (richtige) freizeit hatte... :(
-
so, mal wieder zeit.
ich bin nun bei der umsetzung von paging.
könnte mir jemand meine berechnungen bestätigen.
angenommen ich habe ne funktion setPage(physische Adresse, Virtuelle Adresse, Berechtigungen). Dann würde ich dass so ausrechnen.
physAdr / 4mb = PagingDirectory-Eintrag.
physAdr / 4kb = PagingTable-Eintrag.
stimmt das so?
kann ich die Adressen der PagingTables in das PagingDirectroy schon zu beginn eintragen?
thx for help... ^^
me = verwirrt...
-
physAdr / 4 MB für die table würde stimmen, physAdr / 4 KB für die page stimmt nur für die erste Pagetable.
Du kannst das ganz folgendermassen berechnen:
table = physical >> 22;
page = ( ( physical & 0xFFFFF000 ) << 10 ) >> 22;
-
Naja eigentlicht ists völlig falsch, die virtuelle zeigt ja auf die physische. Also wird Dir und Page aus der Virtuellen errechnet und nicht aus der Physischen
dir=virt>>22;
page= (virt>>12)&0x3FF;
-
aber ich will ja berechnen an welcher stelle ich die virtelle adresse in die table einschreiben muss...
-
Das ist ja die Berechnung gewesen:
Die Nummer der Pagetable kriegst du folgendermassen heraus:
table = addresse >> 22;
Die Nummer der Page innerhalb der Table kriegst du so heraus:
page = ( ( addresse & 0xFFFFF000 ) << 10 ) >> 22;
oder
page= ( addresse >>12)&0x3FF;
wie Roshl schon gesagt hat
Sieht dir mal im PM Tutorial an, wie die Addresse beim Paging aufgelöst wird, da steht drinnen warum man das so berechnet ;D
-
oky doky!
thx...
teste das mal...
-
Du schreibst ja nicht die virtuelle Addi in die Tabelle^^ wenn man das so machen würde könnten Virtuelle Addressen ja mehrfach eingetragen werden und das geht schief. Der Prozessor kann ja dann nicht wissen welche er nehmen soll. Deswegen ist das falsch^^
-
ja net die virtuellen aber die logischen?! oda? :)
-
Nein die physischen, die logischen sind das, was rauskommt wenn die Adressangabe durch die GDT geschleift wurde
-
ok... i'm pileing.. :D
muss ma noch mal paging docs lesen und dann ans implementieren machen...
thx