Autor Thema: Grub auf Diskette?  (Gelesen 27685 mal)

sp

  • Gast
Gespeichert
« Antwort #20 am: 27. February 2005, 17:48 »
Ein bisschen mehr muss schon in die ASM Datei, hier ein Beispiel:[BITS 32]

EXTERN _main
GLOBAL start

jmp start

MULTIBOOT_PAGE_ALIGN   equ 1<<0
MULTIBOOT_MEMORY_INFO  equ 1<<1

MULTIBOOT_HEADER_MAGIC equ 0x1BADB002
MULTIBOOT_HEADER_FLAGS equ MULTIBOOT_PAGE_ALIGN | MULTIBOOT_MEMORY_INFO
CHECKSUM equ -(MULTIBOOT_HEADER_MAGIC + MULTIBOOT_HEADER_FLAGS)

align 4
dd MULTIBOOT_HEADER_MAGIC
dd MULTIBOOT_HEADER_FLAGS
dd CHECKSUM

start:
push 0
popf

push eax
push ebx

call _main

Und die Kernel.cppint main( multiboot_info_t *boot_info, DWORD magic_code )
{
}


Aber denk an deinen Stack, bevor du zur main springst.

JG

  • Beiträge: 189
    • Profil anzeigen
Gespeichert
« Antwort #21 am: 27. February 2005, 18:27 »
Danke!  :D
Noch eine Frage zum Stack:
Warum mus ich den Stack initialisieren? Zuwas ist das gut?

JG

  • Beiträge: 189
    • Profil anzeigen
Gespeichert
« Antwort #22 am: 28. February 2005, 15:49 »
Ich dreh noch durch!
Wenn ich die Datei hier:

int main(multiboot_info_t *boot_info, DWORD magic_code)
{
char *Text = "Welcome to Protected Mode";
char *VideoMem = (char*)0xB8000;
while(*Text)
{
*VideoMem = *Text;
*VideoMem++;
*VideoMem = 7;
*VideoMem++;
*Text++;
}
return(0);
}


