Kernel wird nicht geladen
-
Ich sehe auf die Schnelle auch keinen Grund, warum das stoppt. Hast du diese print-Funktion nicht schon erfolgreich verwendet? Wo genau steigt der Code aus?
Teste mit bochs debugger.
-
http://www8.pic-upload.de/26.02.11/oblbzbmdads.jpg
der springt wohl nach clear_screen direkt ans/hinters ende vom ckernel, im asm-kernel der den ckernel läd steht nach dem call auch cli und hlt.
wenn ich
clear_screen(); asm("hlt"); print("Hallo", 0x07);
schreibe, schreibt der Debugger das Gleiche (hält nicht bei asm("hlt"); ) und wenn ich das
asm("hlt");
ans Ende von void clear_screen() (nach der while-schleife) schreibe bleibt er da stehen. also hört er irgendwie nach clear_screen mit dem ckernel auf.//wenn ich das print("Hallo", 0x07); vor clear_screen() aufrufe schreibt er erst garnicht. nur son paar befehle:
http://www8.pic-upload.de/26.02.11/x8cvyq5l6xw.jpg
(nach leave kommt wieder cli, hlt)
-
Das Problem sollte bei print oder in deinem makefile liegen.
Verwende mal unsigned char (außer bei Text).
char ist normalerweise signed char.
Sollte aber eigentlich nicht der Grund sein.
Immerhin kannst Du nun mit dem Debugger umgehen.
Gehe schrittweise durch und analysiere genau.
-
ich hab das jetzt nochmal vereinfacht und nach meinem wissen ne "zeichnung"/screenshot gemacht (find ich wirklich verwirrend):
-
http://www.henkessoft.de/C/C-Programming Under The Hood.htm
Dort findest Du die Abläufe beim Aufruf einer C-Funktion.Ansonsten: Analytisch gehst du das Thema nun wirklich gut an. Auf diese Weise wirst Du es schaffen. Immer nur einen Schritt nehmen und alles checken.
-
ich weis aber nicht was der fheler sein sollte wenn ich in print() nichts reinschreibe oder nur return; und im ckernel nur print(); aufrufe und außer
while(1){} bzw. for( ; ; ); nichts anderes schreibe
geht auch nicht. im debugger seh ich ja auch nur
leave, ret, cli, hlt (das leave ist ja noch richtig)
-
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