Also er will auf die Adresse 0xFFFFFFFFFFFFF000 (cr2) zugreifen. Das ist so gewollt. Ich setze ja am Anfang den Letzten Eintrag der PML4, dass er auf die PML4 selber zeigt, so dass ich die Tabellen bearbeiten kann. Mir sieht der Code eben auch richtig aus, aber irgendwie ist trotzdem etwas falsch.
Ich hab vergessen etwas zu erwähnen: Der Fehler ist nicht, dass die Page nicht gemappt ist, sondern dass reserved-Bits gesetzt sind, obwohl sie dass nicht sind (Fehlercode: 0x9).
Die Funktion setPML4Entry() funktioniert richtig.
VMM_POINTER_TO_PML4 ist das Flag, das in die AVL-Bits geschrieben werden, damit der Kernel identifizieren kann, was das ist.
VMM_PML4_ADDRESS ist die Adresse, mit der die PML4 bearbeitet werden kann.
Hier noch debug.log (Bochs):
Next at t=0
(0) [0x00000000fffffff0] f000:fff0 (unk. ctxt): jmp far f000:e05b ; ea5be000f0
<bochs:1> lb 0x102617
<bochs:2> trace-reg on
Register-Tracing enabled for CPU0
<bochs:3> c
(0) Breakpoint 1, 0x0000000000102617 in ?? ()
Next at t=304278401
CPU0:
rax: 0x00000000_00000000 rcx: 0x80000000_00a0840b
rdx: 0x80000000_00000000 rbx: 0x00000000_00000000
rsp: 0x00000000_0020c970 rbp: 0x00000000_00000090
rsi: 0xffffffff_fffff000 rdi: 0x00000000_000001ff
r8 : 0x00000000_00000000 r9 : 0x00000000_00000001
r10: 0x00000000_00000004 r11: 0x00000000_00000000
r12: 0x00000000_00000000 r13: 0x00000000_00000000
r14: 0x000fffff_fffff000 r15: 0x00000000_00000000
rip: 0x00000000_00102617
eflags 0x00000046: id vip vif ac vm rf nt IOPL=0 of df if tf sf ZF af PF cf
(0) [0x0000000000102617] 0008:0000000000102617 (unk. ctxt): mov ecx, 0x00000001 ; b901000000
<bochs:4> trace-mem on
Memory-Tracing enabled for CPU0
<bochs:5> s
Next at t=304278402
CPU0:
rax: 0x00000000_00000000 rcx: 0x00000000_00000001
rdx: 0x80000000_00000000 rbx: 0x00000000_00000000
rsp: 0x00000000_0020c970 rbp: 0x00000000_00000090
rsi: 0xffffffff_fffff000 rdi: 0x00000000_000001ff
r8 : 0x00000000_00000000 r9 : 0x00000000_00000001
r10: 0x00000000_00000004 r11: 0x00000000_00000000
r12: 0x00000000_00000000 r13: 0x00000000_00000000
r14: 0x000fffff_fffff000 r15: 0x00000000_00000000
rip: 0x00000000_0010261c
eflags 0x00000046: id vip vif ac vm rf nt IOPL=0 of df if tf sf ZF af PF cf
(0) [0x000000000010261c] 0008:000000000010261c (unk. ctxt): movsxd rax, ebx ; 4863c3
<bochs:6>
Next at t=304278403
CPU0:
rax: 0x00000000_00000000 rcx: 0x00000000_00000001
rdx: 0x80000000_00000000 rbx: 0x00000000_00000000
rsp: 0x00000000_0020c970 rbp: 0x00000000_00000090
rsi: 0xffffffff_fffff000 rdi: 0x00000000_000001ff
r8 : 0x00000000_00000000 r9 : 0x00000000_00000001
r10: 0x00000000_00000004 r11: 0x00000000_00000000
r12: 0x00000000_00000000 r13: 0x00000000_00000000
r14: 0x000fffff_fffff000 r15: 0x00000000_00000000
rip: 0x00000000_0010261f
eflags 0x00000046: id vip vif ac vm rf nt IOPL=0 of df if tf sf ZF af PF cf
(0) [0x000000000010261f] 0008:000000000010261f (unk. ctxt): mov edi, ebx ; 89df
<bochs:7>
Next at t=304278404
CPU0:
rax: 0x00000000_00000000 rcx: 0x00000000_00000001
rdx: 0x80000000_00000000 rbx: 0x00000000_00000000
rsp: 0x00000000_0020c970 rbp: 0x00000000_00000090
rsi: 0xffffffff_fffff000 rdi: 0x00000000_00000000
r8 : 0x00000000_00000000 r9 : 0x00000000_00000001
r10: 0x00000000_00000004 r11: 0x00000000_00000000
r12: 0x00000000_00000000 r13: 0x00000000_00000000
r14: 0x000fffff_fffff000 r15: 0x00000000_00000000
rip: 0x00000000_00102621
eflags 0x00000046: id vip vif ac vm rf nt IOPL=0 of df if tf sf ZF af PF cf
(0) [0x0000000000102621] 0008:0000000000102621 (unk. ctxt): mov rdx, rax ; 4889c2
<bochs:8>
Next at t=304278405
CPU0:
rax: 0x00000000_00000000 rcx: 0x00000000_00000001
rdx: 0x00000000_00000000 rbx: 0x00000000_00000000
rsp: 0x00000000_0020c970 rbp: 0x00000000_00000090
rsi: 0xffffffff_fffff000 rdi: 0x00000000_00000000
r8 : 0x00000000_00000000 r9 : 0x00000000_00000001
r10: 0x00000000_00000004 r11: 0x00000000_00000000
r12: 0x00000000_00000000 r13: 0x00000000_00000000
r14: 0x000fffff_fffff000 r15: 0x00000000_00000000
rip: 0x00000000_00102624
eflags 0x00000046: id vip vif ac vm rf nt IOPL=0 of df if tf sf ZF af PF cf
(0) [0x0000000000102624] 0008:0000000000102624 (unk. ctxt): mov qword ptr ss:[rsp+96], rax ; 4889442460
<bochs:9>
[CPU0 WR]: LIN 0x000000000020c9d0 PHY 0x000000000020c9d0 (len=8, pl=0): 0x00000000 0x00000000
Next at t=304278406
CPU0:
rax: 0x00000000_00000000 rcx: 0x00000000_00000001
rdx: 0x00000000_00000000 rbx: 0x00000000_00000000
rsp: 0x00000000_0020c970 rbp: 0x00000000_00000090
rsi: 0xffffffff_fffff000 rdi: 0x00000000_00000000
r8 : 0x00000000_00000000 r9 : 0x00000000_00000001
r10: 0x00000000_00000004 r11: 0x00000000_00000000
r12: 0x00000000_00000000 r13: 0x00000000_00000000
r14: 0x000fffff_fffff000 r15: 0x00000000_00000000
rip: 0x00000000_00102629
eflags 0x00000046: id vip vif ac vm rf nt IOPL=0 of df if tf sf ZF af PF cf
(0) [0x0000000000102629] 0008:0000000000102629 (unk. ctxt): mov rax, qword ptr ds:[rax*8-4096] ; 488b04c500f0ffff
<bochs:10>
[CPU0 RD]: PHY 0x0000000000a08ff8 (len=8): 0x80000000 0x00A0840B ; PML4E
[CPU0 RD]: LIN 0x00000000002121e0 PHY 0x00000000002121e0 (len=8, pl=0): 0x00108E00 0x0008868C
[CPU0 RD]: LIN 0x00000000002121e8 PHY 0x00000000002121e8 (len=8, pl=0): 0x00000000 0x00000000
[CPU0 RD]: LIN 0x00000000002120c8 PHY 0x00000000002120c8 (len=8, pl=0): 0x00AF9B00 0x0000FFFF
[CPU0 WR]: LIN 0x000000000020c968 PHY 0x000000000020c968 (len=8, pl=0): 0x00000000 0x00000010
[CPU0 WR]: LIN 0x000000000020c960 PHY 0x000000000020c960 (len=8, pl=0): 0x00000000 0x0020C970
[CPU0 WR]: LIN 0x000000000020c958 PHY 0x000000000020c958 (len=8, pl=0): 0x00000000 0x00010046
[CPU0 WR]: LIN 0x000000000020c950 PHY 0x000000000020c950 (len=8, pl=0): 0x00000000 0x00000008
[CPU0 WR]: LIN 0x000000000020c948 PHY 0x000000000020c948 (len=8, pl=0): 0x00000000 0x00102629
[CPU0 WR]: LIN 0x000000000020c940 PHY 0x000000000020c940 (len=8, pl=0): 0x00000000 0x00000009
Next at t=304278407
CPU0:
rax: 0x00000000_00000000 rcx: 0x00000000_00000001
rdx: 0x00000000_00000000 rbx: 0x00000000_00000000
rsp: 0x00000000_0020c940 rbp: 0x00000000_00000090
rsi: 0xffffffff_fffff000 rdi: 0x00000000_00000000
r8 : 0x00000000_00000000 r9 : 0x00000000_00000001
r10: 0x00000000_00000004 r11: 0x00000000_00000000
r12: 0x00000000_00000000 r13: 0x00000000_00000000
r14: 0x000fffff_fffff000 r15: 0x00000000_00000000
rip: 0x00000000_0010868c
eflags 0x00000046: id vip vif ac vm rf nt IOPL=0 of df if tf sf ZF af PF cf
(0) [0x000000000010868c] 0008:000000000010868c (unk. ctxt): push 0x000000000000000e ; 6a0e
<bochs:11> q
CPU0:
rax: 0x00000000_00000000 rcx: 0x00000000_00000001
rdx: 0x00000000_00000000 rbx: 0x00000000_00000000
rsp: 0x00000000_0020c940 rbp: 0x00000000_00000090
rsi: 0xffffffff_fffff000 rdi: 0x00000000_00000000
r8 : 0x00000000_00000000 r9 : 0x00000000_00000001
r10: 0x00000000_00000004 r11: 0x00000000_00000000
r12: 0x00000000_00000000 r13: 0x00000000_00000000
r14: 0x000fffff_fffff000 r15: 0x00000000_00000000
rip: 0x00000000_0010868c
eflags 0x00000046: id vip vif ac vm rf nt IOPL=0 of df if tf sf ZF af PF cf
(0).[304278407] [0x000000000010868c] 0008:000000000010868c (unk. ctxt): push 0x000000000000000e ; 6a0e
Wie man sieht, greift die CPU auf die erste Tabelle zu und dann gibt es den Fehler, obwohl nichts falsch ist. Der Eintrag sieht ohne Optimierung genau gleich aus.