Autor Thema: Aufbau der GDT  (Gelesen 6574 mal)

Cjreek

  • Beiträge: 104
    • Profil anzeigen
Gespeichert
« am: 02. June 2009, 16:56 »
Hi,

Habe erst vor kurzem angefangen und habe jetzt erstmal eine Frage zur GDT. Das Ding ist ja aus irgendeinem Grund ziemlich unnötig kompliziert aufgebaut.

Mein Problem ist wie jetzt die einzelnen Limit- bzw Base-Bits zusammengebaut werden.

Der Aufbau ist ja folgender:

8 Bit Limit (Bits 0-7)
8 Bit Limit (Bits 8-15)
...

Angenommen ich hätte nur diese beiden Bytes und ich schreibe folgendes:

db 01000000b
db 11111101b

Was ergäbe das dann zusammengesetzt?

Meine Logik sagt mir: 00000010 10111111

Stimmt das?  :?
"Programmers talk about software development on weekends, vacations, and over meals not because they lack imagination,
but because their imagination reveals worlds that others cannot see."

FreakyPenguin

  • Administrator
  • Beiträge: 301
    • Profil anzeigen
    • toni.famkaufmann.info
Gespeichert
« Antwort #1 am: 02. June 2009, 17:16 »
Wenn ich dich richtig verstehe, bist du nicht sicher in welcher Reihenfolge die Bytes der Zahlen zusammengesetzt werden? i386 ist eine little endian-Architektur. Das heisst, das niederwertigste Byte, einer Zahl wird zuerst abgelegt.

Nehmen wir als Beispiel die Hexdezimale Zahl 0x12345678. Hex deshalb, weil da 2 Ziffern immer einem Byte entsprechen, hier also vier Bytes. So ist das etwas übersichtlicher als mit den binären Zahlen.
Die Bytes werden nun, wie schon gesagt, mit dem niederwertigsten Byte voran gespeichert. Also: 0x78 0x56 0x34 0x12

Deine zwei Bytes ergeben also die Zahl: 1111110101000000b (0xFD40).

Jidder

  • Administrator
  • Beiträge: 1 625
    • Profil anzeigen
Gespeichert
« Antwort #2 am: 02. June 2009, 17:17 »
Hi,

die GDT ist mit dem 386er "so kompliziert" geworden, weil sie kompatibel zur GDT des 286er bleiben sollte. Wenn du dir nur die ersten 6 Bytes eines Eintrags anschaust, siehst du, dass die genau ausreichen würden, um die 64KB großen Segmente (Limit-Feld 16 Bit groß) für den 24 Bit Adressbus (Base-Feld 24 Bit groß) des 286ers darzustellen. Aber das nur nebenbei ;)

Viel wichtiger ist, dass man Zahlen in Binärdarstellung genauso wie normale Zahlen liest. Das bedeutet, die rechte Stelle ist die kleinste. Beispielsweise ist die 3 bei der dezimalen ("normalen") Zahl 123 die kleinste Stelle, denn ganz rechts stehen die Einer, dann kommen erst die Zehner, Hunderter, etc.

Außerdem ist wichtig, dass die Intel Architektur eine Little-Endian-Architektur ist. Little-Endian bedeutet sowas wie "das kleine Ende kommt zuerst". Das Ganze bezieht sich auf zusammengesetzte Zahlen und heißt, dass das niederwertige Byte einer zusammengesetzten Zahl zuerst kommt. (Also genau anders herum als bei Binärzahlen oder Dezimalzahlen, wenn man das übertragen will.)

Also zu deinem Beispiel:
1. Die Binärzahlen nicht umdrehen
2. Die Zahl von rechts nach links zusammensetzen, wenn du Byteweise durchgehst

Das Ergebnis wäre also für dein Limit: 11111101 01000000b

edit: Zu langsam. Aber ich will doch meinen Postcounter erhöhen ^^
« Letzte Änderung: 02. June 2009, 17:22 von PorkChicken »
Dieser Text wird unter jedem Beitrag angezeigt.

Cjreek

  • Beiträge: 104
    • Profil anzeigen
Gespeichert
« Antwort #3 am: 02. June 2009, 17:23 »
Hi,

Danke für die Antworten ;-)

@PorkChicken: Ich weiß wie Binärzahlen aufgebaut sind. Aber ich dachte halt:

