Kernel wird nicht geladen



  • ok, und die adressen muss ich dann irgendwo angeben?



  • Nein.

    das ist nur für den Entwickler eine kleine kontrolle ob alles passt mehr nicht


  • Mod

    Die Anfangsadresse gibt man an:

    OUTPUT_FORMAT(binary)
    OUTPUT_ARCH(i386)
    STARTUP(object_files/kernel/kernel.o)
    SECTIONS
    {
    . = 0x00100000;
    _kernel_beg = .;
    .text : { _code_start = .; }
    . = ALIGN(0x1000);
    .text1 : { object_files/kernel/data.o(.text) }
    .data : { _data_start = .; *(.data) }
    .rodata : { _rodata_start = .; *(.rodata) *(.rdata) }
    .bss : { _bss_start = .; *(.bss) }
    _start_cdi_drivers = .;
    .cdi : { _cdi_start = .; *(.cdi) }
    _stop_cdi_drivers = .;
    _kernel_end = .;
    _end = .;
    }

    Beschäftige Dich bitte mit dem Linkerscript:
    http://www.delorie.com/gnu/docs/binutils/ld_9.html



  • Die Anfangsadresse hat er ja schon in seinem linkerscript stehen. daher braucht er nichts weiter machen.


  • Mod

    Ich lade keine 43 MB, um mir diesen Murks anzuschauen.



  • Die Anfangsadresse hat er ja schon in seinem linkerscript stehen. daher braucht er nichts weiter machen.

    geht trotzdem nicht. es wird sogar ganeu die funktion ausgeführt die ich NICHT aufrufe sondern die, die in der video.c daruntersteht und es kommt auch das HLT ^^
    meint computer mag mich glaub ich nicht ^^



  • Ich lade keine 43 MB, um mir diesen Murks anzuschauen.

    klar, erst haben wollen und dann aber nicht annehmen


  • Mod

    klar, erst haben wollen und dann aber nicht annehmen

    43 MB? Was soll der Quatsch? Jetzt reicht es wirklich.


  • Mod

    Ansonsten hast Du alle Informationen, die Du benötigst. Hör auf zu jammern und analysiere sauber. Zeige mal dein Linkerscript und deine map.

    Wenn es daran nicht liegt, gehen wir nochmal ins makefile.



  • Zeige mal dein Linkerscript und deine map.

    dazu hab ich das ganze ja hochgeladen gehabt. und sooo viel sind 40 MB auc hwieder nicht.

    map:

    Memory Configuration
    
    Name             Origin             Length             Attributes
    *default*        0x00000000         0xffffffff
    
    Linker script and memory map
    
    LOAD obj-files\kernel32.o
                    0x00100000                . = 0x100000
                    0x00100000                _kernel_beg = .
    
    .text           0x00100000      0x11c
                    0x00100000                _code_start = .
     .text          0x00100000       0x19 obj-files\kernel32.o
     *fill*         0x00100019        0x3 00
     .text          0x0010001c       0x19 obj-files\kernel32.o
     *fill*         0x00100035        0x3 00
     .text          0x00100038       0x10 obj-files\ckernel.o
                    0x00100038                __main
     .text          0x00100048       0xd4 obj-files\video.o
                    0x001000e5                _clear_screen
                    0x00100048                _outportb
                    0x0010005d                _update_cursor
                    0x001000e0                _print
                    0x00101000                . = ALIGN (0x1000)
    
    .data           0x00101000        0x4
                    0x00101000                _data_start = .
     *(.data)
     .data          0x00101000        0x0 obj-files\ckernel.o
     .data          0x00101000        0x4 obj-files\video.o
                    0x00101000                _vidmem
    
    .rodata         0x00101004        0x0
                    0x00101004                _rodata_start = .
     *(.rodata)
     *(.rdata)
    
    .bss            0x00101004        0x4
                    0x00101004                _bss_start = .
     *(.bss)
     .bss           0x00101004        0x0 obj-files\ckernel.o
     .bss           0x00101004        0x4 obj-files\video.o
                    0x00101004                _position
     *(COMMON)
                    0x00101008                _kernel_end = .
                    0x00101008                _end = .
    LOAD obj-files\kernel32.o
    LOAD obj-files\ckernel.o
    LOAD obj-files\video.o
    OUTPUT(kernel32.bin binary)
    

    link:

    OUTPUT_FORMAT(binary)
    OUTPUT_ARCH(i386)
    STARTUP(obj-files\kernel32.o)
    SECTIONS
    {
        . = 0x00100000;
        _kernel_beg = .;
        .text   : { _code_start = .;                        }
        . = ALIGN(0x1000);
        .data   : { _data_start = .;   *(.data)             }
        .rodata : { _rodata_start = .; *(.rodata) *(.rdata) }
        .bss    : { _bss_start = .;    *(.bss) *(COMMON)    }
        _kernel_end = .;
        _end = .;
    }
    

    Wenn es daran nicht liegt, gehen wir nochmal ins makefile.

    ich hab ja kein makefile



  • 40 MB sind viel.
    Und wenn dein Linkerscript makefile.txt heißt, ist es wohl verständlich, dass es schwer ist, es zu finden.

    Ich finde in deiner build.bat keine Stelle, wo kernel32.asm assembliert wird...



  • ist ja gut..

    die hab ich schon asembliert mit
    nasm -f coff kernel32.asm -o kernel32.o



  • Sicher, dass Du coff möchtest und nicht bin? Vielleicht spielts aber keine Rolle, was man dort angibt.



  • mit bin gehts nicht



  • Wie, mit bin gehts nicht? Was heißt "geht nicht"?



  • nasm sagt mir dann:
    error: binary output format doesnt support external references

    (wieso heißt nasm bei mir eigentlich nasm.exe und nicht wie überall geschrieben wird nasmw.exe (bei windows)? ^^)



  • Ich glaub, ich weiß, was der Fehler ist. Ändere in kernel32.asm mal das __main in _main.
    Ist der Fehler damit weg?

    nasmw.exe gibts übrigens schon lange nicht mehr. Auch PrettyOS nimmt eine nasm.exe. Die Datei hieß bei sehr alten nasm-Versionen noch nasmw.exe


  • Mod

    und sooo viel sind 40 MB auch wieder nicht

    Bei dem Mini-OS ist 0,1 MB schon zuviel! Man sendet, wenn möglich, nur die sources und die zugehörigen makefiles, linker scripts. Keine Fotos von sich selbst, Programme oder was weiß ich was.

    nasmw.exe

    http://www.nasm.us/pub/nasm/releasebuilds/2.10rc4/win32/
    Für Windows-Host. Der Name nasm.exe ist ok und üblich, vergiss nasmw.exe.

    nasm sagt mir dann:
    error: binary output format doesnt support external references

    http://www.posix.nl/linuxassembly/nasmdochtml/nasmdoc6.html
    Using the bin format puts NASM by default into 16-bit mode (see section 5.1). In order to use bin to write 32-bit code such as an OS kernel, you need to explicitly issue the BITS 32 directive.



  • Ich glaub, ich weiß, was der Fehler ist. Ändere in kernel32.asm mal das __main in _main.

    so wie ich das jetz hab mit den unterstrichen in asm und c ist die einzige version wo LD linkt. sonst kommt eigentlich immer nen undefined reference fehler

    ckernel.o:ckernel.c.... undefined reference to ___main
    

    wenn ich in kernel32.asm _main schreibe und in ckernel.c
    int main() (ohne unterstrich).


  • Mod

    OK, linken ist schon mal nicht schlecht.
    Was läuft nun? Wie sieht die map aus? Wird main aufgerufen? Was passiert?


Anmelden zum Antworten