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
-
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.
-
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
-
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 referenceshttp://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).
-
OK, linken ist schon mal nicht schlecht.
Was läuft nun? Wie sieht die map aus? Wird main aufgerufen? Was passiert?