Autor Thema: CPU Reset beim Ändern der Pagingtabellen  (Gelesen 3494 mal)

OsDevNewbie

  • Beiträge: 282
    • Profil anzeigen
    • YourOS Kernel
Gespeichert
« am: 13. July 2012, 12:34 »
Hallo,
ich verwende den Long Mode und in meinen Funktionen, die die Paging Tabellen verändern um eine Page zu mappen bzw. sie wieder freizugeben, gibt es Triplefault nachdem versucht wird auf die PML4 selber zuzugreifen (über die Addresse 0xFFFFFFFFF000). Hier ist die Ausgabe von Bochs:
[CPU0 RD]: PHY 0x0000000000a07000 (len=8): 0x00000000 0x00A0802B ; PML4E
[CPU0 RD]: PHY 0x0000000000a08000 (len=8): 0x00000000 0x00A0902B ; PDPTE
[CPU0 RD]: PHY 0x0000000000a09000 (len=8): 0x00000000 0x00A0A02B ; PDE
[CPU0 RD]: PHY 0x0000000000a0a000 (len=8): 0x00000000 0x0000000B ; PTE
[CPU0 WR]: PHY 0x0000000000a0a000 (len=8): 0x00000000 0x0000002B ; PTE
[CPU0 RD]: LIN 0x00000000000000d0 PHY 0x00000000000000d0 (len=8, pl=0): 0xF000FF53 0xF000FF53
[CPU0 RD]: LIN 0x00000000000000d8 PHY 0x00000000000000d8 (len=8, pl=0): 0xF000FF53 0xF000FF53
[CPU0 RD]: LIN 0x0000000000000080 PHY 0x0000000000000080 (len=8, pl=0): 0xF000FF53 0xF000FF53
[CPU0 RD]: LIN 0x0000000000000088 PHY 0x0000000000000088 (len=8, pl=0): 0xF000FF53 0xF000FF53
rax: 0x0000ffff_fffff000 rcx: 0x80000000_00a0720b
rdx: 0x00000000_00000000 rbx: 0x00000000_00a1e000
rsp: 0x00000000_00201fa1 rbp: 0x00000000_00201ff1
rsi: 0x00000000_00000001 rdi: 0x00000000_00a1e000
r8 : 0x00000000_00000000 r9 : 0x00000000_00000001
r10: 0x00000000_00000000 r11: 0x00000000_00000000
r12: 0x00000000_00000000 r13: 0x00000000_00000000
r14: 0x00000000_00000000 r15: 0x00000000_00000000
rip: 0x00000000_00100c6c
eflags 0x00210006: ID vip vif ac vm RF nt IOPL=0 of df if tf sf zf af PF cf
(0).[522443589] [0x0000000000100c6c] 0018:0000000000100c6c (unk. ctxt): mov rax, qword ptr ds:[rax+rdx*8] ; 488b04d0
Next at t=522443590
(0) [0x00000000fffffff0] f000:fff0 (unk. ctxt): jmp far f000:e05b         ; ea5be000f0
Wobei an der Addresse 100c6c der ausgeführte Code liegt.

Warum greift der Prozessor denn nicht auf den letzten Eintrag der PML4 zu sondern auf den ersten?
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

Jidder

  • Administrator
  • Beiträge: 1 625
    • Profil anzeigen
Gespeichert
« Antwort #1 am: 13. July 2012, 13:46 »
Also warum die CPU das tut was sie tut, weiß ich nicht. Vor allem warum sie auf das Page Directory zugreift, wenn meine Vermutung korrekt ist. Aber vielleicht steht das Log auch gar nicht in diesem Zusammenhang.

Ich glaube nämlich, dass der GPF ausgelöst wird, weil die Adresse 0x0000FFFFFFFFF000 nicht kanonisch ist. (findest du in den Manuals, wenn du nach canonical suchst) Die Bits 63-48 müssen gleich dem Bit 47 sein. In diesem Fall müsstest du also auf 0xFFFFFFFFFFFFF000 zugreifen.
Dieser Text wird unter jedem Beitrag angezeigt.

OsDevNewbie

  • Beiträge: 282
    • Profil anzeigen
    • YourOS Kernel
