Kernel wird nicht geladen



  • kann mir da keiner weiterhelfen?


  • Mod

    Ich habe dir gesagt, du sollst von einer funktionierenden Version ausgehen und nur jeweils einen Schritt unternehmen und diesen genau analysieren. 😉



  • es funktioniert ja keine version.
    und PrettyOS ist viel zu komplex dass ich da was "kleines" draus machen kann 😕



  • Warum hast Du dein Linkerscript eigentlich "makefile.txt" genannt?



  • Ich würde ja einfach mal eine ältere SVN Revision angucken. die wird garantiert nicht so komplex wie die aktuelle sein. sind immerhin schon über 800 Revisionen.

    btw. Ich habe mir gerade deinen Code nochmal gezogen und werde ihn mir jetzt mal genauer begutachte. Vielleicht finde ich den Fehler ja.

    PNoob


  • Mod

    checke mal dein linker script auf den einstieg



  • Habe vermutlich deinen Fehler gefunden.

    Du nutzt als Dateiformat für deinen Kernel binary. das heißt der entry Point muss an offset 0 liegen. bzw. der BL muss wissen an welchem Offset der entry point liegt. da eine Binary aber keinen header hat und der code direkt am anfang liegt. muss man entweder den entrypoint explizit an offset 0 linken oder an einen anderen festen definierten punkt den man dann auch im BL ienträgt. ich würde ganz eindeutig zu veriosn eins rten. wie man das genau macht, kannst du im PrettyOS Linkerscript sehen.

    Ich hoffe das das der Fehler ist. und er sich so wie ich es sage beheben lässt.

    PNoob



  • dann guck ich da nochmal..

    Warum hast Du dein Linkerscript eigentlich "makefile.txt" genannt?

    öhm das weis ich jetz auch nicht mehr.


  • Mod

    Schau mal hier:

    OUTPUT_FORMAT(binary)
    OUTPUT_ARCH(i386)
    STARTUP(object_files/kernel/kernel.o)
    SECTIONS
    { ...
    

    Das ist wichtig: STARTUP(... kernel.o)

    Erzeuge dir eine kernel.map: kernel.ld -Map kernel.map

    0x00100000 . = 0x100000
    0x00100000 __kernel_beg = .

    .text 0x00100000 0x1522b
    0x00100000 __code_start = .
    .text 0x00100000 0x1d object_files/kernel/kernel.o
    *fill* 0x0010001d 0x3 00
    .text 0x00100020 0x5f7 object_files/kernel/ckernel.o
    0x0010006a _showMemorySize
    0x001000d9 _main

    Schau dir bei deiner map genau an, wo kernel.o und wo main liegt!

    kernel.asm (später kernel.o) macht ja den Aufruf von main, muss dafür aber vorne liegen, damit es gefunden wird:

    extern main ; entry point in ckernel.c
    call   main
    


  • 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...


Anmelden zum Antworten