Autor Thema: Problem mit Paging  (Gelesen 5778 mal)

OsDevNewbie

  • Beiträge: 282
    • Profil anzeigen
    • YourOS Kernel
Gespeichert
« am: 11. August 2013, 20:36 »
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:
mov    -0x1000(,%rax,8),%rax
In %rax steht 0 drinnen. Die dazugehörigen Code-Zeilen in Assembler sind folgende (Fehler an der Addresse 0x102629):
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:
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.
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: 11. August 2013, 21:01 »
Wie sind PML4e, PDPe, PDe, PTe und VMM_PML4_ADDRESS definiert?
Dieser Text wird unter jedem Beitrag angezeigt.

OsDevNewbie

  • Beiträge: 282
    • Profil anzeigen
    • YourOS Kernel
Gespeichert
« Antwort #2 am: 11. August 2013, 21:16 »
PML4e = 1;
PDPe = 4;
PDe = 0x200;
PTe = 0x200;

da: KERNELSPACE_END = (0x100000000 - 1),
Ausschnitt aus paging.h:
#define PG_PML4_INDEX 0xFF8000000000
#define PG_PDP_INDEX 0x7FC0000000
#define PG_PD_INDEX 0x3FE00000
#define PG_PT_INDEX 0x1FF000

PML4 =0xFFFFFFFFFFFFF000;
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

Svenska

  • Beiträge: 1 792
    • Profil anzeigen
Gespeichert
« Antwort #3 am: 12. August 2013, 00:07 »
Fehler durch Optimierungen sind meist vergessene volatiles oder sowas in der Art.

Stelle mal sicher, dass dein Inline-Assembler auch korrekt im Binary auftaucht und nicht umsortiert (oder der Block wegsortiert) wurde. Gleiches gilt für die Variablen, die du dadrin verwendest.

MNemo

  • Beiträge: 547
    • Profil anzeigen
Gespeichert
« Antwort #4 am: 12. August 2013, 09:50 »
Auf welche nicht vorhandene Adresse will er den Zugreifen? (steht bei der exception in cr2 )
Mir sieht der Code Korrekt aus, wenn VMM_PML4_ADDRESS = 0xFFFFFFFFFFFFF000; gewollt ist. (Die AssemblerZeile enspricht PML4->PML4e[PML4i]; mit rax = PML4i)
Das wird auch die Adresse sein die nicht gemapt ist, oder?

Dein Fehler wird wohl beim mapping liegen.
Also in der 'setPML4Entry' wenn ich dessen Funktion richtig deute.

sind VMM_POINTER_TO_PML4 und VMM_PML4_ADDRESS das gleiche?
« Letzte Änderung: 12. August 2013, 09:52 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 #5 am: 12. August 2013, 15:53 »
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.
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: 12. August 2013, 16:15 »
Die Funktion setPML4Entry() funktioniert richtig.
Dann würde ein zugriff auf die besagte Adresse keinen #PF auslösen, (zumindest nicht wenn man nach dem Aufruf ohne weiteres auf die neu gemappte adresse zugreifen können sollte).

Ich nehme an du hast am ende der Funktion einen wenig inline-asm ohne volatile, der wegoptimiert wird. Aber das ist jetzt geraten.
„Wichtig ist nicht, besser zu sein als alle anderen. Wichtig ist, besser zu sein als du gestern warst!“

Jidder

  • Administrator
  • Beiträge: 1 625
    • Profil anzeigen
Gespeichert
« Antwort #7 am: 12. August 2013, 16:33 »
Ja, ich könnte mir vorstellen, dass ein TLB Flush wegoptimiert wird oder gar nicht vorhanden war.
Dieser Text wird unter jedem Beitrag angezeigt.

OsDevNewbie

  • Beiträge: 282
    • Profil anzeigen
    • YourOS Kernel
Gespeichert
« Antwort #8 am: 12. August 2013, 18:09 »
Dies ist die Funktion, die den TLB löscht und die Funktion, die einen TLB Eintrag löscht:
inline void pg_InvalidateTLBEntry(void *Address)
{
asm volatile("invlpg (%0)" : :"r" (Address));
}

inline void pg_FlushTLB()
{
asm volatile("mov %cr3,%rax; mov %rax,%cr3;");
}
Das kann es also nicht sein, denn dort ist ein "asm volatile"!

Die Funktion setPML4Entry() funktioniert richtig.
Dann würde ein zugriff auf die besagte Adresse keinen #PF auslösen, (zumindest nicht wenn man nach dem Aufruf ohne weiteres auf die neu gemappte adresse zugreifen können sollte).
Es gibt aber trotzdem einen #PF. Schau dir mal das Ende des Bochs-Logs an.
Trotzdem Danke für eure Hilfe. Ich werde weiter knobeln.
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

kevin

  • Administrator
  • Beiträge: 2 767
    • Profil anzeigen
Gespeichert
« Antwort #9 am: 12. August 2013, 19:42 »
   asm volatile("mov %cr3,%rax; mov %rax,%cr3;");
Das hat zwar vermutlich nichts mit deinem aktuellen Problem zu tun, aber bevor es dich an einer anderen Stelle erwischt: Wenn du sowas machst, musst du rax clobbern.
Thou shalt not follow the NULL pointer, for chaos and madness await thee at its end.

OsDevNewbie

  • Beiträge: 282
    • Profil anzeigen
    • YourOS Kernel
Gespeichert
« Antwort #10 am: 14. August 2013, 15:11 »
Ein kleines Update zu meinem Problem:
Ich habe ein bisschen rumprobiert und folgende Sachen kamen heraus:
  • Der Fehler erscheint nur beim Optimierungsgrad 3 beim Optimieren 0,1,2 und nach Grösse (s) funktioniert alles einwancfrei
  • Zudem erscheint der Fehler auch nur bei VMWare und bei Bochs. In VirtualBox und Qemu funktioniert alles einwandfrei

Ich verstehe immer noch nicht was das Problem ist. Hat keiner von euch eine Idee?
Trotzdem Danke für die bisherigen Antworten und Vorschläge.
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

Svenska

  • Beiträge: 1 792
    • Profil anzeigen
Gespeichert
« Antwort #11 am: 14. August 2013, 17:33 »
Ich habe nur ein paar Vorschläge, um den Fehler etwas einzugrenzen...
- alles mit O3 kompilieren und je eine Datei mit O2, um den Fehler auf eine Datei einzugrenzen
- diese Datei mit O3 und je einem abgeschalteten Optimizer kompilieren
- die Unterschiede vergleichen

Kann man das Optimierlevel eigentlich für einzelne Funktionen ändern? (#pragma oder so)

MNemo

  • Beiträge: 547
    • Profil anzeigen
Gespeichert
« Antwort #12 am: 14. August 2013, 18:29 »
„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 #13 am: 15. August 2013, 17:22 »
Ich habe jetzt von gcc Version 4.4.3 auf gcc 4.8.1 geupgraded und jetzt funktioniert es plötzlich. :?
Ganz komisch.
Aber trotzdem Danke an euch allen, die mir geholfen haben.
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