[C] Struktur deklarieren

Es liegt mit sehr großer Wahrscheinlichkeit am Code. Exception 13 ist ein General Protection Fault. Der tritt im Zusammenhang mit der GDT gern dann auf, wenn man die Segment-Daten falsch angegeben hat.

Wenn du willst, kannst du dein Projekt mal anhängen, dann werde ich einen Blick darauf werfen.

Nur weil man den Code auf mehrere Dateien auslagert, geht die Runtime nicht kaputt. Da muss schon etwas zusätzlich passiert sein.

EDIT: Es hilft nur soweit, das ich jetzt weiß, das du nicht die neueste Version von Bochs (2.5.1) verwendest sondern die höchstens 2.4.5.

EDIT2: Ich ziehe den Edit zurück: Die Meldung kommt bei 2.5.1 auch noch. Hab den Source grade angeschaut.

EDTI3: Die Meldung sagt eigentlich nur aus, was auch schon die erste Meldung aussagt: Da ist ein Triple-Fault aufgetreten, weil noch keine IDT implementiert ist:

C:
//
// The shutdown state is very similar to the state following the exection
// if HLT instruction. In this mode the processor stops executing
// instructions until #NMI, #SMI, #RESET or #INIT is received. If
// shutdown occurs why in NMI interrupt handler or in SMM, a hardware
// reset must be used to restart the processor execution.
//
void BX_CPU_C::shutdown(void)
{
  BX_PANIC(("Entering to shutdown state still not implemented"));
 
Zuletzt bearbeitet:
OK, saftmeister. Ich zeige dir kaum Code von mir, nicht mal Fehlermeldungen und trotzdem hast du zu 100% Recht! Das nenne ich mal Genie! :)
Es lag am Code. Ich habe eine "alte" Version des OS' wiederhergestellt, wieder dasselbe - bzw. offensichtlich nicht - wie zuvor gemacht und - es funktioniert! Ich habe alles jetzt extern. Das ist wirklich großartig. Leider funktioniert es nur in der VirtualBox und mit echter Hardware, aber komischerweiser nicht mit bochs. :D
Es gibt exakt dieselben Fehlermeldungen wie zuvor. Wie komme ich denn an den log?
 
Zuletzt bearbeitet:
Danke für die Blumen, aber Genie ist übertrieben - hab nur ein paar Erfahrungen mit dem Kram.

Du kannst in der bochsrc das Logging aktivieren.

Folgende Zeilen sind relevant (wenn noch nicht vorhanden, einfach mal einfügen):

Code:
log: bochsout.txt
logprefix: %t-%e-@%i-%d
debug: action=report
info: action=report
error: action=report
panic: action=ask
debugger_log: debugger.out

Bei "debug:" kannst auch auf "action=ignore" stellen, wenn die Logs dadurch zu viel werden.

Die Angaben "log:" und "debugger_log:" sind Namen der Dateien, in die geloggt werden soll. Du kannst IMHO auch vollständige Pfade verwenden.

EDIT: Was mir grade aufgefallen ist - ich weiß nicht mehr, obs den bei 2.4.5 auch schon gegeben hat, aber seit ich 2.5.1 installiert habe, gibts bochsdbg.exe im Installationsordner. Wenn du das Image noch hast, bei dem der TF aufgetreten ist, kann man das mal versuchen zu debuggen.
 
Zuletzt bearbeitet:
Das andere Browserfenster versucht gerade verzweifelt, den Code abzuschicken, deshalb versuche ich, die Datei mal anzuhängen.
 

Anhänge

Ok, lass uns mal schauen, ob wir da nicht was rauslesen können:

