Kernel wird nicht geladen
-
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?
-
So wie Du das jetzt hast mit den Unterstrichen, sieht es ziemlich falsch aus.
Mach alle Unterstriche bei Funktionsnamen in den C- und Asm-Dateien mal weg. Dann sollte es gehen, sofern Du _ohne_ -fleading-underscore compilierst
-
Mach alle Unterstriche bei Funktionsnamen in den C- und Asm-Dateien mal weg. Dann sollte es gehen, sofern Du _ohne_ -fleading-underscore compilierst
ganz ohne unterstriche kommt das:
http://www8.pic-upload.de/05.03.11/tutsomiigbuc.jpg
-
mit -fleading-underscore verwendest Du den einfachen underscore nur in asm, aber nicht in C.
-
Der Linker will nicht. Das Thema ist bekannt, wenn man 16- und 32-Bit-Code in asm mischt. Zeige mal bitte deine kernel32.asm.
-
mit -fleading-underscore verwendest Du den einfachen underscore nur in asm, aber nicht in C.
-->
ckernel.o:ckernel.c.... undefined reference to ___main
EDIT:
kernel32.asm:[Bits 32] ; http://www.lowlevel.eu/wiki/Multiboot GRUB_FLAGS equ 10b ; Flags for GRUB header GRUB_MAGIC_NUMBER equ 0x1BADB002 ; Magic number for GRUB header GRUB_HEADER_CHECKSUM equ -(GRUB_MAGIC_NUMBER + GRUB_FLAGS) ; Checksum for GRUB header align 4 MultiBootHeader: ; This is the "multiboot" header for GRUB dd GRUB_MAGIC_NUMBER dd GRUB_FLAGS dd GRUB_HEADER_CHECKSUM KernelStart: mov esp, 0x190000 push ebx ; EBX points to the multiboot structure created by the bootloader and containing e.g. the address of the memory map extern _main ; entry point in ckernel.c call _main cli hlt
-
vielleicht verwechsle ich das schon wieder: Probier mal -fnoleading-underscore
-
dann kommt auch
ckernel.o:ckernel.c.... undefined reference to ___main
-
Woher kommen plötzlich die _drei_ Unterstriche?
-
Nochmal aus PrettyOS:
[Bits 32] ; http://www.lowlevel.eu/wiki/Multiboot GRUB_FLAGS equ 10b ; Flags for GRUB header GRUB_MAGIC_NUMBER equ 0x1BADB002 ; Magic number for GRUB header GRUB_HEADER_CHECKSUM equ -(GRUB_MAGIC_NUMBER + GRUB_FLAGS) ; Checksum for GRUB header align 4 MultiBootHeader: ; This is the "multiboot" header for GRUB dd GRUB_MAGIC_NUMBER dd GRUB_FLAGS dd GRUB_HEADER_CHECKSUM KernelStart: mov esp, 0x190000 push ebx ; EBX points to the multiboot structure created by the bootloader and containing e.g. the address of the memory map extern main ; entry point in ckernel.c call main cli hlt
Flags:
# Compiler-/Linker-Flags NASMFLAGS= -Ox -f elf CCFLAGS= -c -std=c99 -march=i386 -Wshadow -m32 -Werror -Wall -s -O -ffreestanding -nostdinc -fno-pic -fno-strict-aliasing -fno-builtin -fno-stack-protector -fno-common -Iinclude LDFLAGS= -nostdlib --warn-common
-
das frag ich mich auch
-
Also am besten alle underscores weglassen, und nicht erwähnen bei den flags im makefile. So gehts bei uns momentan.
-
schau mal hier: http://www.delorie.com/gnu/docs/gcc/gccint_170.html
-
jetzt hab ich mal diese flags benutzt nd ohne unterstriche.
bis auf, dass bei video.c/video.h jetzt viele errors kommen, ist wieder folgendes:
http://www8.pic-upload.de/05.03.11/tutsomiigbuc.jpg
-
coff verwenden wir nicht. -Ox -f elf
-
das war noch das alte bild. hab jetzt elf.
mit collect2 guck ich grad mal
-
du hast drei tools: nasm, gcc, ld und die zugehörigen Flags. Da kann man eine Menge falsch machen. Bau es doch erst mal wie prettyOS auf. Der ld kommt momentan nicht klar mit deinen object-Dateien.