1. Diese Seite verwendet Cookies. Wenn du dich weiterhin auf dieser Seite aufhältst, akzeptierst du unseren Einsatz von Cookies. Weitere Informationen

[C] Struktur deklarieren

Dieses Thema im Forum "C/C++" wurde erstellt von üäpöol, 4. Mai 2012.

  1. saftmeister

    saftmeister Nutze den Saft! Premium-User

    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:

    Code (C):
    1. //
    2. // The shutdown state is very similar to the state following the exection
    3. // if HLT instruction. In this mode the processor stops executing
    4. // instructions until #NMI, #SMI, #RESET or #INIT is received. If
    5. // shutdown occurs why in NMI interrupt handler or in SMM, a hardware
    6. // reset must be used to restart the processor execution.
    7. //
    8. void BX_CPU_C::shutdown(void)
    9. {
    10.   BX_PANIC(("Entering to shutdown state still not implemented"));
     
    Zuletzt bearbeitet: 5. Mai 2012
    üäpöol gefällt das.
  2. üäpöol

    üäpöol Erfahrenes Mitglied

    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: 5. Mai 2012
  3. saftmeister

    saftmeister Nutze den Saft! Premium-User

    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 (Text):
    1. log: bochsout.txt
    2. logprefix: %t-%e-@%i-%d
    3. debug: action=report
    4. info: action=report
    5. error: action=report
    6. panic: action=ask
    7. 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: 5. Mai 2012
    üäpöol gefällt das.
  4. üäpöol

    üäpöol Erfahrenes Mitglied

    Das andere Browserfenster versucht gerade verzweifelt, den Code abzuschicken, deshalb versuche ich, die Datei mal anzuhängen.
     

    Anhänge:

  5. saftmeister

    saftmeister Nutze den Saft! Premium-User

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

    Code (Text):
    1. 00072507865-d-@0000b383-[PIC  ] IO write to 0020 = 20
    2. 00072507873-d-@0000d0e2-[CPU0 ] interrupt(): vector = 16, TYPE = 4, EXT = 0
    3. 00072508065-d-@0000c140-[CPU0 ] protected mode activated
    4. 00072508144-d-@0000c187-[CPU0 ] real mode activated
    5. 00072508157-d-@0000c862-[CPU0 ] interrupt(): vector = 15, TYPE = 4, EXT = 0
    6. 00072508247-d-@0000c140-[CPU0 ] protected mode activated
    7. 00072510971-d-@0010000e-[CPU0 ] BxError: Encountered an unknown instruction b1=0xff (signalling #UD)
    8. 00072510971-d-@0010000e-[CPU0 ] modrm was 0xff, nnn was 7, rm was 7
    9. 00072510971-i-@0010000e-[CPU0 ] 0x000000000010000c>> (invalid)  : FFFF
    10. 00072510971-d-@0010000e-[CPU0 ] exception(0x06): error_code=0000
    11. 00072510971-d-@0010000c-[CPU0 ] interrupt(): vector = 06, TYPE = 3, EXT = 1
    12. 00072510971-e-@0010000c-[CPU0 ] interrupt(): gate descriptor is not valid sys seg (vector=0x06)
    13. 00072510971-d-@0010000c-[CPU0 ] exception(0x0d): error_code=0032
    14. 00072510971-d-@0010000c-[CPU0 ] interrupt(): vector = 0d, TYPE = 3, EXT = 1
    15. 00072510971-e-@0010000c-[CPU0 ] interrupt(): gate descriptor is not valid sys seg (vector=0x0d)
    16. 00072510971-d-@0010000c-[CPU0 ] exception(0x0d): error_code=006a
    17. 00072510971-d-@0010000c-[CPU0 ] exception(0x08): error_code=0000
    18. 00072510971-d-@0010000c-[CPU0 ] interrupt(): vector = 08, TYPE = 3, EXT = 1
    19. 00072510971-e-@0010000c-[CPU0 ] interrupt(): gate descriptor is not valid sys seg (vector=0x08)
    20. 00072510971-d-@0010000c-[CPU0 ] exception(0x0d): error_code=0042
    21. 00072510971-i-@0010000c-[CPU0 ] CPU is in protected mode (active)
    22. 00072510971-i-@0010000c-[CPU0 ] CS.mode = 32 bit
    23. 00072510971-i-@0010000c-[CPU0 ] SS.mode = 32 bit
    24. 00072510971-i-@0010000c-[CPU0 ] | EAX=2badb002  EBX=0000d48c  ECX=ffffffff  EDX=0000f000
    25. 00072510971-i-@0010000c-[CPU0 ] | ESP=00006c78  EBP=00006cdc  ESI=02102190  EDI=00102190
    26. 00072510971-i-@0010000c-[CPU0 ] | IOPL=0 id vip vif ac vm RF nt of df if tf sf zf af pf CF
    27. 00072510971-i-@0010000c-[CPU0 ] | SEG sltr(index|ti|rpl)     base    limit G D
    28. 00072510971-i-@0010000c-[CPU0 ] |  CS:0028( 0005| 0|  0) 00000000 ffffffff 1 1
    29. 00072510971-i-@0010000c-[CPU0 ] |  DS:0010( 0002| 0|  0) 00000000 ffffffff 1 1
    30. 00072510971-i-@0010000c-[CPU0 ] |  SS:0010( 0002| 0|  0) 00000000 ffffffff 1 1
    31. 00072510971-i-@0010000c-[CPU0 ] |  ES:0010( 0002| 0|  0) 00000000 ffffffff 1 1
    32. 00072510971-i-@0010000c-[CPU0 ] |  FS:0010( 0002| 0|  0) 00000000 ffffffff 1 1
    33. 00072510971-i-@0010000c-[CPU0 ] |  GS:0010( 0002| 0|  0) 00000000 ffffffff 1 1
    34. 00072510971-i-@0010000c-[CPU0 ] | EIP=0010000c (0010000c)
    35. 00072510971-i-@0010000c-[CPU0 ] | CR0=0x00000011 CR2=0x00000000
    36. 00072510971-i-@0010000c-[CPU0 ] | CR3=0x00000000 CR4=0x00000000
    37. 00072510971-i-@0010000c-[CPU0 ] 0x000000000010000c>> (invalid)  : FFFF
    38. 00072510971-d-@0010000c-[CTRL ] searching for component 'cpu' in list 'bochs'
    39. 00072510971-d-@0010000c-[CTRL ] searching for component 'reset_on_triple_fault' in list 'cpu'
    40. 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.
     
    üäpöol gefällt das.
  6. üäpöol

    üäpöol Erfahrenes Mitglied

    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 (ASM):
    1. [BITS 32]
    2. FLAGS    equ 0
    3. MAGIC    equ 0x1BADB002       ; Magicnumber - Erkennungsmerkmal für GRUB
    4. CHECKSUM equ -(MAGIC + FLAGS) ; Checksum
    5. zeilen   equ 10
    6.  
    7.  
    8. align 4
    9. MultiBootHeader:
    10.     dd MAGIC       ; Magic number
    11.     dd FLAGS       ; Flags
    12.     dd CHECKSUM    ; Checksum
    13.  
    14. [GLOBAL] start
    15. start:
    16.     ; [EXTERN main]
    17.     ; call main
    18.     [GLOBAL kernelerror]
    19.     kernelerror:
    20.         cli
    21.         hlt
    Das wird so assmembliert:
    Code (Text):
    1. building\NASM\NASM.exe -f elf32 -o kernel\kernel.o kernel\kernel.asm
    Und dann so gelinkt:
    Code (Text):
    1. "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 (Text):
    1. ENTRY (start)
    2. OUTPUT_FORMAT(elf32-i386)
    3. OUTPUT_ARCH(i386:i386)
    4.  
    5. SECTIONS
    6. {
    7.   . = 0x00100000;
    8.     kernel_start = .;
    9.   .text :
    10.   {
    11.     *(.text)
    12.   }
    13.    
    14.   .rodata :
    15.   {
    16.     *(.rodata)
    17.   }
    18.  
    19.   .data :
    20.   {
    21.     *(.data)
    22.   }
    23.  
    24.   .bss :
    25.   {
    26.     _sbss = .;
    27.     *(COMMON)
    28.     *(.bss)
    29.     _ebss = .;
    30.   }
    31.       . = ALIGN(4096);
    32.     kernel_end = .;
    33. }
    Ich hoffe, das hilft weiter.
     
  7. saftmeister

    saftmeister Nutze den Saft! Premium-User

    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 (Text):
    1. D:\Cpp\kernel\test1>i586-elf-objdump -d bin\kernel.elf
    2.  
    3. bin\kernel.elf:     file format elf32-i386
    4.  
    5.  
    6. Disassembly of section .text:
    7.  
    8. 00100000 <MultiBootHeader>:
    9.   100000:       02 b0 ad 1b 00 00       add    0x1bad(%eax),%dh
    10.   100006:       00 00                   add    %al,(%eax)
    11.   100008:       fe 4f 52                decb   0x52(%edi)
    12.   10000b:       e4 fa                   in     $0xfa,%al
    13.  
    14. 0010000c <kernelerror>:
    15.   10000c:       fa                      cli
    16.   10000d:       f4                      hlt
    Wie du siehst ist an Stelle 10000c das cli.

    Ich weiß jetzt nicht, ob bei dir das gleiche rauskommen wird.
     
    üäpöol gefällt das.
  8. üäpöol

    üäpöol Erfahrenes Mitglied

    Hm. Ich habe jetzt mal alles weggelassen, also:
    Code (ASM):
    1. [BITS 32]
    2. FLAGS    equ 0
    3. MAGIC    equ 0x1BADB002       ; Magicnumber - Erkennungsmerkmal für GRUB
    4. CHECKSUM equ -(MAGIC + FLAGS) ; Checksum
    5. zeilen   equ 10
    6.  
    7.  
    8. align 4
    9. MultiBootHeader:
    10.     dd MAGIC       ; Magic number
    11.     dd FLAGS       ; Flags
    12.     dd CHECKSUM    ; Checksum
    13.  
    14. [GLOBAL] start
    15. start:
    16.     ; [EXTERN main]
    17.     ; call main
    18.     ; [GLOBAL kernelerror]
    19.     ; kernelerror:
    20.         ; cli
    21.         ; 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 (Text):
    1. 00072507868-d-@0000b383-[PIC  ] IO write to 0020 = 20
    2. 00072507876-d-@0000d0e2-[CPU0 ] interrupt(): vector = 16, TYPE = 4, EXT = 0
    3. 00072508068-d-@0000c140-[CPU0 ] protected mode activated
    4. 00072508147-d-@0000c187-[CPU0 ] real mode activated
    5. 00072508160-d-@0000c862-[CPU0 ] interrupt(): vector = 15, TYPE = 4, EXT = 0
    6. 00072508250-d-@0000c140-[CPU0 ] protected mode activated
    7. 00072509900-d-@0010000e-[CPU0 ] BxError: Encountered an unknown instruction b1=0xff (signalling #UD)
    8. 00072509900-d-@0010000e-[CPU0 ] modrm was 0xff, nnn was 7, rm was 7
    9. 00072509900-i-@0010000e-[CPU0 ] 0x000000000010000c>> (invalid)  : FFFF
    10. 00072509900-d-@0010000e-[CPU0 ] exception(0x06): error_code=0000
    11. 00072509900-d-@0010000c-[CPU0 ] interrupt(): vector = 06, TYPE = 3, EXT = 1
    12. 00072509900-e-@0010000c-[CPU0 ] interrupt(): gate descriptor is not valid sys seg (vector=0x06)
    13. 00072509900-d-@0010000c-[CPU0 ] exception(0x0d): error_code=0032
    14. 00072509900-d-@0010000c-[CPU0 ] interrupt(): vector = 0d, TYPE = 3, EXT = 1
    15. 00072509900-e-@0010000c-[CPU0 ] interrupt(): gate descriptor is not valid sys seg (vector=0x0d)
    16. 00072509900-d-@0010000c-[CPU0 ] exception(0x0d): error_code=006a
    17. 00072509900-d-@0010000c-[CPU0 ] exception(0x08): error_code=0000
    18. 00072509900-d-@0010000c-[CPU0 ] interrupt(): vector = 08, TYPE = 3, EXT = 1
    19. 00072509900-e-@0010000c-[CPU0 ] interrupt(): gate descriptor is not valid sys seg (vector=0x08)
    20. 00072509900-d-@0010000c-[CPU0 ] exception(0x0d): error_code=0042
    21. 00072509900-i-@0010000c-[CPU0 ] CPU is in protected mode (active)
    22. 00072509900-i-@0010000c-[CPU0 ] CS.mode = 32 bit
    23. 00072509900-i-@0010000c-[CPU0 ] SS.mode = 32 bit
    24. 00072509900-i-@0010000c-[CPU0 ] | EAX=2badb002  EBX=0000d48c  ECX=ffffffff  EDX=0000f000
    25. 00072509900-i-@0010000c-[CPU0 ] | ESP=00006c78  EBP=00006cdc  ESI=021010c8  EDI=001010c8
    26. 00072509900-i-@0010000c-[CPU0 ] | IOPL=0 id vip vif ac vm RF nt of df if tf sf zf af pf CF
    27. 00072509900-i-@0010000c-[CPU0 ] | SEG sltr(index|ti|rpl)     base    limit G D
    28. 00072509900-i-@0010000c-[CPU0 ] |  CS:0028( 0005| 0|  0) 00000000 ffffffff 1 1
    29. 00072509900-i-@0010000c-[CPU0 ] |  DS:0010( 0002| 0|  0) 00000000 ffffffff 1 1
    30. 00072509900-i-@0010000c-[CPU0 ] |  SS:0010( 0002| 0|  0) 00000000 ffffffff 1 1
    31. 00072509900-i-@0010000c-[CPU0 ] |  ES:0010( 0002| 0|  0) 00000000 ffffffff 1 1
    32. 00072509900-i-@0010000c-[CPU0 ] |  FS:0010( 0002| 0|  0) 00000000 ffffffff 1 1
    33. 00072509900-i-@0010000c-[CPU0 ] |  GS:0010( 0002| 0|  0) 00000000 ffffffff 1 1
    34. 00072509900-i-@0010000c-[CPU0 ] | EIP=0010000c (0010000c)
    35. 00072509900-i-@0010000c-[CPU0 ] | CR0=0x00000011 CR2=0x00000000
    36. 00072509900-i-@0010000c-[CPU0 ] | CR3=0x00000000 CR4=0x00000000
    37. 00072509900-i-@0010000c-[CPU0 ] 0x000000000010000c>> (invalid)  : FFFF
    38. 00072509900-d-@0010000c-[CTRL ] searching for component 'cpu' in list 'bochs'
    39. 00072509900-d-@0010000c-[CTRL ] searching for component 'reset_on_triple_fault' in list 'cpu'
    40. 00072509900-p-@0010000c-[CPU0 ] >>PANIC<< exception(): 3rd (13) exception with no resolution
    41. 00072509900-i-@0010000c-[CPU0 ] CPU is in protected mode (active)
    42. 00072509900-i-@0010000c-[CPU0 ] CS.mode = 32 bit
    43. 00072509900-i-@0010000c-[CPU0 ] SS.mode = 32 bit
    44. 00072509900-i-@0010000c-[CPU0 ] | EAX=2badb002  EBX=0000d48c  ECX=ffffffff  EDX=0000f000
    45. 00072509900-i-@0010000c-[CPU0 ] | ESP=00006c78  EBP=00006cdc  ESI=021010c8  EDI=001010c8
    46. 00072509900-i-@0010000c-[CPU0 ] | IOPL=0 id vip vif ac vm RF nt of df if tf sf zf af pf CF
    47. 00072509900-i-@0010000c-[CPU0 ] | SEG sltr(index|ti|rpl)     base    limit G D
    48. 00072509900-i-@0010000c-[CPU0 ] |  CS:0028( 0005| 0|  0) 00000000 ffffffff 1 1
    49. 00072509900-i-@0010000c-[CPU0 ] |  DS:0010( 0002| 0|  0) 00000000 ffffffff 1 1
    50. 00072509900-i-@0010000c-[CPU0 ] |  SS:0010( 0002| 0|  0) 00000000 ffffffff 1 1
    51. 00072509900-i-@0010000c-[CPU0 ] |  ES:0010( 0002| 0|  0) 00000000 ffffffff 1 1
    52. 00072509900-i-@0010000c-[CPU0 ] |  FS:0010( 0002| 0|  0) 00000000 ffffffff 1 1
    53. 00072509900-i-@0010000c-[CPU0 ] |  GS:0010( 0002| 0|  0) 00000000 ffffffff 1 1
    54. 00072509900-i-@0010000c-[CPU0 ] | EIP=0010000c (0010000c)
    55. 00072509900-i-@0010000c-[CPU0 ] | CR0=0x00000011 CR2=0x00000000
    56. 00072509900-i-@0010000c-[CPU0 ] | CR3=0x00000000 CR4=0x00000000
    57. 00072509900-i-@0010000c-[CPU0 ] 0x000000000010000c>> (invalid)  : FFFF
    58. 00072509900-d-@0010000c-[ACPI ] Exit
    59. 00072509900-d-@0010000c-[UNMP ] Exit
    60. 00072509900-d-@0010000c-[BIOS ] Exit
    61. 00072509900-d-@0010000c-[SPEAK] Exit
    62. 00072509900-d-@0010000c-[EFIRQ] Exit
    63. 00072509900-d-@0010000c-[GAME ] Exit
    64. 00072509900-d-@0010000c-[CTRL ] searching for component 'keyboard_mouse' in list 'bochs'
    65. 00072509900-d-@0010000c-[CTRL ] searching for component 'keyboard' in list 'keyboard_mouse'
    66. 00072509900-d-@0010000c-[CTRL ] searching for component 'paste_delay' in list 'keyboard'
    67. 00072509900-d-@0010000c-[KBD  ] Exit
    68. 00072509900-d-@0010000c-[HD   ] Exit
    69. 00072509900-d-@0010000c-[PIDE ] Exit
    70. 00072509900-d-@0010000c-[CTRL ] searching for component 'ports' in list 'bochs'
    71. 00072509900-d-@0010000c-[CTRL ] searching for component 'serial' in list 'ports'
    72. 00072509900-d-@0010000c-[CTRL ] searching for component '1' in list 'serial'
    73. 00072509900-d-@0010000c-[CTRL ] searching for component 'enabled' in list '1'
    74. 00072509900-d-@0010000c-[CTRL ] searching for component 'ports' in list 'bochs'
    75. 00072509900-d-@0010000c-[CTRL ] searching for component 'serial' in list 'ports'
    76. 00072509900-d-@0010000c-[CTRL ] searching for component '2' in list 'serial'
    77. 00072509900-d-@0010000c-[CTRL ] searching for component 'enabled' in list '2'
    78. 00072509900-d-@0010000c-[CTRL ] searching for component 'ports' in list 'bochs'
    79. 00072509900-d-@0010000c-[CTRL ] searching for component 'serial' in list 'ports'
    80. 00072509900-d-@0010000c-[CTRL ] searching for component '3' in list 'serial'
    81. 00072509900-d-@0010000c-[CTRL ] searching for component 'enabled' in list '3'
    82. 00072509900-d-@0010000c-[CTRL ] searching for component 'ports' in list 'bochs'
    83. 00072509900-d-@0010000c-[CTRL ] searching for component 'serial' in list 'ports'
    84. 00072509900-d-@0010000c-[CTRL ] searching for component '4' in list 'serial'
    85. 00072509900-d-@0010000c-[CTRL ] searching for component 'enabled' in list '4'
    86. 00072509900-d-@0010000c-[SER  ] Exit
    87. 00072509900-d-@0010000c-[PAR  ] Exit
    88. 00072509900-d-@0010000c-[CTRL ] searching for component 'clock_cmos' in list 'bochs'
    89. 00072509900-d-@0010000c-[CTRL ] searching for component 'cmosimage' in list 'clock_cmos'
    90. 00072509900-d-@0010000c-[CTRL ] searching for component 'enabled' in list 'cmosimage'
    91. 00072509900-i-@0010000c-[CMOS ] Last time is 1336329300 (Sun May 06 20:35:00 2012)
    92. 00072509900-d-@0010000c-[CMOS ] Exit
    93. 00072509900-d-@0010000c-[DMA  ] Exit
    94. 00072509900-d-@0010000c-[PIC  ] Exit
    95. 00072509900-d-@0010000c-[BXVGA] Exit
    96. 00072509900-d-@0010000c-[CTRL ] searching for component 'display' in list 'bochs'
    97. 00072509900-d-@0010000c-[CTRL ] searching for component 'vga_update_frequency' in list 'display'
    98. 00072509900-d-@0010000c-[BXVGA] Exit
    99. 00072509900-d-@0010000c-[FDD  ] Exit
    100. 00072509900-d-@0010000c-[PCI  ] i440fxConfAddr:0x80000058
    101. 00072509900-d-@0010000c-[PCI  ] i440fxConfData:0x00001000
    102. 00072509900-d-@0010000c-[PCI  ] i440fxArray59:0x10
    103. 00072509900-d-@0010000c-[PCI  ] i440fxArray5a:0x00
    104. 00072509900-d-@0010000c-[PCI  ] i440fxArray5b:0x00
    105. 00072509900-d-@0010000c-[PCI  ] i440fxArray5c:0x00
    106. 00072509900-d-@0010000c-[PCI  ] i440fxArray5d:0x00
    107. 00072509900-d-@0010000c-[PCI  ] i440fxArray5e:0x00
    108. 00072509900-d-@0010000c-[PCI  ] i440fxArray5f:0x00
    109. 00072509900-d-@0010000c-[PCI  ] Exit
    110. 00072509900-d-@0010000c-[P2I  ] Exit
    111. 00072509900-i-@0010000c-[     ] restoring default signal behavior
    112. 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.
     
  9. saftmeister

    saftmeister Nutze den Saft! Premium-User

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

    Code (Text):
    1. 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.
     
  10. üäpöol

    üäpöol Erfahrenes Mitglied

    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.
     
  11. saftmeister

    saftmeister Nutze den Saft! Premium-User

    Hallo,

    versuch mal das hier:

    Code (ASM):
    1. align 4
    2.  
    3. FLAGS    equ 0
    4. MAGIC    equ 0x1BADB002       ; Magicnumber - Erkennungsmerkmal für GRUB
    5. CHECKSUM equ -(MAGIC + FLAGS) ; Checksum
    6.  
    7.  
    8. [BITS 32]
    9.  
    10. [EXTERN code]                   ; Start of the '.text' section.
    11. [EXTERN bss]                    ; Start of the .bss section.
    12. [EXTERN kernel_end]                    ; End of the last loadable section.
    13.  
    14. MultiBootHeader:
    15.     dd MAGIC       ; Magic number
    16.     dd FLAGS       ; Flags
    17.     dd CHECKSUM    ; Checksum
    18.     dd MuliBootHeader  ; Wo sich der Multiboot-Descriptor (also das hier gerade) befindet
    19.     dd code ; Wo der Code (also die .text-Sektion) anfängt
    20.     dd bss ; Wo die Daten (also die .data-Sektion) anfängt
    21.     dd kernel_end ; Ende des Kernels
    22.     dd start ; Kernel-Einstiegspunkt (Initialer EIP)
    23.  
    24. [GLOBAL] start ; Kernel-Einstiegspunkt
    25. [EXTERN main] ; Einstiegspunkt im C-Code
    26.  
    27. start:
    28.     push ebx ; Multiboot-Header auf den Stack legen
    29.     cli ; Interrupts anhalten
    30.     call main ; Einstiegspunkt im C-Code anspringen und ausführen
    31.  
    32.  
    33.     jmp $ ; endless loop
     
    üäpöol gefällt das.
  12. üäpöol

    üäpöol Erfahrenes Mitglied

    Der Linker hat folgendes Problem:
    Code (Text):
    1. kernel.ao: In function `MultiBootHeader':
    2. kernel.asm:(.text+0x10): undefined reference to `code'
    3. kernel.asm:(.text+0x14): undefined reference to `bss'
    Kann ich code und bss einfach weglassen?!
     
  13. saftmeister

    saftmeister Nutze den Saft! Premium-User

    Es wäre besser, wenn die drin wären. In deinem Linker-Script sind die doch definiert. Interessanterweise hat er bei kernel_end nicht gemeckert.

    Ich zeig dir mal mein Link-Script:

    Code (Text):
    1. OUTPUT_FORMAT("elf32-i386")
    2. ENTRY(start)
    3. SECTIONS
    4. {
    5.   .text 0x100000 :
    6.   {
    7.     code = .; _code = .; __code = .;
    8.     *(.text)
    9.     . = ALIGN(4096);
    10.   }
    11.  
    12.   .data :
    13.   {
    14.      data = .; _data = .; __data = .;
    15.      *(.data)
    16.      *(.rodata)
    17.      . = ALIGN(4096);
    18.   }
    19.  
    20.   .bss :
    21.   {
    22.     bss = .; _bss = .; __bss = .;
    23.     *(.bss)
    24.     . = ALIGN(4096);
    25.   }
    26.  
    27.   end = .; _end = .; __end = .;
    28. }
    Bei mir heißt kernel_end einfach nur end. Nur zum vergleichen und evtl. vervollständigen deines Scripts.

    EDIT: Ich seh grad: meine .text-Sektion sieht anders aus, ebenso die .bss- und die .data-Sektion. Evtl. mal angleichen?

    EDIT2: Insbesondere die Zeile code = .; _code = .; __code = .; und ihre Pendants in den jeweiligen anderen Sektionen.
     
    Zuletzt bearbeitet: 7. Mai 2012
    üäpöol gefällt das.
  14. üäpöol

    üäpöol Erfahrenes Mitglied

    Es gibt zwar jetzt keine Fehlermeldungen beim builden mehr, aber Bochs gibt das selbe Problem aus. Wenn ich die Problemstelle kommentiere, bleibt das Problem und die Problemstelle trotzdem die selbe. Sozusagen der nächste Befehl. Es liegt ja eh offensichtich an Bochs, weil sonst ja alles mit echter Hardware und VBox funktioniert, oder?
     
  15. saftmeister

    saftmeister Nutze den Saft! Premium-User

    Ok,

    lass uns deinen Bochs testen. Hier ist mein Kernel angehängt. Teste den mal. Bei mir bootet er erfolgreich.
     

    Anhänge:

    • image.7z
      Dateigröße:
      112,7 KB
      Aufrufe:
      9
    üäpöol gefällt das.
  16. üäpöol

    üäpöol Erfahrenes Mitglied

    Das ist schon mal gut! Es funktioniert bei mir auch! Das bedeutet, dass irgendetwas beim builden schief läuft. Kannst du mir bitte sagen, wie genau du den Kernel gebuildet hast.
     
  17. saftmeister

    saftmeister Nutze den Saft! Premium-User

    Das muss nicht sein: Könnte auch an der bochs-Config liegen. Kannst du die mal posten?
     
    üäpöol gefällt das.
  18. üäpöol

    üäpöol Erfahrenes Mitglied

    Nein, daran kann's nicht liegen, weil ich's extra mit meinem getestet habe. ;)
     
  19. saftmeister

    saftmeister Nutze den Saft! Premium-User

    Eigentlich hab ich nix anderes gemacht, wie du. Heißt das, das dein Kernel mit meiner Bochs-Config auch nicht läuft?

    Wollte grad meinen Kernel als Source hochladen, aber die Board-Software verweigert aufgrund von einem Security-Token.
     
    üäpöol gefällt das.
  20. üäpöol

    üäpöol Erfahrenes Mitglied

    Ja, richtig. Mein Kernel funktioniert in deiner Bochs-Config auch nicht. Hast du's mal als .zip versucht?
     
    Zuletzt bearbeitet: 8. Mai 2012
Die Seite wird geladen...