Code:
00072507865-d-@0000b383-[PIC  ] IO write to 0020 = 20
00072507873-d-@0000d0e2-[CPU0 ] interrupt(): vector = 16, TYPE = 4, EXT = 0
00072508065-d-@0000c140-[CPU0 ] protected mode activated
00072508144-d-@0000c187-[CPU0 ] real mode activated
00072508157-d-@0000c862-[CPU0 ] interrupt(): vector = 15, TYPE = 4, EXT = 0
00072508247-d-@0000c140-[CPU0 ] protected mode activated
00072510971-d-@0010000e-[CPU0 ] BxError: Encountered an unknown instruction b1=0xff (signalling #UD)
00072510971-d-@0010000e-[CPU0 ] modrm was 0xff, nnn was 7, rm was 7
00072510971-i-@0010000e-[CPU0 ] 0x000000000010000c>> (invalid)  : FFFF
00072510971-d-@0010000e-[CPU0 ] exception(0x06): error_code=0000
00072510971-d-@0010000c-[CPU0 ] interrupt(): vector = 06, TYPE = 3, EXT = 1
00072510971-e-@0010000c-[CPU0 ] interrupt(): gate descriptor is not valid sys seg (vector=0x06)
00072510971-d-@0010000c-[CPU0 ] exception(0x0d): error_code=0032
00072510971-d-@0010000c-[CPU0 ] interrupt(): vector = 0d, TYPE = 3, EXT = 1
00072510971-e-@0010000c-[CPU0 ] interrupt(): gate descriptor is not valid sys seg (vector=0x0d)
00072510971-d-@0010000c-[CPU0 ] exception(0x0d): error_code=006a
00072510971-d-@0010000c-[CPU0 ] exception(0x08): error_code=0000
00072510971-d-@0010000c-[CPU0 ] interrupt(): vector = 08, TYPE = 3, EXT = 1
00072510971-e-@0010000c-[CPU0 ] interrupt(): gate descriptor is not valid sys seg (vector=0x08)
00072510971-d-@0010000c-[CPU0 ] exception(0x0d): error_code=0042
00072510971-i-@0010000c-[CPU0 ] CPU is in protected mode (active)
00072510971-i-@0010000c-[CPU0 ] CS.mode = 32 bit
00072510971-i-@0010000c-[CPU0 ] SS.mode = 32 bit
00072510971-i-@0010000c-[CPU0 ] | EAX=2badb002  EBX=0000d48c  ECX=ffffffff  EDX=0000f000
00072510971-i-@0010000c-[CPU0 ] | ESP=00006c78  EBP=00006cdc  ESI=02102190  EDI=00102190
00072510971-i-@0010000c-[CPU0 ] | IOPL=0 id vip vif ac vm RF nt of df if tf sf zf af pf CF
00072510971-i-@0010000c-[CPU0 ] | SEG sltr(index|ti|rpl)     base    limit G D
00072510971-i-@0010000c-[CPU0 ] |  CS:0028( 0005| 0|  0) 00000000 ffffffff 1 1
00072510971-i-@0010000c-[CPU0 ] |  DS:0010( 0002| 0|  0) 00000000 ffffffff 1 1
00072510971-i-@0010000c-[CPU0 ] |  SS:0010( 0002| 0|  0) 00000000 ffffffff 1 1
00072510971-i-@0010000c-[CPU0 ] |  ES:0010( 0002| 0|  0) 00000000 ffffffff 1 1
00072510971-i-@0010000c-[CPU0 ] |  FS:0010( 0002| 0|  0) 00000000 ffffffff 1 1
00072510971-i-@0010000c-[CPU0 ] |  GS:0010( 0002| 0|  0) 00000000 ffffffff 1 1
00072510971-i-@0010000c-[CPU0 ] | EIP=0010000c (0010000c)
00072510971-i-@0010000c-[CPU0 ] | CR0=0x00000011 CR2=0x00000000
00072510971-i-@0010000c-[CPU0 ] | CR3=0x00000000 CR4=0x00000000
00072510971-i-@0010000c-[CPU0 ] 0x000000000010000c>> (invalid)  : FFFF
00072510971-d-@0010000c-[CTRL ] searching for component 'cpu' in list 'bochs'
00072510971-d-@0010000c-[CTRL ] searching for component 'reset_on_triple_fault' in list 'cpu'
00072510971-p-@0010000c-[CPU0 ] >>PANIC<< exception(): 3rd (13) exception with no resolution

In Zeile 1 steht, das ein IO-Write an Port 20 durchgeführt wurde. Der Port 20 ist für den Interrupt-Controller zuständig. Warum da jetzt - obwohl doch erst die GDT aktiviert werden soll, bereits am PIC rum gepfriemelt wird, weiß ich nicht. Dein Code wirds dir aber mitteilen.

In Zeile 7 ist dann das Problem erkennbar: #UD ist Invalid-Opcode-Exception, also ein Assembler-Befehl, den es nicht gibt, oder ein gültiger Assembler-Befehl mit fehlerhaften Parametern. Es sieht nach einem MOV aus, der falsche Paramter hat. Ich bin allerdings kein Experte, was Assembler angeht.

Alle weiteren Exceptions sind Folgefehler. Bis hin zur Triple-Fault, die zum Reset der CPU führt.

Möglicherweise hilft dir aber schon der Hinweis, das ein outb an Port 20 gemacht wird, such ab dort nach dem Fehler.
 
Erstmal danke für den Hinweis. Er hat mir aber insofern nicht weiter geholfen, als dass nirgends etwas mit Port 20 gemacht wird. Deshalb habe ich jetzt nur mal die kernel.o gelinkt und selbst das funktioniert nicht. Es muss wohl an der Datei oder am Linkerscript liegen. Ich poste hier mal beides:
Code:
[BITS 32]
FLAGS    equ 0
MAGIC    equ 0x1BADB002       ; Magicnumber - Erkennungsmerkmal für GRUB
CHECKSUM equ -(MAGIC + FLAGS) ; Checksum
zeilen   equ 10
 
 
align 4
MultiBootHeader:
	dd MAGIC       ; Magic number
    dd FLAGS       ; Flags
    dd CHECKSUM    ; Checksum
 
[GLOBAL] start
start:
	; [EXTERN main]
	; call main
	[GLOBAL kernelerror]
	kernelerror:
		cli
		hlt
Das wird so assmembliert:
Code:
building\NASM\NASM.exe -f elf32 -o kernel\kernel.o kernel\kernel.asm
Und dann so gelinkt:
Code:
"building\GCC & LD\bin\i586-elf-ld.exe" -melf_i386 -T "building\GCC & LD\bin\link.ld" -o kernel\kernel.elf kernel\kernel.o
Linkerskript:
Code:
ENTRY (start)
OUTPUT_FORMAT(elf32-i386)
OUTPUT_ARCH(i386:i386)
 
SECTIONS
{
  . = 0x00100000;
    kernel_start = .;
  .text :
  {
    *(.text)
  }
    
  .rodata :
  {
    *(.rodata)
  }
 
  .data : 
  {
    *(.data)
  }
 
  .bss :
  {
    _sbss = .;
    *(COMMON)
    *(.bss)
    _ebss = .;
  }
      . = ALIGN(4096);
    kernel_end = .;
}
Ich hoffe, das hilft weiter.
 
So, also ich bin jetzt einen Schritt weiter. Es liegt sehr wahrscheinlich an dem cli-Opcode, der aufgerufen wird. Und der Fehler tritt sehr wahrscheinlich auf, weil vorher kein sti gemacht wurde. cli stoppt die Ausführung von Interrupts, welche vorher mit sti natürlich gestartet werden müssen.

So bin ich vorgegangen:

- Im log zeigt der EIP (Instruction Pointer) auf 0x10000c
- Ich mach eine Disassemblierung der kernel.elf und schau mir an, was an dieser Stelle vorkommt:

Code:
D:\Cpp\kernel\test1>i586-elf-objdump -d bin\kernel.elf

bin\kernel.elf:     file format elf32-i386


Disassembly of section .text:

00100000 <MultiBootHeader>:
  100000:       02 b0 ad 1b 00 00       add    0x1bad(%eax),%dh
  100006:       00 00                   add    %al,(%eax)
  100008:       fe 4f 52                decb   0x52(%edi)
  10000b:       e4 fa                   in     $0xfa,%al

0010000c <kernelerror>:
  10000c:       fa                      cli
  10000d:       f4                      hlt

Wie du siehst ist an Stelle 10000c das cli.

Ich weiß jetzt nicht, ob bei dir das gleiche rauskommen wird.
 
Hm. Ich habe jetzt mal alles weggelassen, also:
Code:
[BITS 32]
FLAGS    equ 0
MAGIC    equ 0x1BADB002       ; Magicnumber - Erkennungsmerkmal für GRUB
CHECKSUM equ -(MAGIC + FLAGS) ; Checksum
zeilen   equ 10
 
 
align 4
MultiBootHeader:
	dd MAGIC       ; Magic number
    dd FLAGS       ; Flags
    dd CHECKSUM    ; Checksum
 
[GLOBAL] start
start:
	; [EXTERN main]
	; call main
	; [GLOBAL kernelerror]
	; kernelerror:
		; cli
		; hlt
Das ist alles, was von mir kommt, der Rest ist alles GRUB(4DOS). Ich bekomme trotzdem die selbe Fehlermeldung. Hier wieder der selbe Part in der bochsout.txt
Code:
00072507868-d-@0000b383-[PIC  ] IO write to 0020 = 20
00072507876-d-@0000d0e2-[CPU0 ] interrupt(): vector = 16, TYPE = 4, EXT = 0
00072508068-d-@0000c140-[CPU0 ] protected mode activated
00072508147-d-@0000c187-[CPU0 ] real mode activated
00072508160-d-@0000c862-[CPU0 ] interrupt(): vector = 15, TYPE = 4, EXT = 0
00072508250-d-@0000c140-[CPU0 ] protected mode activated
00072509900-d-@0010000e-[CPU0 ] BxError: Encountered an unknown instruction b1=0xff (signalling #UD)
00072509900-d-@0010000e-[CPU0 ] modrm was 0xff, nnn was 7, rm was 7
00072509900-i-@0010000e-[CPU0 ] 0x000000000010000c>> (invalid)  : FFFF
00072509900-d-@0010000e-[CPU0 ] exception(0x06): error_code=0000
00072509900-d-@0010000c-[CPU0 ] interrupt(): vector = 06, TYPE = 3, EXT = 1
00072509900-e-@0010000c-[CPU0 ] interrupt(): gate descriptor is not valid sys seg (vector=0x06)
00072509900-d-@0010000c-[CPU0 ] exception(0x0d): error_code=0032
00072509900-d-@0010000c-[CPU0 ] interrupt(): vector = 0d, TYPE = 3, EXT = 1
00072509900-e-@0010000c-[CPU0 ] interrupt(): gate descriptor is not valid sys seg (vector=0x0d)
00072509900-d-@0010000c-[CPU0 ] exception(0x0d): error_code=006a
00072509900-d-@0010000c-[CPU0 ] exception(0x08): error_code=0000
00072509900-d-@0010000c-[CPU0 ] interrupt(): vector = 08, TYPE = 3, EXT = 1
00072509900-e-@0010000c-[CPU0 ] interrupt(): gate descriptor is not valid sys seg (vector=0x08)
00072509900-d-@0010000c-[CPU0 ] exception(0x0d): error_code=0042
00072509900-i-@0010000c-[CPU0 ] CPU is in protected mode (active)
00072509900-i-@0010000c-[CPU0 ] CS.mode = 32 bit
00072509900-i-@0010000c-[CPU0 ] SS.mode = 32 bit
00072509900-i-@0010000c-[CPU0 ] | EAX=2badb002  EBX=0000d48c  ECX=ffffffff  EDX=0000f000
00072509900-i-@0010000c-[CPU0 ] | ESP=00006c78  EBP=00006cdc  ESI=021010c8  EDI=001010c8
00072509900-i-@0010000c-[CPU0 ] | IOPL=0 id vip vif ac vm RF nt of df if tf sf zf af pf CF
00072509900-i-@0010000c-[CPU0 ] | SEG sltr(index|ti|rpl)     base    limit G D
00072509900-i-@0010000c-[CPU0 ] |  CS:0028( 0005| 0|  0) 00000000 ffffffff 1 1
00072509900-i-@0010000c-[CPU0 ] |  DS:0010( 0002| 0|  0) 00000000 ffffffff 1 1
00072509900-i-@0010000c-[CPU0 ] |  SS:0010( 0002| 0|  0) 00000000 ffffffff 1 1
00072509900-i-@0010000c-[CPU0 ] |  ES:0010( 0002| 0|  0) 00000000 ffffffff 1 1
00072509900-i-@0010000c-[CPU0 ] |  FS:0010( 0002| 0|  0) 00000000 ffffffff 1 1
00072509900-i-@0010000c-[CPU0 ] |  GS:0010( 0002| 0|  0) 00000000 ffffffff 1 1
00072509900-i-@0010000c-[CPU0 ] | EIP=0010000c (0010000c)
00072509900-i-@0010000c-[CPU0 ] | CR0=0x00000011 CR2=0x00000000
00072509900-i-@0010000c-[CPU0 ] | CR3=0x00000000 CR4=0x00000000
00072509900-i-@0010000c-[CPU0 ] 0x000000000010000c>> (invalid)  : FFFF
00072509900-d-@0010000c-[CTRL ] searching for component 'cpu' in list 'bochs'
00072509900-d-@0010000c-[CTRL ] searching for component 'reset_on_triple_fault' in list 'cpu'
00072509900-p-@0010000c-[CPU0 ] >>PANIC<< exception(): 3rd (13) exception with no resolution
00072509900-i-@0010000c-[CPU0 ] CPU is in protected mode (active)
00072509900-i-@0010000c-[CPU0 ] CS.mode = 32 bit
00072509900-i-@0010000c-[CPU0 ] SS.mode = 32 bit
00072509900-i-@0010000c-[CPU0 ] | EAX=2badb002  EBX=0000d48c  ECX=ffffffff  EDX=0000f000
00072509900-i-@0010000c-[CPU0 ] | ESP=00006c78  EBP=00006cdc  ESI=021010c8  EDI=001010c8
00072509900-i-@0010000c-[CPU0 ] | IOPL=0 id vip vif ac vm RF nt of df if tf sf zf af pf CF
00072509900-i-@0010000c-[CPU0 ] | SEG sltr(index|ti|rpl)     base    limit G D
00072509900-i-@0010000c-[CPU0 ] |  CS:0028( 0005| 0|  0) 00000000 ffffffff 1 1
00072509900-i-@0010000c-[CPU0 ] |  DS:0010( 0002| 0|  0) 00000000 ffffffff 1 1
00072509900-i-@0010000c-[CPU0 ] |  SS:0010( 0002| 0|  0) 00000000 ffffffff 1 1
00072509900-i-@0010000c-[CPU0 ] |  ES:0010( 0002| 0|  0) 00000000 ffffffff 1 1
00072509900-i-@0010000c-[CPU0 ] |  FS:0010( 0002| 0|  0) 00000000 ffffffff 1 1
00072509900-i-@0010000c-[CPU0 ] |  GS:0010( 0002| 0|  0) 00000000 ffffffff 1 1
00072509900-i-@0010000c-[CPU0 ] | EIP=0010000c (0010000c)
00072509900-i-@0010000c-[CPU0 ] | CR0=0x00000011 CR2=0x00000000
00072509900-i-@0010000c-[CPU0 ] | CR3=0x00000000 CR4=0x00000000
00072509900-i-@0010000c-[CPU0 ] 0x000000000010000c>> (invalid)  : FFFF
00072509900-d-@0010000c-[ACPI ] Exit
00072509900-d-@0010000c-[UNMP ] Exit
00072509900-d-@0010000c-[BIOS ] Exit
00072509900-d-@0010000c-[SPEAK] Exit
00072509900-d-@0010000c-[EFIRQ] Exit
00072509900-d-@0010000c-[GAME ] Exit
00072509900-d-@0010000c-[CTRL ] searching for component 'keyboard_mouse' in list 'bochs'
00072509900-d-@0010000c-[CTRL ] searching for component 'keyboard' in list 'keyboard_mouse'
00072509900-d-@0010000c-[CTRL ] searching for component 'paste_delay' in list 'keyboard'
00072509900-d-@0010000c-[KBD  ] Exit
00072509900-d-@0010000c-[HD   ] Exit
00072509900-d-@0010000c-[PIDE ] Exit
00072509900-d-@0010000c-[CTRL ] searching for component 'ports' in list 'bochs'
00072509900-d-@0010000c-[CTRL ] searching for component 'serial' in list 'ports'
00072509900-d-@0010000c-[CTRL ] searching for component '1' in list 'serial'
00072509900-d-@0010000c-[CTRL ] searching for component 'enabled' in list '1'
00072509900-d-@0010000c-[CTRL ] searching for component 'ports' in list 'bochs'
00072509900-d-@0010000c-[CTRL ] searching for component 'serial' in list 'ports'
00072509900-d-@0010000c-[CTRL ] searching for component '2' in list 'serial'
00072509900-d-@0010000c-[CTRL ] searching for component 'enabled' in list '2'
00072509900-d-@0010000c-[CTRL ] searching for component 'ports' in list 'bochs'
00072509900-d-@0010000c-[CTRL ] searching for component 'serial' in list 'ports'
00072509900-d-@0010000c-[CTRL ] searching for component '3' in list 'serial'
00072509900-d-@0010000c-[CTRL ] searching for component 'enabled' in list '3'
00072509900-d-@0010000c-[CTRL ] searching for component 'ports' in list 'bochs'
00072509900-d-@0010000c-[CTRL ] searching for component 'serial' in list 'ports'
00072509900-d-@0010000c-[CTRL ] searching for component '4' in list 'serial'
00072509900-d-@0010000c-[CTRL ] searching for component 'enabled' in list '4'
00072509900-d-@0010000c-[SER  ] Exit
00072509900-d-@0010000c-[PAR  ] Exit
00072509900-d-@0010000c-[CTRL ] searching for component 'clock_cmos' in list 'bochs'
00072509900-d-@0010000c-[CTRL ] searching for component 'cmosimage' in list 'clock_cmos'
00072509900-d-@0010000c-[CTRL ] searching for component 'enabled' in list 'cmosimage'
00072509900-i-@0010000c-[CMOS ] Last time is 1336329300 (Sun May 06 20:35:00 2012)
00072509900-d-@0010000c-[CMOS ] Exit
00072509900-d-@0010000c-[DMA  ] Exit
00072509900-d-@0010000c-[PIC  ] Exit
00072509900-d-@0010000c-[BXVGA] Exit
00072509900-d-@0010000c-[CTRL ] searching for component 'display' in list 'bochs'
00072509900-d-@0010000c-[CTRL ] searching for component 'vga_update_frequency' in list 'display'
00072509900-d-@0010000c-[BXVGA] Exit
00072509900-d-@0010000c-[FDD  ] Exit
00072509900-d-@0010000c-[PCI  ] i440fxConfAddr:0x80000058
00072509900-d-@0010000c-[PCI  ] i440fxConfData:0x00001000
00072509900-d-@0010000c-[PCI  ] i440fxArray59:0x10
00072509900-d-@0010000c-[PCI  ] i440fxArray5a:0x00
00072509900-d-@0010000c-[PCI  ] i440fxArray5b:0x00
00072509900-d-@0010000c-[PCI  ] i440fxArray5c:0x00
00072509900-d-@0010000c-[PCI  ] i440fxArray5d:0x00
00072509900-d-@0010000c-[PCI  ] i440fxArray5e:0x00
00072509900-d-@0010000c-[PCI  ] i440fxArray5f:0x00
00072509900-d-@0010000c-[PCI  ] Exit
00072509900-d-@0010000c-[P2I  ] Exit
00072509900-i-@0010000c-[     ] restoring default signal behavior
00072509900-i-@0010000c-[CTRL ] quit_sim called with exit code 1
Es hat sich nichts geändert. Womit disassemblierst du denn? Ich disassembliere mit dem NASM Disassembler, bekomme aber dabei nur Adressen bis ca. 1230.
 
Es hat sich nichts geändert. Womit disassemblierst du denn? Ich disassembliere mit dem NASM Disassembler, bekomme aber dabei nur Adressen bis ca. 1230.

Steht in dem Teil wo disassembliert wird mit als Kommando drin:

Code:
D:\Cpp\kernel\test1>i586-elf-objdump -d bin\kernel.elf

Da du ja auch den crosstools Gcc-Compiler verwendest, hast du mit Sicherheit auch die i586-elf-objdump.exe.

EDIT: NASM hilft hier nicht, weil NASM nur den Objekt-Code kennt. Nicht den eigentlichen ELF-Code, der durch den Linker erzeugt wird.
 
Inzwischen glaube ich, dass es an GRUB liegt. Ich habe alles weggelassen, bis auf das, was GRUB braucht und ich bekomme dennoch den selben Fehler. Ich habe mal cli und hlt weggelassen, aber das ändert überhaupt nichts es ist trotzdem bei 10000c, wo objdump nichts mehr anzeigt.
 
Zurück