Kernel wird nicht geladen
-
Ich kann momentan nicht beurteilen, warum die for- bzw. while-Endlosschleife nicht greift. Dazu müsste ich den Gesamtcode incl. makefile und linkerscript sehen.
Du bist aber nun auf dem richtigen Weg, Fehler selbst zu finden und zu beheben. Starte von einem System, das funktioniert, und unternehme dann nur Einzelschritte, die Du vollständig analysierst und im Fehlerfall selbst beheben kannst. Vorbilder findest Du genügend bei lowlevel, osdev.org, brokenthorn.com oder bei meinen Tutorials.
Hier hast Du einen Überblick über beachtenswerte Hobby-OS (z.Z. Stand 1.9.2010):
http://www.c-plusplus.net/forum/273023
-
ich benutz grad kein makefile nur batchdateien. (dasproblem sollte da nicht liegen oder?) und das image mach ich mit sonem Programm (BFI).
ich hab das ganze einfach mal hochgeladen:
http://store.markusfrohne.de/files/OsDev.zipEDIT:
mit C++ löst sich das auch nicht. Wenn ich da als Klasse CVideo habe und nurint main(){ CVideo video; while(1){} return 0; }
schreibe, bleibt er bei while zwar stehen aber nicht wenn ich dann noch video.print(); aufrufe
-
kann mir da keiner weiterhelfen?
-
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
-
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.
-
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 _mainSchau 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
-
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.
-
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
-
klar, erst haben wollen und dann aber nicht annehmen
43 MB? Was soll der Quatsch? Jetzt reicht es wirklich.
-
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.