Problem mit Kompiler für OS



  • Linkskript:

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

    Kernel.asm:

    [Bits 32]
    section .text          ; ld needs that for coff format
    
    [global KernelStart]
    KernelStart:
        mov    ax, 0x10
        mov    ds, ax      ; data descriptor --> data, stack and extra segment
        mov    ss, ax          
        mov    es, ax
        xor    eax, eax    ; null desriptor --> FS and GS
        mov    fs, ax
        mov    gs, ax
        mov    esp, 0x200000 ; set stack below 2 MB limit
    
    [extern _main]         ; entry point in ckernel.c
        call _main ; ->-> C-Kernel
        jmp $
    

  • Mod

    ... sieht unverdächtig aus. Schau mal nach kernel.map, ob da alles am rechten Platz gelandet ist, vor allem am Anfang bei 0x8000.



  • Memory Configuration
    
    Name             Origin             Length             Attributes
    *default*        0x00000000         0xffffffff
    
    Linker script and memory map
    
                    0x00008000                phys = 0x8000
    
    .text           0x00008000       0xfb
     *(.text)
     .text          0x00008000       0x1c kernel.o
                    0x00008000                KernelStart
     .text          0x0000801c       0xdf ckernel.o
                    0x00008041                _k_printf
                    0x0000801c                _k_clear_screen
                    0x00008091                _outportb
                    0x0000809d                _update_cursor
                    0x000080cb                _main
    
    .data           0x000080fc        0x0 load address 0x000080fb
     *(.data)
     .data          0x000080fc        0x0 ckernel.o
    
    .rodata
     *(.rodata)
    
    .rodata.str1.1  0x000080fb       0x38
     .rodata.str1.1
                    0x000080fb       0x38 ckernel.o
    
    .bss            0x00008134        0x0 load address 0x00008133
     *(.bss)
     .bss           0x00008134        0x0 ckernel.o
    LOAD kernel.o
    LOAD ckernel.o
    OUTPUT(ckernel.bin binary)
    
    .comment        0x00000000       0x31
     .comment       0x00000000       0x1f kernel.o
     .comment       0x0000001f       0x12 ckernel.o
    

    Ich kann dort nichts finden!


  • Mod

    ja, sieht gut aus. Wo kommt denn das phys = 0x8000 her? Da passt etwas nicht zusammen.



  • Keine Anhnung, aber vielleicht hat es etwas damit zu tuen:

    jmp 0x8:0x8000    ; this is a 16-bit-FAR-Jmp, but CS is loaded with "index" 8 in GDT
                          ; hence, the code will be interpreted as 32 bit from here on
                          ; the address can be found in the linker script (phys)
    

  • Mod

    Das ist der far jump zum Protected mode. Der ist o.k. Ich habe nur darauf hin weisen wollen, dass das Linkerskript und kernel.map nicht zusammen passen, weil in einem phys (Variable) steht und im anderen nicht.



  • Jetzt weis ich nicht was ich machen soll.


  • Mod

    Ist irgendetwas Komisches, schaffen wir aber auf jeden Fall. Schicke mir alle Dateien an die Mail-Adresse, die hier genannt ist: http://www.henkessoft.de/Impressum/impressum.htm
    ... und teile mir genau die verwendeten Tools und die Fehlermeldungen (sieht man nur in der Konsole!) mit.

    So, ich habe mir alles angeschaut. Alle Dateien wurden fehlerlos erzeugt.

    cmd /c copy /b boot.bin + ckernel.bin HobbyOS.bin
    boot.bin
    ckernel.bin

    Ausgabe ist in Ordnung: 🙂

    Welcome to HenkesSoft OS.

    The C kernel has been loaded.

    Ich musste im makefile lediglich nasm in namsw umbennenen, aber das ist nebensächlich.

    Ich verwende mingw32-make.exe von:
    http://www.henkessoft.de/OS_Dev/OS_Dev2.htm#mozTocId585387
    http://sourceforge.net/project/showfiles.php?group_id=2435&package_id=23918

    Prüfe auch dein Bochs config file.
    http://www.henkessoft.de/OS_Dev/OS_Dev1.htm#mozTocId440953 (dort Punkt 4)

    CrossTools genau prüfen (Aufruf, Pfad). Vielleicht läuft da etwas parallel in ein anderes Verzeichnis mit anderen Tools (gcc, ld, make, ...)?


  • Mod

    Jetzt weis ich nicht was ich machen soll.

    Nur als Hinweis, weil häufiger Fehler: Ich weiß kommt von wissen, daher ß oder Doppel-s.


  • Mod

    @Hobby Programmierer: Konntest Du das Problem ausfindig machen und beheben?



  • So, in Bochs läugt es jetzt Fehlerfrei, nur in VirtualBox von Sun will es nicht so recht. Aber egal. Es läuft, vielen Dank für die Hilfe.



  • Schön für dich. Toll. Jetzt bloß nicht schreiben, woran es letztendlich lag. 🙄



  • Sorry! Warum es nicht in Virtualbox geht, weiß ich nicht. Aber in Bochs lag der Fehler daran, dass die Datei HobbyOS als Endung .bin hat, aber er nur eine mit .img akzeptiert. Also musste ich in Bochs als Image dann nur HobbyOS auswählen und das ganze Configfile speichern.


  • Mod

    Aber in Bochs lag der Fehler daran, dass die Datei HobbyOS als Endung .bin hat, aber er nur eine mit .img akzeptiert. Also musste ich in Bochs als Image dann nur HobbyOS auswählen und das ganze Configfile speichern.

    Mein bochs config (man kann aus der Vorlage "bochsrc-sample.txt" mehrere mit verschiedenen Namen definieren. Ich verwende immer kurze Namen wie f1, f2, f3 ..., damit ich wenig tippen muss) sieht momentan so aus:

    romimage: file=$BXSHARE/BIOS-bochs-latest

    cpu: count=1, ips=10000000, reset_on_triple_fault=1

    megs: 32

    vgaromimage: file=$BXSHARE/VGABIOS-lgpl-latest

    vga: extension=vbe

    floppya: 1_44=G:\OSDev\User*MyOS.bin*, status=inserted

    ata0: enabled=1, ioaddr1=0x1f0, ioaddr2=0x3f0, irq=14
    ata1: enabled=1, ioaddr1=0x170, ioaddr2=0x370, irq=15
    ata2: enabled=0, ioaddr1=0x1e8, ioaddr2=0x3e0, irq=11
    ata3: enabled=0, ioaddr1=0x168, ioaddr2=0x360, irq=9

    boot: floppy

    floppy_bootsig_check: disabled=0

    log: bochsout.txt

    panic: action=ask
    error: action=report
    info: action=report
    debug: action=ignore

    debugger_log: -

    parport1: enabled=1, file="parport.out"

    vga_update_interval: 300000

    keyboard_serial_delay: 250

    keyboard_paste_delay: 100000

    mouse: enabled=0

    private_colormap: enabled=0

    keyboard_mapping: enabled=0, map=

    i440fxsupport: enabled=0

    Dort kann man beliebige Namen vorgeben. Ob img oder bin oder ... sollte somit egal sein. 😕



  • Keine Ahnung warum das so ist. In VirtualBox kommt immer nur die Bootloader-Message und in Bochs geht es einwandfrei. Ich werde jetzt dein Tut erstmal weiter durch arbeiten. Und mit dessen Hilfe werde ich mir dann ein eigenes kleines OS aufbauen, um den PC besser zu verstehnen zu lernen. Bestimmt habe ich irgendwann Probleme, dann melde ich mich wieder.


  • Mod

    Bestimmt habe ich irgendwann Probleme

    darauf kannst Du wetten! 😉



  • Dieser Thread wurde von Moderator/in Nobuo T aus dem Forum Assembler in das Forum Projekt: OS-Development verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.



  • Zum Thema VirtualBox: Es hilft mglw. in den Optionen der Maschine eine Option einzuschalten. Welche weiß ich aus dem Kopf nicht mehr, aber probiere mal folgende:
    VT-x/AMD-V
    Nested Paging
    PAE/NX
    APIC
    IO-APIC

    Eine von denen hat bei mir geholfen.

    mfg
    Mr. X



  • Danke, aber ich beschäftige mich mit dem Ehenkes Tut schon länger nicht mehr. mache nun ein eigenes OS Projekt.


Anmelden zum Antworten