Autor Thema: Multitasking - Fehler?  (Gelesen 4306 mal)

osDeveloper93

  • Beiträge: 31
    • Profil anzeigen
    • Homepage
Gespeichert
« am: 13. February 2010, 13:32 »
Hallo,

ich hab ein Problem.
Wenn ich mein OS starte, funktioniert es bei QEMU und bei VM sehr gut.
Jedoch, und das verwirrt mich, klappt es nicht in Bochs und an einem echten PC.

Ich weiß, dass die Emulatoren nicht immer die Realität nach simulieren. Aber so große Unterschiede habe ich auch nicht erwartet.

Ich zeig euch mal die Bochs ausgaben:
...
00000000000i[XGUI ] [x] Mouse off
00000003305i[BIOS ] $Revision: 1.235 $ $Date: 2009/09/28 16:36:02 $
00000320074i[KBD  ] reset-disable command received
00000449796i[VBIOS] VGABios $Id: vgabios.c,v 1.69 2009/04/07 18:18:20 vruppert Exp $
00000449867i[VGA  ] VBE known Display Interface b0c0
00000449899i[VGA  ] VBE known Display Interface b0c5
00000452824i[VBIOS] VBE Bios $Id: vbe.c,v 1.62 2009/01/25 15:46:25 vruppert Exp $
00000759385i[BIOS ] Starting rombios32
00000759882i[BIOS ] Shutdown flag 0
00000760563i[BIOS ] ram_size=0x08000000
00000761068i[BIOS ] ram_end=128MB
00000773694i[BIOS ] Found 1 cpu(s)
00000792819i[BIOS ] bios_table_addr: 0x000fba98 end=0x000fcc00
00000792927i[PCI  ] 440FX PMC write to PAM register 59 (TLB Flush)
00001120624i[PCI  ] 440FX PMC write to PAM register 59 (TLB Flush)
00001448552i[P2I  ] PCI IRQ routing: PIRQA# set to 0x0b
00001448573i[P2I  ] PCI IRQ routing: PIRQB# set to 0x09
00001448594i[P2I  ] PCI IRQ routing: PIRQC# set to 0x0b
00001448615i[P2I  ] PCI IRQ routing: PIRQD# set to 0x09
00001448625i[P2I  ] write: ELCR2 = 0x0a
00001449510i[BIOS ] PIIX3/PIIX4 init: elcr=00 0a
00001457468i[BIOS ] PCI: bus=0 devfn=0x00: vendor_id=0x8086 device_id=0x1237 class=0x0600
00001460030i[BIOS ] PCI: bus=0 devfn=0x08: vendor_id=0x8086 device_id=0x7000 class=0x0601
00001462431i[BIOS ] PCI: bus=0 devfn=0x09: vendor_id=0x8086 device_id=0x7010 class=0x0101
00001462661i[PIDE ] new BM-DMA address: 0xc000
00001463365i[BIOS ] region 4: 0x0000c000
00001465675i[BIOS ] PCI: bus=0 devfn=0x0b: vendor_id=0x8086 device_id=0x7113 class=0x0680
00001465913i[ACPI ] new irq line = 11
00001465927i[ACPI ] new irq line = 9
00001465957i[ACPI ] new PM base address: 0xb000
00001465971i[ACPI ] new SM base address: 0xb100
00001465999i[PCI  ] setting SMRAM control register to 0x4a
00001630093i[CPU0 ] Enter to System Management Mode
00001630104i[CPU0 ] RSM: Resuming from System Management Mode
00001794124i[PCI  ] setting SMRAM control register to 0x0a
00001803293i[BIOS ] MP table addr=0x000fbb70 MPC table addr=0x000fbaa0 size=0xd0
00001805235i[BIOS ] SMBIOS table addr=0x000fbb80
00001807619i[BIOS ] ACPI tables: RSDP addr=0x000fbc90 ACPI DATA addr=0x07ff0000 size=0x988
00001810858i[BIOS ] Firmware waking vector 0x7ff00cc
00001821971i[PCI  ] 440FX PMC write to PAM register 59 (TLB Flush)
00001822815i[BIOS ] bios_table_cur_addr: 0x000fbcb4
00003000000i[XGUI ] charmap update. Font Height is 16
00121382794i[BIOS ] Booting from 0000:7c00
00146261107i[BIOS ] int13_harddisk: function 41, unmapped device for ELDL=80
00146265884i[BIOS ] int13_harddisk: function 08, unmapped device for ELDL=80
00146270536i[BIOS ] *** int 15h function AX=00c0, BX=0000 not yet supported!
00185873207i[CPU0 ] math_abort: MSDOS compatibility FPU exception
00185873216i[CPU0 ] math_abort: MSDOS compatibility FPU exception
...
00185886113i[CPU0 ] math_abort: MSDOS compatibility FPU exception
00185886114i[CPU0 ] math_abort: MSDOS compatibility FPU exception
00233730000i[FDD  ] fd0:/*PFAD ZUM FLOPPY IMAGE*/ ro=0, h=2,t=80,spt=18
00528000000p[XGUI ] >>PANIC<< POWER button turned off.
00528000000i[CPU0 ] CPU is in protected mode (active)
00528000000i[CPU0 ] CS.d_b = 32 bit
00528000000i[CPU0 ] SS.d_b = 32 bit
00528000000i[CPU0 ] | EAX=00105360  EBX=00000000  ECX=0010535f  EDX=00000700
00528000000i[CPU0 ] | ESP=001fff24  EBP=001fff4c  ESI=00000000  EDI=00000000
00528000000i[CPU0 ] | IOPL=0 id vip vif ac vm rf nt of df if tf sf ZF af PF cf
00528000000i[CPU0 ] | SEG selector     base    limit G D
00528000000i[CPU0 ] | SEG sltr(index|ti|rpl)     base    limit G D
00528000000i[CPU0 ] |  CS:0008( 0001| 0|  0) 00000000 ffffffff 1 1
00528000000i[CPU0 ] |  DS:0010( 0002| 0|  0) 00000000 ffffffff 1 1
00528000000i[CPU0 ] |  SS:0010( 0002| 0|  0) 00000000 ffffffff 1 1
00528000000i[CPU0 ] |  ES:0010( 0002| 0|  0) 00000000 ffffffff 1 1
00528000000i[CPU0 ] |  FS:0010( 0002| 0|  0) 00000000 ffffffff 1 1
00528000000i[CPU0 ] |  GS:0010( 0002| 0|  0) 00000000 ffffffff 1 1
00528000000i[CPU0 ] | EIP=00101b84 (00101b84)
00528000000i[CPU0 ] | CR0=0x60000011 CR2=0x00000000
00528000000i[CPU0 ] | CR3=0x00000000 CR4=0x00000000
00528000000i[CPU0 ] 0x00101b84>> jmp .+0xfffffffe (0x00101b84) : EBFE
00528000000i[CMOS ] Last time is 1266062994 (Sat Feb 13 13:09:54 2010)
00528000000i[XGUI ] Exit
00528000000i[     ] restoring default signal behavior
00528000000i[CTRL ] quit_sim called with exit code 1

