Lowlevel

Lowlevel => OS-Design => Thema gestartet von: zacK am 02. May 2005, 10:27

Titel: Paging
Beitrag 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
Titel: Paging
Beitrag von: joachim_neu am 02. May 2005, 13:13
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...
Titel: Paging
Beitrag von: GhostCoder am 02. May 2005, 15:52
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
Titel: Paging
Beitrag von: zacK am 02. May 2005, 16:50
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
Titel: Paging
Beitrag von: joachim_neu am 02. May 2005, 17:04
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...
Titel: Paging
Beitrag von: zacK am 02. May 2005, 17:17
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.. :(
Titel: Paging
Beitrag von: joachim_neu am 02. May 2005, 18:25
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
Titel: Paging
Beitrag von: Legend am 02. May 2005, 20:29
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!
Titel: Paging
Beitrag von: zacK am 03. May 2005, 09:00
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...
Titel: Paging
Beitrag von: Roshl am 03. May 2005, 11:39
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^^
Titel: Paging
Beitrag von: zacK am 03. May 2005, 12:04
könnte mir jemand einen pseudo-code geben? ich raffe die logarythmik nicht... :(
Titel: Paging
Beitrag von: Roshl am 03. May 2005, 12:15
Das ganze hat mit Logarythmen nix zu tun^^ eher Algorithmen *g*
Titel: Paging
Beitrag von: zacK am 03. May 2005, 12:18
auch gut ;)
Titel: Paging
Beitrag von: joachim_neu am 03. May 2005, 17:23
@Legend: Oder du machst es (wie ich) nach dem "hol dir was du brauchst" Prinzip ohne malloc, sondern, dass die Exceptions den Speicher verteilen...
Titel: Paging
Beitrag von: Legend am 04. May 2005, 16:49
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 ...
Titel: Paging
Beitrag von: joachim_neu am 05. May 2005, 00:51
@Legend: jo, die hatten wir schonmal
@ZacK: läufts jetzt? welche methode nimmst du?
Titel: Paging
Beitrag von: hackgod am 08. May 2005, 13:32
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
Titel: Paging
Beitrag von: zacK am 09. May 2005, 16:30
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... :(
Titel: Paging
Beitrag von: zacK am 26. May 2005, 16:27
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...
Titel: Paging
Beitrag von: SSJ7Gohan am 26. May 2005, 17:05
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;
Titel: Paging
Beitrag von: Roshl am 26. May 2005, 17:45
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;
Titel: Paging
Beitrag von: zacK am 26. May 2005, 21:57
aber ich will ja berechnen an welcher stelle ich die virtelle adresse in die table einschreiben muss...
Titel: Paging
Beitrag von: SSJ7Gohan am 26. May 2005, 22:20
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
Titel: Paging
Beitrag von: zacK am 27. May 2005, 09:25
oky doky!
thx...
teste das mal...
Titel: Paging
Beitrag von: Roshl am 27. May 2005, 12:02
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^^
Titel: Paging
Beitrag von: zacK am 30. May 2005, 08:45
ja net die virtuellen aber die logischen?! oda? :)
Titel: Paging
Beitrag von: Roshl am 30. May 2005, 09:19
Nein die physischen, die logischen sind das, was rauskommt wenn die Adressangabe durch die GDT geschleift wurde
Titel: Paging
Beitrag von: zacK am 30. May 2005, 10:11
ok... i'm pileing.. :D
muss ma noch mal paging docs lesen und dann ans implementieren machen...
thx