Autor Thema: Global Descriptor Table  (Gelesen 17747 mal)

KtmnjjpfjsFvzG

  • Beiträge: 111
    • Profil anzeigen
Gespeichert
« am: 23. January 2013, 15:08 »
Ich bin mittlerweile bei Teil 5 des Tutorials angelangt und weiß nun wirklich überhaupt nicht mehr weiter.

Ich verstehe nicht, wozu die GDT überhaupt genutzt wird bzw. von wem.
Zweite Frage: Kann man quasi gleichzeitig im Protected Mode und im Real Mode sein?
Woran erkenne ich, in welchem Mode ich gerade bin?

OK, die GDT besteht aus Segementen, in die ich irgendwas reinschreiben muss - aber WIESO? Informationen WORÜBER?

kevin

  • Administrator
  • Beiträge: 2 767
    • Profil anzeigen
Gespeichert
« Antwort #1 am: 23. January 2013, 15:49 »
Ich verstehe nicht, wozu die GDT überhaupt genutzt wird bzw. von wem.
Vom Prozessor, um virtuelle Speicheradressen in physische (bzw. erst einmal lineare) umzurechnen. Alle Adressen, mit denen ein Programm hantiert, sind in der Regel virtuelle Adressen. Jeder Speicherzugriff, den du machst, geht über eine virtuelle Adresse, die aus Segment und Offset besteht. In Assembler kannst du das Segment explizit dazuschreiben (z.B. %fs:%eax), aber wenn du es nicht tust, dann gelten je nach Befehl und Register %ds, %es oder %ss als Default.

Weil du aber im Moment gar nichts umrechnen willst, definierst du einfach nur ein einziges großes Segment, das den kompletten Speicher abdeckt.

Zitat
Zweite Frage: Kann man quasi gleichzeitig im Protected Mode und im Real Mode sein?
Ich ignoriere das "quasi" mal und sage nein.

Zitat
Woran erkenne ich, in welchem Mode ich gerade bin?
Der Protected Mode wird aktiviert, wenn cr0.PE gesetzt ist.

Zitat
OK, die GDT besteht aus Segementen, in die ich irgendwas reinschreiben muss - aber WIESO? Informationen WORÜBER?
Die GDT definiert die Segmente. Das heißt, sie legt für jedes Segment fest, was für einen Typ es hat, wo im Speicher es liegt und wie groß es ist.
Thou shalt not follow the NULL pointer, for chaos and madness await thee at its end.

Svenska

  • Beiträge: 1 792
    • Profil anzeigen
Gespeichert
« Antwort #2 am: 23. January 2013, 15:51 »
Ich verstehe nicht, wozu die GDT überhaupt genutzt wird bzw. von wem.
Die GDT ist notwendig, um Segmentierung zu implementieren. Das Tutorial nutzt allerdings keine vollständige Segmentierung, deswegen muss sie trotzdem eingerichtet werden.

Zweite Frage: Kann man quasi gleichzeitig im Protected Mode und im Real Mode sein?
Nein. Es gibt allerdings den V86-Mode, mit dem man innerhalb des Protected Modes einen Task erzeugen kann, dem eine Real-Mode-artige Umgebung bereitgestellt wird.

Woran erkenne ich, in welchem Mode ich gerade bin?
Da gibt es so ein Bit in CR0, das setzt man für den PM und löscht es für den RM - man darf es auch lesen.

OK, die GDT besteht aus Segementen, in die ich irgendwas reinschreiben muss - aber WIESO? Informationen WORÜBER?
Wieso? Damit die CPU weiß, welche Segmente es wo im (linearen) Adressraum gibt. Worüber? Anfang, Ende, Typ, Zugriffsberechtigungen...

edit: zu spät...

Gruß,
Svenska

KtmnjjpfjsFvzG

  • Beiträge: 111
    • Profil anzeigen
Gespeichert
« Antwort #3 am: 23. January 2013, 15:53 »
um virtuelle Speicheradressen in physische (bzw. erst einmal lineare) umzurechnenOkay, aber wozu braucht man das?

Jidder

  • Administrator
  • Beiträge: 1 625
    • Profil anzeigen