Das LSB des 2. Bytes wäre dann das 9. Bit. Aber so ist es scheinbar nicht^^
Habs jetzt verstanden, danke ;)
"Programmers talk about software development on weekends, vacations, and over meals not because they lack imagination,
but because their imagination reveals worlds that others cannot see."

Cjreek

  • Beiträge: 104
    • Profil anzeigen
Gespeichert
« Antwort #4 am: 02. June 2009, 17:34 »
Oh stimmt  :-D

Noch etwas zur GDT... Angenommen ich habe (außer dem Nulldescriptor) noch 2 weitere für Code und Daten.

Wenn ich jetzt Base von Code = 0 setze und Limit auf 0x7FFFFFFF und Base von Data auf 0x80000000 und Limit wieder auf 0x7FFFFFFF, dann habe ich den Speicher doch quasi geteilt oder? Also die erste Hälfte für den Code und die 2. für die Daten? Oder liegt da ein Verständnisproblem vor?

Bzw. was ist der Sinn beide Segmente von 0 bis "Ende" gehen zu lassen. Dann überlappen sich doch Code und Daten oder?  :?

Edit: Huch wo ist denn dein Post hin ? o.O
« Letzte Änderung: 02. June 2009, 17:36 von Cjreek »
"Programmers talk about software development on weekends, vacations, and over meals not because they lack imagination,
but because their imagination reveals worlds that others cannot see."

Jidder

  • Administrator
  • Beiträge: 1 625
    • Profil anzeigen
Gespeichert
« Antwort #5 am: 02. June 2009, 17:38 »
So, ich hab meinen Beitrag schon wieder gelöscht. Das war sogar für mich zu verwirrend ^^ (Für die Anderen: Das LSB vom zweiten Byte ist das 9. Bit, wenn man bei 1 anfängt zu zählen.)

Ja, so kannst du den Speicher teilen. Man legt allerdings die Segmente 1:1 übereinander, weil das wesentlich einfacher zu programmieren ist. Sonst musst du immer zwei Adressräume im Auge behalten, und du musst dir auch noch was überlegen, wie du den Code in den Speicher bekommst. Außerdem ist diese Teilung ziemlich starr. Da geht dir schnell der Speicher aus, wenn du ungünstige "Lücken" hast.

Man lässt die Segmente bis zum Ende gehen, weil die Segmentierung veraltet ist. (Im 64 Bit Modus existiert sie z.B. praktisch nicht mehr.) Stattdessen nutzt man Virtuellen Speicher also Paging zur Einteilung des Adressraums. Allerdings ist da die Trennung von Code und Daten auch ein relativ neues Konzept. (NX-Bit, und wie das nicht alles heißt.)
Dieser Text wird unter jedem Beitrag angezeigt.

Cjreek

  • Beiträge: 104
    • Profil anzeigen
Gespeichert
« Antwort #6 am: 02. June 2009, 17:42 »
Also könnte man den Speicher in dieser Art segmentieren. Es wäre allerdings veraltet und unpraktisch und wird (später) durch das Paging (quasi) ersetzt?
"Programmers talk about software development on weekends, vacations, and over meals not because they lack imagination,
but because their imagination reveals worlds that others cannot see."

Jidder

  • Administrator
  • Beiträge: 1 625
    • Profil anzeigen
Gespeichert
« Antwort #7 am: 02. June 2009, 17:52 »
Ja, das kannst du tun.

Wenn du mit "später" den Entwicklungsprozess deines Betriebssystems meinst, würde ich davon abraten. Das ist nicht wie in Mathe, dass man erst Bruchrechnung lernt, dann irgendwann mit dem Wurzelziehen anfängt, aber trotzdem noch die Brüche gebrauchen kann. (Einen Euro in das Analogien-Sparschwein ...) Sondern wenn du mit Paging anfängst, kannst deinen Code für Segmentierung komplett ausmustern. Paging ist flexibler, feiner, schneller, und zukunftstauglicher.
Dieser Text wird unter jedem Beitrag angezeigt.

Cjreek

  • Beiträge: 104
    • Profil anzeigen
Gespeichert
« Antwort #8 am: 02. June 2009, 18:00 »
Ja ich meinte auch die in dem Base = 0, Limit = 0xFFFFFF Fall nicht vorhandene Segmentierung würde dann durchs Paging ersetzt.

Erst zu segmentieren und dann Paging einzubauen wäre natürlich etwas unsinnig.
"Programmers talk about software development on weekends, vacations, and over meals not because they lack imagination,
but because their imagination reveals worlds that others cannot see."

 

Einloggen