Wieso geht es nicht... :?
Ich glaub es bestehen irgendwelche Probleme mit dem Stack (Beim Taskwechsel).

Ich hoffe ihr könnt mir helfen :cry:

Ah ja, was sind den diese "math_aborts"? :|
Fehler, klar. Das sind aber keine normalen Exceptions, wie ich sie kenne.

Mit freundlichen Grüßen
osDeveloper93
Pear3DEngine - a modular opensource game engine:
http://sourceforge.net/projects/pear3dengine/

"Ein glücklicher Mensch ist zu zufrieden mit der Gegenwart, um sich viele Gedanken über die Zukunft zu machen." - Albert Einstein (September 1896)

bluecode

  • Beiträge: 1 391
    • Profil anzeigen
    • lightOS
Gespeichert
« Antwort #1 am: 13. February 2010, 15:15 »
00528000000i[CPU0 ] | EIP=00101b84 (00101b84)
Welcher Code befindet sich denn da? Eventuell den Kernel disassemblieren und nachschauen, an den Symbolnamen siehst du in welcher Funktion es ist oder wenn du debuginfos hast siehst du normal auch die konkrete Zeile (falls es C-Code war).

edit: Die Flags sehen komisch aus, mit VIF, VIP und VM gesetzt... Da würde ich sagen, dass der Stack (bei SW-Multitasking) oder das TSS (bei HW-Multitasking) kaputt war als du switchen wolltest
« Letzte Änderung: 13. February 2010, 15:17 von bluecode »
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

XanClic

  • Beiträge: 261
    • Profil anzeigen
    • github
Gespeichert
« Antwort #2 am: 13. February 2010, 15:48 »
00528000000i[CPU0 ] | EIP=00101b84 (00101b84)
Welcher Code befindet sich denn da? Eventuell den Kernel disassemblieren und nachschauen, an den Symbolnamen siehst du in welcher Funktion es ist oder wenn du debuginfos hast siehst du normal auch die konkrete Zeile (falls es C-Code war).
00528000000i[CPU0 ] 0x00101b84>> jmp .+0xfffffffe (0x00101b84) : EBFE
Also wohl ein jmp $.