Gespeichert
« Antwort #4 am: 23. January 2013, 16:12 »
Okay, aber wozu braucht man das?
Die Idee der Segmentierung ist den Speicher zu unterteilen und jedem Programm ein Teil davon zu geben. Für jedes Programm gibt es dann einen Eintrag (= Deskriptor) in der GDT, der die Adresse und Größe X des Speicherbereichs (= Segment) enthält. Während ein Programm läuft, sind die Segmentregister mit entsprechenden Selektoren geladen, die besagen, welcher Eintrag genutzt werden soll. Aus Sicht des Programms beginnt der Speicher bei 0 und hat die Länge X. Die CPU schaut dann bei einem Speicherzugriff in der GDT nach, welche Basisadresse im Deskriptor steht und addiert sie zu der vom Programm referenzierten Speicheradresse. Außerdem prüft sie, ob diese Adresse innerhalb des Segments liegt. Die errechnete Adresse ist die lineare Adresse. Die kann dann genutzt werden, um auf den physischen Speicher zuzugreifen.

Die Idee dahinter ist, die Programme voreinander zu schützen (daher das "Protected" in "Protected Mode"), indem man die Segmente so einrichtet, dass sie sich nicht überlappen. Programme die versuchen über die Segmentgrenzen hinaus auf Speicher zuzugreifen, werden vom Betriebssystem daran gehindert. So wie ich das beschrieben habe, macht es allerdings niemand und die Segmentierung wird von kommerziellen Systemen ignoriert. Stattdessen wird Paging eingesetzt, das flexibler ist (keine feste Größe der Segmente). Allerdings ist die Segmentierung nicht abschaltbar, und man legt deswegen ein großes Segment an, dass bei der Adresse 0 beginnt und 4 GB groß ist (maximale Größe bei 32-Bit-Systemen). Damit ist Segmentierung im Prinzip ausgehebelt.

Woran erkenne ich, in welchem Mode ich gerade bin?
Wie man es erkennt, hat Svenska ja schon beschrieben, aber normalerweise weiß man es. Wenn der Computer gerade gestartet wurde oder dein Betriebssystem vom BIOS geladen wurde, ist das System im Real Mode. Wenn du dein Betriebssystem von einem Multiboot-kompatiblen Bootloader laden lässt, ist die CPU im Protected Mode. Und über Wechsel zwischen den Modi hast du (bzw. der Kernel) die Kontrolle.
« Letzte Änderung: 23. January 2013, 16:15 von Jidder »
Dieser Text wird unter jedem Beitrag angezeigt.

KtmnjjpfjsFvzG

  • Beiträge: 111
    • Profil anzeigen
Gespeichert
« Antwort #5 am: 23. January 2013, 16:15 »
Hmm, na gut, aber wenn man das machen muss, warum funktioniert es dann auch ohne GDT? Ich meine, ich hab ja noch keine, aber es läuft trotzdem!

Jidder

  • Administrator
  • Beiträge: 1 625
    • Profil anzeigen
Gespeichert
« Antwort #6 am: 23. January 2013, 16:18 »
Der Bootloader hat bereits eine eingerichtet. Die solltest du allerdings nicht auf Dauer nutzen, weil (1. es der Standard so besagt und 2.) sie eventuell nicht deinen Anforderungen entspricht.
Dieser Text wird unter jedem Beitrag angezeigt.

KtmnjjpfjsFvzG

  • Beiträge: 111
    • Profil anzeigen
Gespeichert
« Antwort #7 am: 23. January 2013, 16:35 »
OK ich verstehe es so in etwa, vielen Dank :)

KtmnjjpfjsFvzG

  • Beiträge: 111
    • Profil anzeigen
Gespeichert
« Antwort #8 am: 09. February 2013, 16:30 »
Hmmm... welche Adresse hat denn cr0(.PE) ? Ich finde das nirgendwo...

kevin

  • Administrator
  • Beiträge: 2 767
    • Profil anzeigen
Gespeichert
« Antwort #9 am: 09. February 2013, 18:15 »
cr0 ist ein Register, das hat keine Adresse.
Thou shalt not follow the NULL pointer, for chaos and madness await thee at its end.

KtmnjjpfjsFvzG

  • Beiträge: 111
    • Profil anzeigen
