Autor Thema: qemu -kernel  (Gelesen 3780 mal)

Dimension

  • Beiträge: 155
    • Profil anzeigen
Gespeichert
« am: 25. May 2012, 01:41 »
Laut Qemu-Doku kann man mit -kernel multiboot images laden. Meine kernel.bin ist eine flat binary mit address fields und wird als GRUB image mit -fda geladen, mit -kernel nicht. /boot/memtest86+.bin hat laut mbchk keinen multiboot header, wird aber trotzdem gestartet. Wer weiss bescheid?

kevin

  • Administrator
  • Beiträge: 2 767
    • Profil anzeigen
Gespeichert
« Antwort #1 am: 25. May 2012, 12:08 »
memtest86+ benutzt das Linux-Bootprotokoll, das kann qemu auch.

Was mit deiner kernel.bin falsch ist, kann ich auf Anhieb nicht erraten. Kannst du die Datei irgendwo hochladen oder wenigstens einen Hexdump von den ersten 8k posten? Und welche qemu-Version benutzt du?
Thou shalt not follow the NULL pointer, for chaos and madness await thee at its end.

Dimension

  • Beiträge: 155
    • Profil anzeigen
Gespeichert
« Antwort #2 am: 26. May 2012, 21:47 »
init.asm
MAGIC equ 0x1BADB002
FLAGS equ (1 << 0) | (1 << 16)
CHECK equ -(MAGIC + FLAGS)

MBHDR equ 0x00100000
START equ 0x00100000
END_1 equ 0
END_2 equ 0
ENTRY equ init

extern driver_demo

section .text
dd MAGIC
dd FLAGS
dd CHECK

dd MBHDR
dd START
dd END_1
dd END_2
dd ENTRY

init:
;sti
;int 8

cli
mov esp,stack

mov dword[0xB8000+(2*80+2)*2],'WpOp'
mov dword[0xB8000+(2*80+4)*2],'RpKp'
mov dword[0xB8000+(2*80+6)*2],'Sp!p'
;call driver_demo

cli
hlt

section .data
end_stack:
times 4096 db 0
stack:
hexdump:
00000000  02 b0 ad 1b 01 00 01 00  fd 4f 51 e4 00 00 10 00  |.........OQ.....|
00000010  00 00 10 00 00 00 00 00  00 00 00 00 20 00 10 00  |............ ...|
00000020  fa bc 48 10 10 00 c7 05  44 81 0b 00 57 70 4f 70  |..H.....D...WpOp|
00000030  c7 05 48 81 0b 00 52 70  4b 70 c7 05 4c 81 0b 00  |..H...RpKp..L...|
00000040  53 70 21 70 fa f4 00 00  00 00 00 00 00 00 00 00  |Sp!p............|
00000050  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
*
00001040

mbchk:
bin/kernel.bin: The Multiboot header is found at the offset 0.
bin/kernel.bin: Page alignment is turned on.
bin/kernel.bin: Memory information is turned off.
bin/kernel.bin: Address fields is turned on.
bin/kernel.bin: All checks passed.

mit qemu -cdrom geht alles wunderbar (ich nehme kein -fda wg. imagegröße und kein -hda da partitionieren par bashscript ein graus ist.):
cp bin/kernel.bin cdrom_files
mkisofs -R -b boot/grub/stage2_eltorito -no-emul-boot -boot-load-size 4 -boot-info-table -o cdrom.iso cdrom_files
qemu -no-kvm -cdrom cdrom.iso

mit qemu -no-kvm -kernel bin/kernel.bin kommt allerdings nur:
Starting SeaBIOS (version 0.5.1-20100120_010601-rothera) ich verwende qemu version 0.12.3 .

Wie ist das, ich hatte den Thread versehentlich im falschen Board gepostet - kann er verschoben werden?

Jidder

  • Administrator
  • Beiträge: 1 625
    • Profil anzeigen
Gespeichert
« Antwort #3 am: 26. May 2012, 22:20 »
END_1 equ 0
END_2 equ 0

Das ist das Problem. Qemu denkt dein Kernel hat negative Größe (END_1 - START = -0x100000).
Siehe auch http://www.gnu.org/software/grub/manual/multiboot/html_node/Header-address-fields.html#Header-address-fields

Du musst die Adresse von END_1 und END_2 korrekt angeben. Das ist davon abhängig, wie du den Kernel assemblierst/linkst. Wenn du ihn mit ld linkst, kannst du im Linkerskript Symbole angeben, und die dann verwenden:

Zum Beispiel:
// ...
SECTIONS
{
    . = 0x100000;
    _text = .;              // <-------
    .text : {
        *(.text)
    }
    .data : {
        *(.data)
    }
    .rodata : {
        *(.rodata)
    }
    _edata = .;              // <-------
    .bss : {
        *(.bss)
    }
    _ebss = .;              // <-------
}

Und dann die Makros so definieren:
START equ _text
END_1 equ _edata
END_2 equ _ebss

Wenn du hingegen zu einer flachen Binary assemblierst (dann hast du übrigens das org 0x100000 vergessen), dann musst du die Symbole in der Assembler-Datei definieren:

org 0x100000                 ; <-----

