Hallo,
ich ein sehr kompliziertes Problem. Wenn ich mein Kernel mit dem Optimierungsflags "-03" compiliere, bekomme ich einen Pagefault in der Initialisierungsroutine meiner virtuellen Speicherverwaltung. Die Instruktion an der Addresse ist:
Die dazugehörigen C-Zeilen sind folgende:
Kann mir einer bitte sagen, was hier falsch läuft? Ohne Optimierungen läuft es einwandfrei.
Ich hoffe jemand macht sich die Mühe und schaut sich den Code an
.
Wenn jemand noch Verbesserungsvorschläge findet, kann er diese natürlich mitteilen.
Ich danke euch.
ich ein sehr kompliziertes Problem. Wenn ich mein Kernel mit dem Optimierungsflags "-03" compiliere, bekomme ich einen Pagefault in der Initialisierungsroutine meiner virtuellen Speicherverwaltung. Die Instruktion an der Addresse ist:
Code: [Auswählen]
mov -0x1000(,%rax,8),%rax
In %rax steht 0 drinnen. Die dazugehörigen Code-Zeilen in Assembler sind folgende (Fehler an der Addresse 0x102629):Code: [Auswählen]
0000000000102570 <vmm_Init>:
102570: 41 57 push %r15
102572: 41 b9 01 00 00 00 mov $0x1,%r9d
102578: 45 31 c0 xor %r8d,%r8d
10257b: 0f 20 de mov %cr3,%rsi
10257e: 41 56 push %r14
102580: 49 be 00 f0 ff ff ff mov $0xffffffffff000,%r14
102587: ff 0f 00
10258a: b9 01 00 00 00 mov $0x1,%ecx
10258f: 4c 21 f6 and %r14,%rsi
102592: ba 01 00 00 00 mov $0x1,%edx
102597: 41 55 push %r13
102599: 41 54 push %r12
10259b: 55 push %rbp
10259c: 53 push %rbx
10259d: 48 81 ec 88 00 00 00 sub $0x88,%rsp
1025a4: 48 89 7c 24 78 mov %rdi,0x78(%rsp)
1025a9: bf ff 01 00 00 mov $0x1ff,%edi
1025ae: 48 89 74 24 20 mov %rsi,0x20(%rsp)
1025b3: c7 44 24 18 01 00 00 movl $0x1,0x18(%rsp)
1025ba: 00
1025bb: c7 44 24 10 02 00 00 movl $0x2,0x10(%rsp)
1025c2: 00
1025c3: c7 44 24 08 00 00 00 movl $0x0,0x8(%rsp)
1025ca: 00
1025cb: c7 04 24 00 00 00 00 movl $0x0,(%rsp)
1025d2: e8 29 e7 ff ff callq 100d00 <setPML4Entry>
1025d7: 66 c7 05 40 fa 10 00 movw $0x1,0x10fa40(%rip) # 212020 <PML4e>
1025de: 01 00
1025e0: 66 c7 05 39 fa 10 00 movw $0x4,0x10fa39(%rip) # 212022 <PDPe>
1025e7: 04 00
1025e9: 66 c7 05 32 fa 10 00 movw $0x200,0x10fa32(%rip) # 212024 <PDe>
1025f0: 00 02
1025f2: 66 c7 05 2b fa 10 00 movw $0x200,0x10fa2b(%rip) # 212026 <PTe>
1025f9: 00 02
1025fb: 66 c7 44 24 6e 00 00 movw $0x0,0x6e(%rsp)
102602: 0f b7 5c 24 6e movzwl 0x6e(%rsp),%ebx
102607: 45 31 c0 xor %r8d,%r8d
10260a: 48 c7 c6 00 f0 ff ff mov $0xfffffffffffff000,%rsi
102611: 41 b9 01 00 00 00 mov $0x1,%r9d
102617: b9 01 00 00 00 mov $0x1,%ecx
10261c: 48 63 c3 movslq %ebx,%rax
10261f: 89 df mov %ebx,%edi
102621: 48 89 c2 mov %rax,%rdx
102624: 48 89 44 24 60 mov %rax,0x60(%rsp)
102629: 48 8b 04 c5 00 f0 ff mov -0x1000(,%rax,8),%rax
102630: ff
102631: 48 8b 14 d5 00 f0 ff mov -0x1000(,%rdx,8),%rdx
102638: ff
102639: c7 44 24 18 00 00 00 movl $0x0,0x18(%rsp)
102640: 00
102641: c7 44 24 10 01 00 00 movl $0x1,0x10(%rsp)
102648: 00
102649: c7 44 24 08 00 00 00 movl $0x0,0x8(%rsp)
102650: 00
102651: 4c 21 f0 and %r14,%rax
102654: c7 04 24 00 00 00 00 movl $0x0,(%rsp)
10265b: 83 e2 01 and $0x1,%edx
10265e: 48 89 44 24 20 mov %rax,0x20(%rsp)
102663: e8 98 e6 ff ff callq 100d00 <setPML4Entry>
...
Die dazugehörigen C-Zeilen sind folgende:
Code: [Auswählen]
bool vmm_Init(uint64_t Speicher, uintptr_t Stack)
{
uintptr_t mapEnd;
uint64_t cr3, i;
volatile PML4_t *PML4;
volatile PDP_t *PDP;
volatile PD_t *PD;
volatile PT_t *PT;
uint16_t PML4i, PDPi, PDi, PTi;
asm("mov %%cr3,%0" : "=r" (cr3));
PML4 = (PML4_t*)(cr3 & 0xFFFFFFFFFF000); //nur die Adresse wollen wir haben
//Lasse den letzten Eintrag der PML4 auf die PML4 selber zeigen
setPML4Entry(511, PML4, 1, 1, 0, 1, 0, 0, VMM_POINTER_TO_PML4, 1, (uintptr_t)PML4);
//Page-Tables für den Adressraum 0 bis 4GB erstellen, für Kernel
//Wieviele Einträge müssen für den Kernel reserviert werden?
PML4e = ((KERNELSPACE_END & PG_PML4_INDEX) >> 39) + 1;
PDPe = ((KERNELSPACE_END & PG_PDP_INDEX) >> 30) + 1;
PDe = ((KERNELSPACE_END & PG_PD_INDEX) >> 21) + 1;
PTe = ((KERNELSPACE_END & PG_PT_INDEX) >> 12) + 1;
PML4 = (PML4_t*)VMM_PML4_ADDRESS;
//PML4 anpassen
for(PML4i = 0; PML4i < PML4e; PML4i++)
{
setPML4Entry(PML4i, PML4, PML4->PML4E[PML4i] & PG_P, 1, 0, 1, 0, 0, VMM_KERNELSPACE, 0, PML4->PML4E[PML4i] & PG_ADDRESS);
...
Kann mir einer bitte sagen, was hier falsch läuft? Ohne Optimierungen läuft es einwandfrei.
Ich hoffe jemand macht sich die Mühe und schaut sich den Code an
.Wenn jemand noch Verbesserungsvorschläge findet, kann er diese natürlich mitteilen.
Ich danke euch.

Übersicht
Wiki
Hilfe
Suche
Einloggen
Registrieren
Drucken


Gespeichert