Bei den EFLAGS sieht es eher so aus, als wären nur die Flags gesetzt, die in Großbuchstaben gesetzt sind (ZF, PF). Da wäre dann also alles normal.

Zur FPU-Exception: Soweit ich weiß, tritt sowas auf, wenn FPU-Befehle verwendet werden, ohne dass die FPU korrekt initialisiert wurde. Aber gcc erstellt glaube ich automatisch FPU-Code, wenn man double etc. verwendet.

osDeveloper93

  • Beiträge: 31
    • Profil anzeigen
    • Homepage
Gespeichert
« Antwort #3 am: 13. February 2010, 15:49 »
An dieser Stelle, eigentlich an 0x00101b8b,  ist der Code, um Einträge in die IDT zu machen.

Diese Funktion sieht so aus:
void setINT()
{
idtSetupEmpty(0, (uint32_t)INT_0, 0x08, TYP);
idtSetupEmpty(1, (uint32_t)INT_1, 0x08, TYP);
idtSetupEmpty(2, (uint32_t)INT_2, 0x08, TYP);
idtSetupEmpty(3, (uint32_t)INT_3, 0x08, TYP);
idtSetupEmpty(4, (uint32_t)INT_4, 0x08, TYP);
idtSetupEmpty(5, (uint32_t)INT_5, 0x08, TYP);
idtSetupEmpty(6, (uint32_t)INT_6, 0x08, TYP);
idtSetupEmpty(7, (uint32_t)INT_7, 0x08, TYP);
idtSetupEmpty(8, (uint32_t)INT_8, 0x08, TYP);
idtSetupEmpty(9, (uint32_t)INT_9, 0x08, TYP);
idtSetupEmpty(10, (uint32_t)INT_10, 0x08, TYP);
idtSetupEmpty(11, (uint32_t)INT_11, 0x08, TYP);
idtSetupEmpty(12, (uint32_t)INT_12, 0x08, TYP);
idtSetupEmpty(13, (uint32_t)INT_13, 0x08, TYP);
idtSetupEmpty(14, (uint32_t)INT_14, 0x08, TYP);
idtSetupEmpty(15, (uint32_t)INT_15, 0x08, TYP);
idtSetupEmpty(16, (uint32_t)INT_16, 0x08, TYP);
idtSetupEmpty(17, (uint32_t)INT_17, 0x08, TYP);
idtSetupEmpty(18, (uint32_t)INT_18, 0x08, TYP);
idtSetupEmpty(19, (uint32_t)INT_19, 0x08, TYP);
idtSetupEmpty(20, (uint32_t)INT_20, 0x08, TYP);
idtSetupEmpty(21, (uint32_t)INT_21, 0x08, TYP);
idtSetupEmpty(22, (uint32_t)INT_22, 0x08, TYP);
idtSetupEmpty(23, (uint32_t)INT_23, 0x08, TYP);
idtSetupEmpty(24, (uint32_t)INT_24, 0x08, TYP);
idtSetupEmpty(25, (uint32_t)INT_25, 0x08, TYP);
idtSetupEmpty(26, (uint32_t)INT_26, 0x08, TYP);
idtSetupEmpty(27, (uint32_t)INT_27, 0x08, TYP);
idtSetupEmpty(28, (uint32_t)INT_28, 0x08, TYP);
idtSetupEmpty(29, (uint32_t)INT_29, 0x08, TYP);
idtSetupEmpty(30, (uint32_t)INT_30, 0x08, TYP);
idtSetupEmpty(31, (uint32_t)INT_31, 0x08, TYP);
}

TYP = 0x8E.

Aber da die Addresse nicht genau 0x00101b84 ist, weiß ich nicht ob diese Funktion den Fehler verursacht.

Was FPU und deren Exceptons sind kenne ich, mich hat nur dieses mit dem "DOS" verwirrt.
« Letzte Änderung: 13. February 2010, 15:51 von osDeveloper93 »
Pear3DEngine - a modular opensource game engine:
http://sourceforge.net/projects/pear3dengine/

"Ein glücklicher Mensch ist zu zufrieden mit der Gegenwart, um sich viele Gedanken über die Zukunft zu machen." - Albert Einstein (September 1896)

osDeveloper93

  • Beiträge: 31
    • Profil anzeigen
    • Homepage
Gespeichert
« Antwort #4 am: 13. February 2010, 15:55 »
Ich glaub es liegt an dem ASM-Code:

Ich zeig es euch mal:
INT_Steuerung:
cli
pusha
push ds
push es
push fs
push gs
mov ax, 0x10
mov ds, ax
mov es, ax
mov fs, ax
mov gs, ax
mov eax, esp
push eax
call ErrorKontroller
pop eax//Hier hin kommt der Prozessor nicht, da in Errorkontroller eine unendliche Schleife läuft.
mov esp, eax
pop gs
pop fs
pop es
pop ds
popa

add esp, 8

sti
iret

Das cli und das sti habe ich hinzugefügt, weil ich nicht sicher war das die Interrupts maskiert werden wenn ich in ein Interrupt gehe.

Aber eigentlich könnte es an diesen Funktionen nicht liegen da sie Exceptions sind und so "erstmal" nichts mit Multitasking zu tum haben.
« Letzte Änderung: 13. February 2010, 16:02 von osDeveloper93 »
Pear3DEngine - a modular opensource game engine:
http://sourceforge.net/projects/pear3dengine/

"Ein glücklicher Mensch ist zu zufrieden mit der Gegenwart, um sich viele Gedanken über die Zukunft zu machen." - Albert Einstein (September 1896)

bluecode

  • Beiträge: 1 391
    • Profil anzeigen
    • lightOS
Gespeichert
« Antwort #5 am: 13. February 2010, 17:32 »
Ein Interrupt Gate maskiert die Interrupts automatisch (nur ein Trap Gate macht das nicht). Das Sichern von esp in eax verstehe ich nicht wirklich, aber falsch ists wohl auch nicht wirklich. Ansonsten kann der Interrupthandler natürlich schon aufgerufen werden, nämlich über einen IRQ (falls du die PIC nicht umprogrammiert hast kommt da einer von den registrierten Interrupthandlern raus). Wenn du das IF (des Tasks) auf 0 setzt kann das allerdings nicht mehr passieren.
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

osDeveloper93

  • Beiträge: 31
    • Profil anzeigen
    • Homepage
Gespeichert
« Antwort #6 am: 13. February 2010, 18:12 »
Das sichern von esp in eax habe ich gemacht um so esp in den Stack zupushen.
Geht es eigentlich auch ohne eax? :?

Und die IRQ's vom PIC werden geremappt, hier der Code:
        outputPortB(0x20, 0x11);
outputPortB(0x21, 0x20);
outputPortB(0x21, 0x04);
outputPortB(0x21, 0x01);

outputPortB(0xA0, 0x11);
outputPortB(0xA1, 0x28);
outputPortB(0xA1, 0x02);
outputPortB(0xA1, 0x01);

outputPortB(0x20, 0x0);
outputPortB(0xA0, 0x0);

Das IF Flag setze ich nicht nach 0(Glaube ich  :-D).
« Letzte Änderung: 13. February 2010, 18:30 von osDeveloper93 »
Pear3DEngine - a modular opensource game engine:
http://sourceforge.net/projects/pear3dengine/

"Ein glücklicher Mensch ist zu zufrieden mit der Gegenwart, um sich viele Gedanken über die Zukunft zu machen." - Albert Einstein (September 1896)

XanClic

  • Beiträge: 261
    • Profil anzeigen
    • github
Gespeichert
« Antwort #7 am: 15. February 2010, 13:06 »
Das sichern von esp in eax habe ich gemacht um so esp in den Stack zupushen.
Geht es eigentlich auch ohne eax? :?

1. Probiers doch aus :wink:
2. Ja. (also "push esp" sollte funktionieren, tut es jedenfalls bei mir)

osDeveloper93

  • Beiträge: 31
    • Profil anzeigen
    • Homepage
Gespeichert
« Antwort #8 am: 21. February 2010, 11:54 »
Da bin ich wieder,

alos wenn ich es durch push esp ersetze, ändert sich garnichts.
Das Problem besteht weiterhin. :|

Und die FPU Exceptions werden, glaube ich, von Grub ausgelöst.
Hat es einer von euch auch in seiner Log stehen? (Ich mein die Exceptions).
Pear3DEngine - a modular opensource game engine:
http://sourceforge.net/projects/pear3dengine/

"Ein glücklicher Mensch ist zu zufrieden mit der Gegenwart, um sich viele Gedanken über die Zukunft zu machen." - Albert Einstein (September 1896)

Programm Noob

  • Gast
Gespeichert
« Antwort #9 am: 04. November 2010, 06:55 »
Ich weiß der Thread ist alt aber was ich schreibe hilft vieleicht auch anderen.

Wie du selber festgestellt hast, verwendet GCC die FPU befehle wenn man mit double,float und so arbeitet. Benutzt du solche Variablem? Wenn ja versuch es mit einem finit ganz am anfang des kernels.

PNoob
« Letzte Änderung: 29. November 2010, 18:44 von PNoob »

 

Einloggen