MBHDR equ mbheader         ; <----- so kann man das dann auch machen, aber 0x100000 ist in diesem fall auch ok
START equ _text                ; <----- so kann man das dann auch machen, aber 0x100000 ist in diesem fall auch ok
END_1 equ _edata                ; <-----
END_2 equ _ebss                ; <-----
ENTRY equ init

extern driver_demo

section .text
_text:                ; <-----

mbheader:                ; <-----
dd MAGIC
        ...
        ...
section .data
end_stack:
times 4096 db 0
stack:

_edata:                ; <-----

section .bss                ; <-----
    ; hier BSS hin (zum Beispiel der Stack)
_ebss:                ; <-----

Wie ist das, ich hatte den Thread versehentlich im falschen Board gepostet - kann er verschoben werden?
Hier ist doch okay, oder nicht? Wo willste ihn denn hin haben?
Dieser Text wird unter jedem Beitrag angezeigt.

Dimension

  • Beiträge: 155
    • Profil anzeigen
Gespeichert
« Antwort #4 am: 26. May 2012, 23:20 »
Vielen Dank für den Tipp mit den Labels. Da ich ld verwende, brauche ich kein ORG. Die Labels habe ich mit extern importiert. Leider selbes Ergebnis wie vorher.

ldconfig:
OUTPUT_FORMAT(binary)

SECTIONS
{
. = 0x00100000;

.text :
{
_text = .;
*(.text)
}

.rodata :
{
*(.rodata)
}

.data :
{
*(.data)
_edata = .;
}

.bss :
{
_sbss = .;
*(COMMON)
*(.bss)
_ebss = .;
}
}

init.asm [diff]:
5,8c5,8
< MBHDR equ 0x00100000
< START equ 0x00100000
< END_1 equ 0
< END_2 equ 0
---
> MBHDR equ _text
> START equ _text
> END_1 equ _edata
> END_2 equ _ebss
10a11,13
> extern _text
> extern _edata
> extern _ebss

Wie ist das, ich hatte den Thread versehentlich im falschen Board gepostet - kann er verschoben werden?
Hier ist doch okay, oder nicht? Wo willste ihn denn hin haben?
Nun, in der Beschreibung zum Board "Softwareentwicklung" steht: "Hier sind Fragen und Diskussionen zu Programmiersprachen, Compilern, Emulatoren, Versionskontrollsystemen und sonstigem Handwerkszeug im Bezug auf Lowlevel-Entwicklung richtig aufgehoben.". Nachdem ich das gelesen hatte, dachte ich, dass der Thread dort vielleicht besser aufgehoben wäre und habe zuerst auf "Moderator informieren" geklickt.

kevin

  • Administrator
  • Beiträge: 2 767
    • Profil anzeigen
Gespeichert
« Antwort #5 am: 27. May 2012, 00:13 »
Das ist das Problem. Qemu denkt dein Kernel hat negative Größe (END_1 - START = -0x100000).
Siehe auch http://www.gnu.org/software/grub/manual/multiboot/html_node/Header-address-fields.html#Header-address-fields
Und wie man dort sieht, ist es auch einfach ein qemu-Bug, dass er mit dem Eintrag 0 nicht korrekt umgeht. Dafür gab es auch einen Patch, der es aber bisher aber nicht ins git geschafft hat. Ich schau mal, ob für die 1.1 noch was zu machen ist.
Thou shalt not follow the NULL pointer, for chaos and madness await thee at its end.

Jidder

  • Administrator
  • Beiträge: 1 625
    • Profil anzeigen
Gespeichert
« Antwort #6 am: 27. May 2012, 01:17 »
Das ist das Problem. Qemu denkt dein Kernel hat negative Größe (END_1 - START = -0x100000).
Siehe auch http://www.gnu.org/software/grub/manual/multiboot/html_node/Header-address-fields.html#Header-address-fields
Und wie man dort sieht, ist es auch einfach ein qemu-Bug, dass er mit dem Eintrag 0 nicht korrekt umgeht. Dafür gab es auch einen Patch, der es aber bisher aber nicht ins git geschafft hat. Ich schau mal, ob für die 1.1 noch was zu machen ist.
Naja immerhin hab ich zwei von drei Sätzen gelesen ;) Mein Qemu 0.14.1 kommt tatsächlich mit der Assemblerdatei, in der noch Nullen drin stehen klar...

Das war ja mal ein Schuss ins Leere.
« Letzte Änderung: 27. May 2012, 01:19 von Jidder »
Dieser Text wird unter jedem Beitrag angezeigt.

Dimension

  • Beiträge: 155
    • Profil anzeigen
Gespeichert
« Antwort #7 am: 27. May 2012, 10:46 »
D.h. es liegt möglicherweise an der qemu-version? Habs aus dem ubuntu repository (glaub 10.4).
« Letzte Änderung: 27. May 2012, 10:53 von Dimension »

Dimension

  • Beiträge: 155
    • Profil anzeigen
Gespeichert
« Antwort #8 am: 27. May 2012, 14:45 »
hab mir eine version 1.0.93 gebaut (qemu-1.1.0-rc3). damit gehts thx

 

Einloggen