Autor Thema: Frage zu: [solved] sofortige reboots nach laden der GDT  (Gelesen 5462 mal)

spaceemotion

  • Beiträge: 49
    • Profil anzeigen
    • SpaceEmotion
Gespeichert
« am: 04. February 2010, 10:54 »
Im Thread steht zwar, dass das Thema bereits gelöst ist, jedoch habe ich eine kleine Frage dazu, da ich im Moment an der gleichen Stelle festsitze.

Es geht um die erste Antwort:
Zitat
Also bei mir hat ein Deskriptor 8 Bytes, bei dir scheinen es eher 16 zu sein.

Ich verstehe nicht, woran man erkennt, wann er Diskriptor 8 Bytes oder 16 hat.

Wäre es möglich, dass wir den ganzen Code zusehen bekommen?

Danke schon einmal im vorraus


SpaceEmotion

bluecode

  • Beiträge: 1 391
    • Profil anzeigen
    • lightOS
Gespeichert
« Antwort #1 am: 04. February 2010, 11:22 »
Das bezieht sich wohl auf das hier. Die Größe eines GDT-Eintrags sieht man an
typedef struct {
uint32_t size;
uint32_t base;
uint16_t base2;
uint16_t access;
uint16_t size2;
uint16_t base3;
} segment_descriptor;
Wenn man die einzelnen Feldergrößen zusammenzählt (4 + 4 + 2 + 2 + 2 + 2) kommt man auf 16Byte. Wenn du uns die Struktur eines deiner GDT-Einträge zeigst, dann könnten wir prüfen wie groß dieser ist.
lightOS
"Überlegen sie mal 'nen Augenblick, dann lösen sich die ganzen Widersprüche auf. Die Wut wird noch größer, aber die intellektuelle Verwirrung lässt nach.", Georg Schramm

spaceemotion

  • Beiträge: 49
    • Profil anzeigen
    • SpaceEmotion
Gespeichert
« Antwort #2 am: 04. February 2010, 11:35 »
Danke für die schnelle Antwort.

Welche Zahlen, sollten wir denn sonst nehmen?

Außerdem habe ich die Zahlen und die Struktur aus dem Link benutzt.
« Letzte Änderung: 04. February 2010, 13:01 von spaceemotion »

kevin

  • Administrator
  • Beiträge: 2 767
    • Profil anzeigen
Gespeichert
« Antwort #3 am: 04. February 2010, 13:16 »
Hier wird beschrieben, wie ein Deskriptor (also ein GDT-Eintrag) aussieht: http://lowlevel.brainsware.org/wiki/index.php/GDT#Struktur_eines_Eintrages

Wenn du das mit dem Code vergleichst, siehst du, dass der Code immer doppelt so große Datentypen genommen hat wie die Einträge tatsächlich groß sind.
Thou shalt not follow the NULL pointer, for chaos and madness await thee at its end.

spaceemotion

  • Beiträge: 49
    • Profil anzeigen
    • SpaceEmotion
Gespeichert
« Antwort #4 am: 11. February 2010, 10:49 »
Wir haben jetzt den Code geändert, aber es funktioniert immer noch nicht. Wir wissen jedoch nicht was daran falsch ist.

In unserer init.c steht folgendes:
#include "inttypes.h"


#define GDT_SIZE 5

#define GDT_CODESEG 0x0A //10
#define GDT_DATASEG 0x02 //02
#define GDT_TSS 0x09 //09
#define GDT_PRESENT 0x80 //128
#define GDT_SEGMENT 0x80 //128

#define SYS_CODE_SEL 0x08 //08
#define SYS_DATA_SEL 0x10 //16
#define USER_CODE_SEL 0x18 //24
#define USER_DATA_SEL 0x20 //32
#define TSS_SEL 0x28 //40

typedef struct {
uint16_t size;
uint16_t base;
uint8_t base2;
uint8_t access;
uint8_t size2;
uint8_t base3;
} segment_descriptor;

segment_descriptor gdt[GDT_SIZE];


void gdt_set_descriptor(int i, uint64_t size, uint32_t base, uint8_t access, int dpl)
{
gdt[i].size   = size & 0xFFFF; //65535
gdt[i].size2  = ((size >> 16) & 0x0F) | 0xC0; //16,192
gdt[i].base   = base & 0xFFFF; //65535
gdt[i].base2  = (base >> 16) & 0xFF; //255
gdt[i].base3  = ((base >> 24) & 0xFF); //255
gdt[i].access = access | ((dpl & 3) << 5);
}


void load_gdt()
{

struct {
uint16_t size;
uint32_t base;
}
__attribute__((packed)) gdt_ptr =
{
.size = GDT_SIZE*8 - 1,
.base = (uint32_t)gdt,
};


asm("lgdtl %0\n\t"
"ljmpl $0x08, $1f\n\t"
"1:\n\t"
"mov $0x10, %%eax\n\t"
"mov %%eax, %%ds\n\t"
"mov %%eax, %%es\n\t"
"mov %%eax, %%fs\n\t"
"mov %%eax, %%gs\n\t"
"mov %%eax, %%ss\n\t" : : "m" (gdt_ptr) : "eax");

}

void init_gdt(void)
{
gdt_set_descriptor(0, 0, 0, 0, 0);
gdt_set_descriptor(1, 0x000FFFFF, 0x00000000, GDT_SEGMENT | GDT_PRESENT | GDT_CODESEG, 0); //65535, 0, 154, 0
gdt_set_descriptor(2, 0x000FFFFF, 0x00000000, GDT_SEGMENT | GDT_PRESENT | GDT_DATASEG, 0); //65535, 0, 146, 0
gdt_set_descriptor(3, 0x000FFFFF, 0x00000000, GDT_SEGMENT | GDT_PRESENT | GDT_CODESEG, 3); //65535, 0, 154, 3
gdt_set_descriptor(4, 0x000FFFFF, 0x00000000, GDT_SEGMENT | GDT_PRESENT | GDT_DATASEG, 3); //65535, 0, 146, 3


   load_gdt();
}

void init(void){
init_gdt();

}

Kann mal jemand sich diesen angucken und sagen was falsch ist?

Vielen Dank schon einaml im voraus


spaceemotion

XanClic

  • Beiträge: 261
    • Profil anzeigen
    • github
Gespeichert
« Antwort #5 am: 11. February 2010, 12:41 »
Auf den ersten Blick sollte
#define GDT_SEGMENT 0x80 //128Wohl eher
#define GDT_SEGMENT 0x10 //16sein.

 

Einloggen