Autor Thema: Long Mode, gdt und paging  (Gelesen 6138 mal)

OsDevNewbie

  • Beiträge: 282
    • Profil anzeigen
    • YourOS Kernel
Gespeichert
« am: 11. February 2012, 22:58 »
Hallo,
ich boote meinen Kernel mit Grub und schalte dann in den Long Mode um. Da man Paging vor dem Umschalten aktivieren muss, muss ich Paging nach dem Umschalten nochmal initialisieren?
Wo finde ich die Struktur der gdt im Long Mode?
Ist sie genau gleich wie im Protected Mode?

Danke
Viele Grüsse
OsDevNewbie

Ein Computer ohne Betriebsystem ist nicht mehr wert als ein Haufen Schrott.
Ein Computer ist eine Maschine, die einem Lebewesen das kostbarste klaut, was sie selber nicht hat:
DIE ZEIT DES LEBENS

MNemo

  • Beiträge: 547
    • Profil anzeigen
Gespeichert
« Antwort #1 am: 12. February 2012, 13:35 »
Da man Paging vor dem Umschalten aktivieren muss, muss ich Paging nach dem Umschalten nochmal initialisieren?
Du musst Paging nicht unbedingt vor dem Umschalten aktivieren. Solang es nicht aktiv ist bist du halt nicht im Long-Mode.
Ich initialisiere das Paging gleich für den Long-Mode, lass es aber noch deaktiviert, dann schalte ich das LM bit um, und aktiviere den longmode letztendlich mit dem Aktivieren von Paging (cr0 bit 31).

Zitat
Wo finde ich die Struktur der gdt im Long Mode?
Ist sie genau gleich wie im Protected Mode?
Nein, es gibt schon ein paar unterschiede.
Hier gibts die AMD64 Manuels. Es steht in Volume 2 Kapitel 4.8
« Letzte Änderung: 12. February 2012, 13:47 von MNemo »
„Wichtig ist nicht, besser zu sein als alle anderen. Wichtig ist, besser zu sein als du gestern warst!“

OsDevNewbie

  • Beiträge: 282
    • Profil anzeigen
    • YourOS Kernel
Gespeichert
« Antwort #2 am: 12. February 2012, 21:32 »
Hallo,
danke. Die AMD Manuals habe ich mir schon lokal gespeichert. Leider nur Volume 1,3 und 5. Naja.
Viele Grüsse
OsDevNewbie

Ein Computer ohne Betriebsystem ist nicht mehr wert als ein Haufen Schrott.
Ein Computer ist eine Maschine, die einem Lebewesen das kostbarste klaut, was sie selber nicht hat:
DIE ZEIT DES LEBENS

OsDevNewbie

  • Beiträge: 282
    • Profil anzeigen
    • YourOS Kernel
Gespeichert
« Antwort #3 am: 01. July 2012, 17:01 »
Hallo,
ich habe jetzt trotzdem noch eine Frage. Kann man schon die erweiterten Register, also z.B. rax und rbx, vor dem Umschalten in den Long Mode verwenden? Kann man dann schon 64-bit Code ausführen, der mithilfe von GCC kompiliert wurde?
Danke.
Viele Grüsse
OsDevNewbie

Ein Computer ohne Betriebsystem ist nicht mehr wert als ein Haufen Schrott.
Ein Computer ist eine Maschine, die einem Lebewesen das kostbarste klaut, was sie selber nicht hat:
DIE ZEIT DES LEBENS

MNemo

  • Beiträge: 547
    • Profil anzeigen
Gespeichert
« Antwort #4 am: 01. July 2012, 19:05 »
Nein, 64-Bit gibt es wirklich erst im Long Mode.
„Wichtig ist nicht, besser zu sein als alle anderen. Wichtig ist, besser zu sein als du gestern warst!“

OsDevNewbie

  • Beiträge: 282
    • Profil anzeigen
    • YourOS Kernel
Gespeichert
« Antwort #5 am: 01. July 2012, 19:23 »
Muss ich denn in das CR3 nur die Addresse der PML4 laden oder muss ich die zwei Flags auch laden und wenn ja wie, wenn nur 32-bit Register zur verfügung stehen?
Viele Grüsse
OsDevNewbie

Ein Computer ohne Betriebsystem ist nicht mehr wert als ein Haufen Schrott.
Ein Computer ist eine Maschine, die einem Lebewesen das kostbarste klaut, was sie selber nicht hat:
DIE ZEIT DES LEBENS

MNemo

  • Beiträge: 547
    • Profil anzeigen
Gespeichert
« Antwort #6 am: 01. July 2012, 20:56 »
Welche Flags meinst du? In CR3 die PWT und PCD liegen im unter 32-Bit Wort und du kannst sie ganz normal - wie auch die Adresse - setzten, falls du willst.

Ich sehe gerade, mein Code sieht dem von AMD Manual Volume 2 Seite 419 zum verwechseln ähnlich :evil: (dabei ist C&P eigentlich gar nicht mein Ding) :
[BITS 32]

; enable PAE
    mov  eax, cr4
    bts  eax, 5
    mov  cr4, eax

; load pml4
    mov  eax, [pml4_base]
    mov  cr3, eax

; set LM bit
    mov  ecx, 0xc0000080
    rdmsr
    bts  eax, 8
    wrmsr

; finally enable Long Mode by enabling paging
    mov  eax, cr0
    bts  eax, 31
    mov  cr0, eax

    jmp  CODE64_SEL:_start64
« Letzte Änderung: 01. July 2012, 20:58 von MNemo »
„Wichtig ist nicht, besser zu sein als alle anderen. Wichtig ist, besser zu sein als du gestern warst!“

 

Einloggen