PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Zeiger und Segmente im PM


[MM]
22.07.2004, 18:46
Hallo.

Ich habe mich gefragt, wie in einer höheren 32 Bit Programmiersprache der Compiler weiß, auf welches Segment sich ein Pointer bezieht. Die Leute im C/C++ Forum sagen, dass jeder Task seinen eigenen linearen Adressraum dank des Pagings hat, aber ich kann mir nicht vorstellen, dass Code, Daten und Stack bei einem 32 Bit Betriebssystem in einem gemeinsamen linearen Adressraum liegen.

Hat da jemand eine Ahnung?


Vellas
23.07.2004, 14:30
Hi!

']Hallo.

Ich habe mich gefragt, wie in einer höheren 32 Bit Programmiersprache der Compiler weiß, auf welches Segment sich ein Pointer bezieht. Die Leute im C/C++ Forum sagen, dass jeder Task seinen eigenen linearen Adressraum dank des Pagings hat, aber ich kann mir nicht vorstellen, dass Code, Daten und Stack bei einem 32 Bit Betriebssystem in einem gemeinsamen linearen Adressraum liegen.

Hat da jemand eine Ahnung?

Also ich habe mal im Buch nachgesehen. Im PM wird der Abreitsspeicher über Tabellen verwaltet. Es gibt 2 dieser Tabellen. Einmal die GDT (Global Descriptor Table) und die LTD (Local Descriptor Table). Die LTD existiert für jeden Prozess. In dieser werden die Adressen der einzelnen Segmente gespeichert, somit enthalten die Segmentregister im PM nicht mehr die direkte Basisadresse, sondern einen Verweis auf den entsprechenden Eintrag in der LTD.
Ein solcher verweis nennt sich Selektor. Die Segmentregister des RM (CD, DS, SS, usw...) werden damit zu Selektorregistern des PM.

Wenn du mehr wissen willst, solltest du dir ein Buch kaufen. Zum Paging selbst und wie es funktioniert steht hier auch noch etwas. Dazu sage ich nur das die Pages mit Hilfe von Page-Tables verwaltet werden, die über jeden "Bruchstück" des Segments buchführen. Aber wenn dich das alles interessiert hol dir ein mal ein Buch wo sowas auch mal graphisch dargstellt ist.

Ich habe die Infos aus dem Buch "Assembler - Die Profireferenz" vom franzisverlag (www.franzis.de). Bestellen lohnt sich aber eher, wenn du das Bundle kaufst, also mit dem Buch "Assembler Programmierung", da es wesentlich mehr kostet beide einzeln zu kaufen.


Code-Hacker

[MM]
23.07.2004, 19:44
Ich habe bereits ein Buch über Echtzeit Multitasking. Und kenne mich durchaus sehr gut im PM aus. Es geht mir nur darum, wie das Problem in einer Sprache wie C gelöst ist, nicht wie der PM funktioniert.

Baegsch
24.07.2004, 16:44
']Die Leute im C/C++ Forum sagen, dass jeder Task seinen eigenen linearen Adressraum dank des Pagings hat, aber ich kann mir nicht vorstellen, dass Code, Daten und Stack bei einem 32 Bit Betriebssystem in einem gemeinsamen linearen Adressraum liegen.
Was ist so schwer daran? In deinen 32Bit-adressierten Adressraum bekommst du einige Pages. Dann jede Page ihre eigenen Zugriffsrechte und fertig ists (grob *g*).
08048000-0804a000 r-xp 00000000 03:01 49473 /bin/cat
0804a000-0804b000 rw-p 00001000 03:01 49473 /bin/cat
0804b000-0804f000 rwxp 00000000 00:00 0
40000000-40016000 r-xp 00000000 03:01 81638 /lib/ld-2.2.3.so
40016000-40017000 rw-p 00015000 03:01 81638 /lib/ld-2.2.3.so
40017000-40018000 r--p 00000000 03:01 317 /usr/share/locale/en_US/LC_IDENTIFICATION
40018000-40019000 r--p 00000000 03:01 316 /usr/share/locale/en_US/LC_MEASUREMENT
40019000-4001a000 r--p 00000000 03:01 315 /usr/share/locale/en_US/LC_TELEPHONE
4001a000-4001b000 r--p 00000000 03:01 314 /usr/share/locale/en_US/LC_ADDRESS
4001b000-4001c000 rw-p 00000000 00:00 0
4001c000-4012f000 r-xp 00000000 03:01 81637 /lib/libc-2.2.3.so
4012f000-40136000 rw-p 00112000 03:01 81637 /lib/libc-2.2.3.so
40136000-4013b000 rw-p 00000000 00:00 0
4013b000-4013c000 r--p 00000000 03:01 313 /usr/share/locale/en_US/LC_NAME
4013c000-4013d000 r--p 00000000 03:01 312 /usr/share/locale/en_US/LC_PAPER
4013d000-4013e000 r--p 00000000 03:01 311 /usr/share/locale/en_US/LC_MESSAGES/SYS_LC_MESSAGES
4013e000-4013f000 r--p 00000000 03:01 309 /usr/share/locale/en_US/LC_MONETARY
4013f000-40145000 r--p 00000000 03:01 308 /usr/share/locale/en_US/LC_COLLATE
40145000-40146000 r--p 00000000 03:01 307 /usr/share/locale/en_US/LC_TIME
40146000-40147000 r--p 00000000 03:01 306 /usr/share/locale/en_US/LC_NUMERIC
40147000-40162000 r--p 00000000 03:01 305 /usr/share/locale/en_US/LC_CTYPE
bfffb000-c0000000 rwxp ffffc000 00:00 0

Vellas
24.07.2004, 17:53
Hi!

@[MM]:
Was sollte C da anders lösen?
Du hast nicht geschrieben das du weißt wie der PM funktioniert, deswegen dachte ich eher das es daran hapert. Aber irren kann sich ja jeder mal...


Code-Hacker

[MM]
24.07.2004, 17:57
Naja, ich dachte eigentlich auch nur, dass für Code, Daten und Stack unterschiedliche Segmente in voneinander getrennten Adressräumen verwendet werden würden, Aber alles in einem ist ja auch einfacher.