kompilieren will, dann sagt er: Fehler beim Parsen before '*' token
dann hab ich int main(multiboot_info_t *boot_info, DWORD magic_code
in int main(multiboot_info_t, *boot_info, DWORD magic_code
umgeändert, aber trotzdem die gleiche meldung...

sp

  • Gast
Gespeichert
« Antwort #23 am: 28. February 2005, 16:21 »
int main(multiboot_info_t, *boot_info, DWORD magic_codeDas ist natürlich auch nicht richtig.

Damit der Code funktioniert, musst du den Struct multiboot_info_t aus der Grub-Doku einbinden.
Sonst kennt er den Typ nicht.

JG

  • Beiträge: 189
    • Profil anzeigen
Gespeichert
« Antwort #24 am: 28. February 2005, 16:30 »
Ich glaub ich stell mich zu dumm für Grub an....
Ich bekomm des einfach net hin!

sp

  • Gast
Gespeichert
« Antwort #25 am: 28. February 2005, 19:15 »
Naja, du kannst boot_info natürlich erst einmal auch weglassen. darfst dann nur nicht ebx pushen.

JG

  • Beiträge: 189
    • Profil anzeigen
Gespeichert
« Antwort #26 am: 28. February 2005, 20:32 »
Also, bevor ich dann noch tausendmal frag:
1. Ich mach eine Datei Boot.asm

[BITS 32]

EXTERN main
GLOBAL start

jmp start

MULTIBOOT_PAGE_ALIGN   equ 1<<0
MULTIBOOT_MEMORY_INFO  equ 1<<1

MULTIBOOT_HEADER_MAGIC equ 0x1BADB002
MULTIBOOT_HEADER_FLAGS equ MULTIBOOT_PAGE_ALIGN | MULTIBOOT_MEMORY_INFO
CHECKSUM equ -(MULTIBOOT_HEADER_MAGIC + MULTIBOOT_HEADER_FLAGS)

align 4
dd MULTIBOOT_HEADER_MAGIC
dd MULTIBOOT_HEADER_FLAGS
dd CHECKSUM

start:  
   push 0
   popf
   
   push eax
   
   call main

(Die unterstriche hab ich weggelassen, weil es unter Linux net anders geht.)

2. Dann noch eine ckernel.c(pp)

int main( DWORD magic_code )
{
   char *Text = "Welcome to Protected Mode";
   char *VideoMem = (char*)0xB8000;
   while(*Text)
   {
      *VideoMem = *Text;
      *VideoMem++;
      *VideoMem = 7;
      *VideoMem++;
      *Text++;
   }
   return(0);
}

3. dann die boot.asm zu einer *.obj Datei assemblieren und die kernel.c(pp) zu einer *.obj kompilieren.
3. mit dem

        OUTPUT_FORMAT("elf32-i386")
        INPUT(kernel32.obj ckernel.obj)
        ENTRY(entry)
        virt = 0xC0000000; /* 3 gig */
        phys = 0x100000; /* 1 meg */
        SECTIONS
        {   .text virt : AT(phys)
            {   code = .;
                *(.text)
                . = ALIGN(4096); }
            .data :  AT(phys + (data - code))
            {   data = .;
                *(.data)
                . = ALIGN(4096); }
            .bss :  AT(phys + (bss - code))
            {   bss = .;
                *(.bss)
                *(COMMON)
                . = ALIGN(4096); }
            end = .; }

linkerfile linken
4. Das ganze von grub laden lassen
5. Hoffen das es funktioniert

So müsste es gehen, oder is es mal wieder total falsch?

sp

  • Gast
Gespeichert
« Antwort #27 am: 01. March 2005, 06:53 »
Zitat
Die unterstriche hab ich weggelassen, weil es unter Linux net anders geht.
Was hat das den mit Linux zu tun? Das ist doch gehört doch wohl eher zu C.

Sonst einfach zusammenbauen und booten, wenns nicht geht hilft uns vielleicht schon die Fehlermeldung von Grub weiter.

JG

  • Beiträge: 189
    • Profil anzeigen
Gespeichert
« Antwort #28 am: 01. March 2005, 14:23 »
Wenn ich die C Datei kompilieren will kommt

Fehler beim Parsen before "magic_code"

sp

  • Gast
Gespeichert
« Antwort #29 am: 01. March 2005, 15:18 »
Was für einen Compiler benutzt du?

Hast du DWORD deklariert ... ?

JG

  • Beiträge: 189
    • Profil anzeigen
Gespeichert
« Antwort #30 am: 01. March 2005, 19:19 »
Zitat
Was für einen Compiler benutzt du?

GCC

Zitat
Hast du DWORD deklariert ... ?

Halt in der asm Datei...

sp

  • Gast
Gespeichert
« Antwort #31 am: 01. March 2005, 19:27 »
Du musst den Typ auch in C deklarieren.

typedef unsigned long dword;
#define DWORD dword

JG

  • Beiträge: 189
    • Profil anzeigen
Gespeichert
« Antwort #32 am: 01. March 2005, 19:33 »
Ha, es geht, aber nun brauch ich nur noch grub
Die Version, die ich hab läde nur eine .bin Datei

JG

  • Beiträge: 189
    • Profil anzeigen
Gespeichert
« Antwort #33 am: 01. March 2005, 19:47 »
Oder, es geht schon, aber nun meckert Grub das:
Loading below 1MB is not supportet

sp

  • Gast
Gespeichert
« Antwort #34 am: 02. March 2005, 14:39 »
Du musst dem Linker sagen, dass er ein Offest von 1 MB benutzen soll.
Dann wird Grub dein Kernel, hoffentlicht, ohne Jammern laden und ausführen.
Den Fehler hatte ich beim Ersten Start übrigens auch :).

JG

  • Beiträge: 189
    • Profil anzeigen
Gespeichert
« Antwort #35 am: 02. March 2005, 14:42 »
Hallo,
also muss ich doch das

        OUTPUT_FORMAT("elf32-i386")
        INPUT(kernel32.obj ckernel.obj)
        ENTRY(entry)
        virt = 0xC0000000; /* 3 gig */
        phys = 0x100000; /* 1 meg */
        SECTIONS
        {   .text virt : AT(phys)
            {   code = .;
                *(.text)
                . = ALIGN(4096); }
            .data :  AT(phys + (data - code))
            {   data = .;
                *(.data)
                . = ALIGN(4096); }
            .bss :  AT(phys + (bss - code))
            {   bss = .;
                *(.bss)
                *(COMMON)
                . = ALIGN(4096); }
            end = .; }
umändern, oder? Wohin lädst duu deinen Kernel?

sp

  • Gast
Gespeichert
« Antwort #36 am: 02. March 2005, 21:27 »
Hier ist das Linker-Script welches ich benutzte, ist allerdings nicht von mir...
OUTPUT_FORMAT("elf32-i386")
ENTRY(start)
SECTIONS
{
    .text 0x100000:
    {
        code = .; _code = .; __code = .;
        *(.text)
        . = ALIGN(4096);
    }

    .data :
    {
__CTOR_LIST__ = .; LONG((__CTOR_END__ - __CTOR_LIST__) / 4 - 2) *(.ctors)   LONG(0) __CTOR_END__ = .;

        __DTOR_LIST__ = .; LONG((__DTOR_END__ - __DTOR_LIST__) / 4 - 2) *(.dtors) LONG(0) __DTOR_END__ = .;
       
        data = .; _data = .; __data = .;
        *(.data)
        . = ALIGN(4096);
    }

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

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

JG

  • Beiträge: 189
    • Profil anzeigen
Gespeichert
« Antwort #37 am: 05. March 2005, 11:13 »
es geht, danke

JG

  • Beiträge: 189
    • Profil anzeigen
Gespeichert
« Antwort #38 am: 07. March 2005, 17:14 »
Noch eine Frage:
Hab ich im pm automatisch einen Stack, wo ich sachen drauf pushen kann?

sp

  • Gast
Gespeichert
« Antwort #39 am: 07. March 2005, 20:44 »
Jain, Grub baut natürlich einen Stack, aber damit kann es, wenn du nicht prüfst wo er liegt und wie groß er ist, zu einem Absturz kommen.

 

Einloggen