Autor Thema: Fehler bei PIC oder IRQ, aber wo/was genau??  (Gelesen 4812 mal)

RedEagle

  • Beiträge: 244
    • Profil anzeigen
    • RedEagle-OperatingSystem - Projekt
Gespeichert
« am: 25. December 2005, 11:17 »
Erstmal generelles ablauf
1. In den PMODE wechseln
2. Zum CKernel Springen
3. Interrupts ausschalten (wurde vorher auch schonmal gemacht, aber zur sicherheit nochmal, da zwischen dem 1. Ausschalten (PMODE) und dem Kernel noch ne menge Passiert/Passieren soll)
4. PIC
5. IRQa ausschalten (0xFF)
6. IDT "bauen"
7. Interrupts einschalten
8. IRQs aktivieren (0x00)

Fehler
Bist einschlißlich Punkt 7 Läuft alles wie es soll (zumindest passiert nichts ungewöhnliches)
Nach Punkt 8 Startet bochs neu.

Ausgabe der Konsole bei bochs
***e[CPU0 ] exception(): 3rd (13) exception with no resolution, shutdown status is 00h, resetting
***i[SYS  ] bx_pc_system_c::Reset(SOFTWARE) called
***i[APIC0] local apic in CPU apicid=00 initializing
***i[BIOS ]  rombios.c,v 1.138.2.1 2005/07/06 19:30:36 vruppert Exp $
***i[KBD  ] reset-disable command received
VGABios &Id: vgabios.c,v 1.62 2005/07/02 18:39:43 vruppert Exp $
***i[CLVGA] VBE known Display Interface b0c0
***i[CLVGA] VBE known Display Interface b0c3
***i[VBIOS] VBE Bios $Id: vbe.c,v 1.47 2005/05/24 16:50:50 vruppert Exp $


Frage
Wo muss ich nach dem Fehler suchen, was läuft falsch??
Könnte der Fehler beim laden der IDT auftreten??

bluecode

  • Beiträge: 1 391
    • Profil anzeigen
    • lightOS
Gespeichert
« Antwort #1 am: 25. December 2005, 11:28 »
Zitat von: RedEagle
Wo muss ich nach dem Fehler suchen, was läuft falsch??
Könnte der Fehler beim laden der IDT auftreten??


Ich würde sagen der Fehler ist in der IDT. Lädts du die IDT korrekt bzw. die Korrekte Basisadresse (va. wenn Paging aktiviert wird)/Größe? Sind die Deskriptoren in der IDT korrekt?

Hoffentlich konnte ich helfen :!:
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: 26. December 2005, 10:27 »
Danke, du hast mir gut geholfen.

Aber neues Problem:
Wieder ein Problem mit Globalen Variablen.
Wenn ich ein Array mit 2 Elementen (Global) haben möchte:
DWORD  idtr[2] = {0,0};
Wird "idtr" vom Linker nicht erkannt
Wenn ich nur einen einfachen Pointer verwende:
DWORD *idtr;
macht der linker kein Probem.

Allerdings finde ich es eher weniger gut, einen Pointer irgendwohin zeigen zu lassen.
Woran liegt das??
PS.: Wenn ich ein lokale Array static machen möchte passiert ähnliches.
Warum hasst mein linker Arrays??

bluecode

  • Beiträge: 1 391
    • Profil anzeigen
    • lightOS
Gespeichert
« Antwort #3 am: 26. December 2005, 12:23 »
hi,

könntest du vllt den entsprechenden Code bzw. die Aufteilung in verschiedene Quellcodedateien posten :?:
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: 26. December 2005, 16:58 »
Es scheint nicht am Code zu liegen, sondern ein generelles Problem zu sein:
Aber in diesem Fall tritt der Fehler hier auf:
__asm__ __volatile__ ("LIDT (%0) ": :"g" ((char*)idtr+2));

Meine "Generelle" aufteilung:

Header:
#ifndef HEADERXY
#define HEADERXY

#define xy ab

namespace name
{
 void funktion();
}

#endif


Codefile:
#include "headerxy.hpp"

int x; //OK
int *y; //OK
int z[2]; //FEHLER !?

namespace name
{

 void funktion()
 {
  x = 1; //OK
  z[0] = x; //LINER-ERROR
  *y = 2; //OK
  z[1] = 3; //LINER-ERROR
  return;
 }

}

 

Einloggen