Gespeichert
« Antwort #2 am: 13. July 2012, 14:36 »
So greift er jetzt zwar auf den letzten Eintrag zu, aber gleich danach gibt es wieder ein Reset. Hier die Bochs Ausgabe:
[CPU0 RD]: PHY 0x0000000000a07ff8 (len=8): 0x80000000 0x00A0720B ; PML4E
[CPU0 RD]: PHY 0x0000000000a07000 (len=8): 0x00000000 0x00A0802B ; PML4E
[CPU0 RD]: PHY 0x0000000000a08000 (len=8): 0x00000000 0x00A0902B ; PDPTE
[CPU0 RD]: PHY 0x0000000000a09000 (len=8): 0x00000000 0x00A0A02B ; PDE
[CPU0 RD]: PHY 0x0000000000a0a000 (len=8): 0x00000000 0x0000000B ; PTE
[CPU0 WR]: PHY 0x0000000000a0a000 (len=8): 0x00000000 0x0000002B ; PTE
[CPU0 RD]: LIN 0x00000000000000e0 PHY 0x00000000000000e0 (len=8, pl=0): 0xF000FF53 0xF000FF53
[CPU0 RD]: LIN 0x00000000000000e8 PHY 0x00000000000000e8 (len=8, pl=0): 0xF000FF53 0xF000FF53
[CPU0 RD]: LIN 0x0000000000000080 PHY 0x0000000000000080 (len=8, pl=0): 0xF000FF53 0xF000FF53
[CPU0 RD]: LIN 0x0000000000000088 PHY 0x0000000000000088 (len=8, pl=0): 0xF000FF53 0xF000FF53
rax: 0xffffffff_fffff000 rcx: 0x80000000_00a0720b
rdx: 0x00000000_00000000 rbx: 0x00000000_00a1e000
rsp: 0x00000000_00201fa1 rbp: 0x00000000_00201ff1
rsi: 0x00000000_00000001 rdi: 0x00000000_00a1e000
r8 : 0x00000000_00000000 r9 : 0x00000000_00000001
r10: 0x00000000_00000000 r11: 0x00000000_00000000
r12: 0x00000000_00000000 r13: 0x00000000_00000000
r14: 0x00000000_00000000 r15: 0x00000000_00000000
rip: 0x00000000_00100c48
eflags 0x00210086: ID vip vif ac vm RF nt IOPL=0 of df if tf SF zf af PF cf
(0).[222341736] [0x0000000000100c48] 0018:0000000000100c48 (unk. ctxt): mov rax, qword ptr ds:[rax+rdx*8] ; 488b04d0
Next at t=222341737
(0) [0x00000000fffffff0] f000:fff0 (unk. ctxt): jmp far f000:e05b         ; ea5be000f0
Danke für deine Hilfe
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

Jidder

  • Administrator
  • Beiträge: 1 625
    • Profil anzeigen
Gespeichert
« Antwort #3 am: 13. July 2012, 14:48 »
Hi,

ich glaube deine IDT ist nicht korrekt initialisiert. Die CPU denkt, dass die an Adresse 0 liegt, aber da sind keine Deskriptoren.

So interpretiere ich zumindest dieses und das letzte Log. Beim letzten mal gab es einen GPF (0x0d -> Offset 0xd0 in der IDT), gefolgt von einem double fault (0x08 -> 0x80 in der IDT):

[CPU0 RD]: LIN 0x00000000000000d0 PHY 0x00000000000000d0 (len=8, pl=0): 0xF000FF53 0xF000FF53
[CPU0 RD]: LIN 0x00000000000000d8 PHY 0x00000000000000d8 (len=8, pl=0): 0xF000FF53 0xF000FF53
[CPU0 RD]: LIN 0x0000000000000080 PHY 0x0000000000000080 (len=8, pl=0): 0xF000FF53 0xF000FF53
[CPU0 RD]: LIN 0x0000000000000088 PHY 0x0000000000000088 (len=8, pl=0): 0xF000FF53 0xF000FF53

Diesmal ist es ein Page Fault:
[CPU0 RD]: LIN 0x00000000000000e0 PHY 0x00000000000000e0 (len=8, pl=0): 0xF000FF53 0xF000FF53
[CPU0 RD]: LIN 0x00000000000000e8 PHY 0x00000000000000e8 (len=8, pl=0): 0xF000FF53 0xF000FF53

Du hast also vermutlich zwei Probleme. Erstens den Page Fault und zweitens, dass deine IDT nicht korrekt initialisiert ist (zu erkennen an den 0xF000FF53, die noch aus der IVT vom BIOS stammen). Entweder ist die IDT an der falschen Stelle, oder die Interrupts wurden nicht initialisiert. Wenn du eine passende IDT installiert hast, kannst dir die Fehleradresse und Flags vom Page Fault ausgeben lassen. Ich würde also damit anfangen.
Dieser Text wird unter jedem Beitrag angezeigt.

OsDevNewbie

  • Beiträge: 282
    • Profil anzeigen
    • YourOS Kernel
Gespeichert
« Antwort #4 am: 13. July 2012, 15:05 »
Das meine IDT noch nicht initialisiert ist stimmt, denn das alles passiert noch vor der Initialisierung der IDT. Und die Interrupts sind auch über cli ausgeschaltet. Ich bin nämlich noch in der Phase, in der die Speicherverwaltung initialisiert wird. Warum gibt es denn ein Page Fault? Ich glaube in Qemu gibt es mir die Register aus. Mal schaun.
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 #5 am: 13. July 2012, 15:56 »
Ich habe den Fehler gefunden. Man muss nur das NX-Bit löschen, das ich gesetzt hatte. Ich will aber das die Page Table nicht ausführbar ist. Warum gibt es dann ein PF wenn ich auf diese Page zugreife?
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

Jidder

  • Administrator
  • Beiträge: 1 625
    • Profil anzeigen
Gespeichert
« Antwort #6 am: 13. July 2012, 16:14 »
Also laut Intel Manual muss das erstens unterstützt sein und zweitens IA32_EFER.NXE auf 1 gesetzt sein.
Dieser Text wird unter jedem Beitrag angezeigt.

OsDevNewbie

  • Beiträge: 282
    • Profil anzeigen
    • YourOS Kernel
Gespeichert
« Antwort #7 am: 13. July 2012, 17:33 »
Achso 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

 

Einloggen