Autor Thema: .data Section Problem  (Gelesen 6665 mal)

DaeFennek

  • Beiträge: 2
    • Profil anzeigen
Gespeichert
« am: 01. June 2014, 15:19 »
Hi,

ich habe ein Problem in meinem Stage 2 Bootloader. Nachdem ich in den Protected Mode springe gebe ich eine kurze Message auf der Console aus, lösche die Console und spring in meine C main Methode.
Das funktioniert soweit auch ganz gut. Wenn ich allerdings die Message in der .data Section definiere, bekomme ich keine Consolenausgabe, die Console wird allerdings gelöscht und ich springe auch erfolgreich in die main Methode.
Zum testen habe ich mal die main Methode aus dem Linker genommen, die Message aber trotzdem in die .data Section gelegt. Hierbei erfolgt die Ausgabe der Message.

Meine Frage: Warum funktioniert die Ausgabe der in der .data Section definiert Message nur, wenn ich die C main Methode nicht mit linke?

Message wird nicht ausgegeben:
section .text
[BITS 32]
[extern main] ; c main

ProtectedMode:

.main:
mov ax, 0x10
mov ds, ax
mov ss, ax
mov es, ax
xor eax, eax
mov fs, ax
mov gs, ax
mov esp, 0x200000 ; set stack below 2 MB limit

call clrscr_32

mov esi, runningProtectedMode
call PutStr_32 ;<-- Ausgabe der Message funktioniert nicht
; call c main
call main
jmp $

PutStr_32:     
    mov edi, [PutStr_Ptr]
.nextchar:
    lodsb
    test al, al         
    jz .end     
    stosw
    jmp .nextchar 
  .end:
    mov [PutStr_Ptr], edi
    ret

clrscr_32:
    mov edi, 0xb8000
    mov [PutStr_Ptr], edi
    mov ecx, 40 * 25
    mov eax, 0x07200720 ; two times: 0x07 => white text & black background 0x20 => Space
    rep stosd
    ret

section .data
PutStr_Ptr dd 0xb8000
runningProtectedMode db "Running in 32 Bit ..", 0 ; <-- Message


Message wird ausgegeben:
section .text
[BITS 32]
ProtectedMode:

.main:
mov ax, 0x10
mov ds, ax
mov ss, ax
mov es, ax
xor eax, eax
mov fs, ax
mov gs, ax
mov esp, 0x200000 ; set stack below 2 MB limit

call clrscr_32

mov esi, runningProtectedMode
call PutStr_32 ;<-- Ausgabe der Message funktioniert nicht
; don't call c main
;call main
jmp $

PutStr_32:     
    mov edi, [PutStr_Ptr]
.nextchar:
    lodsb
    test al, al         
    jz .end     
    stosw
    jmp .nextchar 
  .end:
    mov [PutStr_Ptr], edi
    ret

clrscr_32:
    mov edi, 0xb8000
    mov [PutStr_Ptr], edi
    mov ecx, 40 * 25
    mov eax, 0x07200720 ; two times: 0x07 => white text & black background 0x20 => Space
    rep stosd
    ret

section .data
PutStr_Ptr dd 0xb8000
runningProtectedMode db "Running in 32 Bit ..", 0 ; <-- Message


Linker:
OUTPUT_FORMAT("binary")
ENTRY(RealMode)
entryPoint = 0x00008000;
SECTIONS
{
  .text entryPoint : {
    *(.text)
  }
  .rodata : {
*(.rodata)
  }
  .data : {
    *(.data)
  }
  .bss :  {
    *(.bss)
  }
}

Jidder

  • Administrator
  • Beiträge: 1 625
    • Profil anzeigen
Gespeichert
« Antwort #1 am: 01. June 2014, 15:53 »
Hi,

ich habe ein Problem in meinem Stage 2 Bootloader.
Ich verstehe noch nicht ganz, was deine verschiedenen Bootloader genau machen sollen (d.h. was wird von wem wohin geladen). Insbesondere, weil du in dem geposteten Linkerskript den Entry-Point RealMode genannt hast, was nicht zum Code passt.

Zum Problem: Im Allgemeinen ist die Ursache, dass der Bootloader etwas nicht richtig lädt, oder der Linker die Dateien nicht korrekt erzeugt.

Schau bitte nochmal nach, ob du das richtige Linkerskript gepostet hast. Außerdem ist der Aufruf des Linkers interessant. Da du direkt eine Binärdatei erstellst, kann man daraus leider nicht mehr ablesen, was genau der Linker eigentlich macht. Übergib dem Linker zusätzlich mal den Parameter -Map stage2.map und poste den Inhalt der Datei stage2.map. (Möglicherweise aussagekräftiger wäre allerdings ELF als Ausgabeformat zu nehmen und mit objdump -x die Sektionen in der Datei ausgeben zu lassen.)

Kleinigkeit noch: Deine PutStr_32 funktioniert nur, weil clrscr_32 vorher den Wert 0x07 in ah lädt. Wäre der Wert beispielsweise 0, wären die Zeichen unsichtbar. PutStr_32 sollte selbst ah auf einen gültigen Wert setzen (oder stosw nicht nutzen).
« Letzte Änderung: 01. June 2014, 15:55 von Jidder »
Dieser Text wird unter jedem Beitrag angezeigt.

DaeFennek

  • Beiträge: 2
    • Profil anzeigen
Gespeichert
« Antwort #2 am: 01. June 2014, 19:54 »
Hi,

vielen Dank für deine schnelle Antwort. Ich habe das Problem gefunden.

Meine Kernel ist ca. 5,68 KB groß und die Message liegt relativ am Ende des Kernels. Da ich allerdings im Stage 1 Bootloader nur die ersten 10 Sektoren (512 Byte * 10 / 1024) auslese wurde die Message nicht mit in den Speicher geschrieben ( 5,68 KB > 512 Byte * 10 / 1024). Ich habe das Auslesen jetzt auf 20 Sektoren erweitert und nun funktioniert alles.

 

Einloggen