Autor Thema: Reboot nach lesen eines Registers?!?  (Gelesen 7179 mal)

RedEagle

  • Beiträge: 244
    • Profil anzeigen
    • RedEagle-OperatingSystem - Projekt
Gespeichert
« am: 25. August 2007, 11:55 »
Hi, wenn ich folgenden code ausführe gibts ein reboot:

DWORD cr4()
{
   unsigned int cr4;
    asm volatile ("movl %%cr4, %0" : "=a" (cr4));
   return cr4;
}

Der folgende code hingegen funktioniert:
DWORD cr0()
{
   unsigned int cr0;
    asm volatile ("movl %%cr0, %0" : "=a" (cr0));
   return cr0;
}

was ist oben falsch, was unten richtig ist??

CPU: Cyrix 6x86

bluecode

  • Beiträge: 1 391
    • Profil anzeigen
    • lightOS
Gespeichert
« Antwort #1 am: 25. August 2007, 12:00 »
geht das?
asm volatile("mov %%crX, %%eax":"=a" (crX));
edit: Mal abgesehen davon, was sagt den bochs wegen des reboots? :wink:
lightOS
"Überlegen sie mal 'nen Augenblick, dann lösen sich die ganzen Widersprüche auf. Die Wut wird noch größer, aber die intellektuelle Verwirrung lässt nach.", Georg Schramm

RedEagle

  • Beiträge: 244
    • Profil anzeigen
    • RedEagle-OperatingSystem - Projekt
Gespeichert
« Antwort #2 am: 25. August 2007, 12:02 »
Bei cr0 gibg es auch, zudem ist des nicht in "", und somit kein asm-code,,,

Werds mal eben testen...

--[edit]--

DWORD cr4()
{
   unsigned int reg;
    asm volatile ("movl %%cr4, %0" : "=a" (reg));
   return reg;
}

selbes problem, der name ist also nicht verantwortlich...

zu bochs:
bis zum neustart, ununterbrochen diese meldung:
[FDD  ] read() on floppy image return 0
wobei die exception nicht auflistet ist, da danach das logfile sofort wider geleert wird :(
« Letzte Änderung: 25. August 2007, 12:07 von RedEagle »

bluecode

  • Beiträge: 1 391
    • Profil anzeigen
    • lightOS
Gespeichert
« Antwort #3 am: 25. August 2007, 12:10 »
Mir ging eigentlich eher um das %%eax statt dem %0... oder hab ich dich jetzt falsch verstanden?
lightOS
"Überlegen sie mal 'nen Augenblick, dann lösen sich die ganzen Widersprüche auf. Die Wut wird noch größer, aber die intellektuelle Verwirrung lässt nach.", Georg Schramm

RedEagle

  • Beiträge: 244
    • Profil anzeigen
    • RedEagle-OperatingSystem - Projekt
Gespeichert
« Antwort #4 am: 25. August 2007, 12:18 »
ändert auch nichts...

bluecode

  • Beiträge: 1 391
    • Profil anzeigen
    • lightOS
Gespeichert
« Antwort #5 am: 25. August 2007, 12:18 »
Ach noch was: Der Cyrix 6x86 unterstützt so wie ich das seh kein Register cr4 (laut "PC Hardwarebuch"). Aber trotzdem sollte bochs das können. Es sei den du hast ihn dazu gebracht einen cyrix 6x86 oder nen 386/486 zu emulieren. Aber kA inwieweit ersteres möglich ist...
lightOS
"Überlegen sie mal 'nen Augenblick, dann lösen sich die ganzen Widersprüche auf. Die Wut wird noch größer, aber die intellektuelle Verwirrung lässt nach.", Georg Schramm

RedEagle

  • Beiträge: 244
    • Profil anzeigen
    • RedEagle-OperatingSystem - Projekt
Gespeichert
« Antwort #6 am: 25. August 2007, 12:45 »
Ich habe jetzt bochs unter linux eingerichtet, und dort funktionierts.
Trotzedem danke.

Ach noch was: Der Cyrix 6x86 unterstützt so wie ich das seh kein Register cr4[...]
:-o   :?


bluecode

  • Beiträge: 1 391
    • Profil anzeigen
    • lightOS
Gespeichert
« Antwort #7 am: 25. August 2007, 13:08 »
 :? Es wird auch bei den Intel CPUs erst ab dem Pentium unterstützt... Ich nehme mal an, dass Cyrix dann eine invalid opcode exception schmeißt und wenn man die nicht fängt dann nähert man sich halt bedenklich nahe dem Tripple Fault :mrgreen:
lightOS
"Überlegen sie mal 'nen Augenblick, dann lösen sich die ganzen Widersprüche auf. Die Wut wird noch größer, aber die intellektuelle Verwirrung lässt nach.", Georg Schramm

RedEagle

  • Beiträge: 244
    • Profil anzeigen
    • RedEagle-OperatingSystem - Projekt
Gespeichert
« Antwort #8 am: 26. August 2007, 14:58 »
so, jetzt ist mit cr4 alles i.o. (unter bochs) aber cr3 machnt nun Probleme:

Ich schreibe die Adresse des PDs nach cr3, wenn ich cr3 dann auslese, habe ich 0x00000000 drinn stehen.

cpu::cr3((DWORD)KernelPageDirectory);
 DWORD cr3chk = cpu::cr3();
 if(cr3chk != (DWORD)KernelPageDirectory)
 {
  return PGERR_FATALERROR;
 }

KernelPageDirectory ist global:
DWORD *KernelPageDirectory = (DWORD*)0x400000;
cpu::cr3 ist wie bei cr4 und 0 auch:
void cr3(DWORD cr3)
{
     asm volatile("movl %%eax, %%cr3" : "=a" (cr3));
}

DWORD cr3()
{
   unsigned int cr3;
    asm volatile ("movl %%cr3, %%eax" : "=a" (cr3));
   return cr3;
}

ps.: Natürlich jetzt unter bochs ausgeführt  :cry:

FreakyPenguin

  • Administrator
  • Beiträge: 301
    • Profil anzeigen
    • toni.famkaufmann.info
Gespeichert
« Antwort #9 am: 26. August 2007, 15:15 »
Jo, der Code zum setzen ist ja auch falsch ;-)

Es muss so aussehen:
void cr3(DWORD cr3)
{
     asm volatile("movl %%eax, %%cr3" : : "a" (cr3));
}

Mehr dazu auf: http://lowlevel.brainsware.org/wiki/index.php/Inline-Assembler_mit_GCC

RedEagle

  • Beiträge: 244
    • Profil anzeigen
    • RedEagle-OperatingSystem - Projekt
Gespeichert
« Antwort #10 am: 26. August 2007, 18:08 »
Das wars, danke.

Was mich allerdings verwirrt, das schreiben in cr4 schien zu funktionieren (laut hexdump von bochs), und das im prinzip der gleiche code  :?

naja, so läufts auf jeden fall, und es mach auch noch sinn ;)

Hauptsache paging läuft, auch wenn es erstmal nur im emulator ist :(
zum glück habe ich in einer woche ein Pentium 3 zum testen  :evil:
« Letzte Änderung: 26. August 2007, 18:10 von RedEagle »

 

Einloggen