[C] Struktur deklarieren

Hallo,

versuch mal das hier:

Code:
align 4

FLAGS    equ 0
MAGIC    equ 0x1BADB002       ; Magicnumber - Erkennungsmerkmal für GRUB
CHECKSUM equ -(MAGIC + FLAGS) ; Checksum
 
 
[BITS 32]

[EXTERN code]                   ; Start of the '.text' section.
[EXTERN bss]                    ; Start of the .bss section.
[EXTERN kernel_end]                    ; End of the last loadable section.

MultiBootHeader:
    dd MAGIC       ; Magic number
    dd FLAGS       ; Flags
    dd CHECKSUM    ; Checksum
    dd MuliBootHeader  ; Wo sich der Multiboot-Descriptor (also das hier gerade) befindet
    dd code ; Wo der Code (also die .text-Sektion) anfängt
    dd bss ; Wo die Daten (also die .data-Sektion) anfängt
    dd kernel_end ; Ende des Kernels
    dd start ; Kernel-Einstiegspunkt (Initialer EIP)
 
[GLOBAL] start ; Kernel-Einstiegspunkt
[EXTERN main] ; Einstiegspunkt im C-Code

start:
    push ebx ; Multiboot-Header auf den Stack legen
    cli ; Interrupts anhalten
    call main ; Einstiegspunkt im C-Code anspringen und ausführen


    jmp $ ; endless loop
 
Der Linker hat folgendes Problem:
Code:
kernel.ao: In function `MultiBootHeader':
kernel.asm:(.text+0x10): undefined reference to `code'
kernel.asm:(.text+0x14): undefined reference to `bss'
Kann ich code und bss einfach weglassen?!
 
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:
OUTPUT_FORMAT("elf32-i386")
ENTRY(start)
SECTIONS
{
  .text 0x100000 :
  {
    code = .; _code = .; __code = .;
    *(.text)
    . = ALIGN(4096);
  }

  .data :
  {
     data = .; _data = .; __data = .;
     *(.data)
     *(.rodata)
     . = ALIGN(4096);
  }

  .bss :
  {
    bss = .; _bss = .; __bss = .;
    *(.bss)
    . = ALIGN(4096);
  }

  end = .; _end = .; __end = .;
}

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:
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?
 
Ok,

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

Anhänge

  • image.7z
    112,7 KB · Aufrufe: 9
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.
 
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.
 
Ja, richtig. Mein Kernel funktioniert in deiner Bochs-Config auch nicht. Hast du's mal als .zip versucht?
 
Zuletzt bearbeitet:
Zurück