Gespeichert
« Antwort #10 am: 09. February 2013, 18:26 »
Und wie soll ich das dann auslesen?

micha

  • Beiträge: 141
    • Profil anzeigen
Gespeichert
« Antwort #11 am: 09. February 2013, 20:14 »
genauso wie du eax und so ausliest

KtmnjjpfjsFvzG

  • Beiträge: 111
    • Profil anzeigen
Gespeichert
« Antwort #12 am: 09. February 2013, 20:14 »
Das mach ich garnicht...

micha

  • Beiträge: 141
    • Profil anzeigen
Gespeichert
« Antwort #13 am: 09. February 2013, 20:22 »
cr0 kannst du in ein anderes register (z.b. eax) übertragen und dann verändern bzw. nur auslesen.
so schaltet man z.b. paging ein, indem man das bit 31 in cr0 setzt
mov %cr0, %eax
or %eax, (1 << 31)
mov %eax, %cr0

KtmnjjpfjsFvzG

  • Beiträge: 111
    • Profil anzeigen
Gespeichert
« Antwort #14 am: 09. February 2013, 20:23 »
Okay, grundsätzliche Verständnisfrage: Was ist der Unterschied zwischen %eax und %eabx usw. und %ax und %bx?

Und was gibt es alles?

Oder kann man sich das selber aussuchen, also auch %asasfsdfsdfjlngouineruigndhiasdasdasdbobzi ????

micha

  • Beiträge: 141
    • Profil anzeigen
Gespeichert
« Antwort #15 am: 09. February 2013, 20:28 »
Okay, grundsätzliche Verständnisfrage: Was ist der Unterschied zwischen %eax und %eabx usw. und %ax und %bx?
%eax ist ein 32-bit register. %ax ist ein 16bit register. also %ax ist die erste hälfte von %eax.

Und was gibt es alles?

Oder kann man sich das selber aussuchen, also auch %asasfsdfsdfjlngouineruigndhiasdasdasdbobzi ????
Selberaussuchen kann man sich das nicht. Die Register sind alle festgelegt.
Schau mal im wiki http://www.lowlevel.eu/wiki/X86#Register
und zu cr0 und so steht hier was: http://www.lowlevel.eu/wiki/Steuerregister

KtmnjjpfjsFvzG

  • Beiträge: 111
    • Profil anzeigen
Gespeichert
« Antwort #16 am: 09. February 2013, 21:25 »
Aha, ich verstehe.

Und ES:DI ? Was ist das und wieso hat es einen Doppelpunkt? :D

(Ich meine folgendes: "ES:DI = Zeiger auf freien Speicher für den VBE Info Block (512 Bytes)")
« Letzte Änderung: 09. February 2013, 22:21 von KtmnjjpfjsFvzG »

Svenska

  • Beiträge: 1 792
    • Profil anzeigen
Gespeichert
« Antwort #17 am: 10. February 2013, 01:50 »
Hallo,

du fragst gerade nach den Grundlagen der x86-Architektur. Besorge dir mal ein Buch dazu (bzw. zu x86-Assembler). Da erfährst du, wie so eine CPU funktioniert, was Register eigentlich sind, wie das mit der Segmentierung ist, die sonst auf dieser Welt gestorben ist und wie der Real Mode eigentlich funktioniert. Oder lies das Wiki zu dem Thema, da steht das alles drin *hint, hint*.

ES ist ein Segmentregister und beschreibt ein Stück des physischen Speichers. DI ist ein Indexregister. ES:DI zeigt also mitten in ein Stück Speicher, CS:DI würde mitten in deinen Code zeigen und SS:DI mitten in deinen Stack (ob die Varianten so gültig sind, weiß ich aber aus dem Kopf nicht).

Gruß,
Svenska

KtmnjjpfjsFvzG

  • Beiträge: 111
    • Profil anzeigen
Gespeichert
« Antwort #18 am: 10. February 2013, 11:42 »
So weit (ES) hab ich das ja verstanden, aber dann gibt es ja ES (2 Byte) und DI (2 Byte), aber was soll der Doppelpunkt?

Svenska

  • Beiträge: 1 792
    • Profil anzeigen
Gespeichert
« Antwort #19 am: 10. February 2013, 13:49 »
Segment override.

 

Einloggen