1
Lowlevel-Coding / GRUB und C Kernel Problem
« am: 24. August 2007, 21:14 »
Hallo zusammen,
nachdem ich wieder Interesse an OS developing habe, wollte ich wider mal anfangen zu coden. Auf www.osdever.net ist ein Tutorial, "a simple C kernel" so.
Jedenfalls habe ich den start.asm verstanden und kann ohne zu gucken coden:
so dieses code kompilimiere ich mit:
nasm -f aout -o start.o start.asm
und bindes es so :
ld -T link.ld -o kernel.bin start.o
mit diesem linker script:
so, mit dem hexeditor öffne ich den kernel, und da ist der multiboot header...
jetzt mache ich eine datei namens main.c, implementiere zum testen eine strlen:
dies komplimiere ich so:
gcc -Wall -O -fstrength-reduce -fomit-frame-pointer -finline-functions -nostdinc -fno-builtin -I./include -c -o main.o main.c
und binde es wie oben:
ld -T link.ld -o kernel.bin start.o main.o
okay, jetzt das ganze im hex editor angeschaut: nein, kein multiboot header, sondern nur die variabel "hi" und lauter 0er, 1MB lang..., und meine theorie bestätigt sich:
GRUB sagt: not executable format... oder so, jedoch, lösche ich den callback strlen:
geht es auf einmal, da ist auch ein multiboot header da.
Ich arbeite unter gcc-Version 4.1.2 (Ubuntu 4.1.2-0ubuntu4)
woran KÖNNTE es leigen? ps: hab auf google etwas geschaut, auch hier, doch nicht BRAUCHBARES gefunden
Mfg Ercan
nachdem ich wieder Interesse an OS developing habe, wollte ich wider mal anfangen zu coden. Auf www.osdever.net ist ein Tutorial, "a simple C kernel" so.
Jedenfalls habe ich den start.asm verstanden und kann ohne zu gucken coden:
Code: [Auswählen]
; Blackout 2007 (OS)
; Copyright (C) 2007 Ercan Akyürek
;
; This program is free software: you can redistribute it and/or modify
; it under the terms of the GNU General Public License as published by
; the Free Software Foundation, either version 3 of the License, or
; (at your option) any later version.
;
; This program is distributed in the hope that it will be useful,
; but WITHOUT ANY WARRANTY; without even the implied warranty of
; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
; GNU General Public License for more details.
;
; You should have received a copy of the GNU General Public License
; along with this program. If not, see <http://www.gnu.org/licenses/>.
[BITS 32]
global start
start:
mov esp, _sys_stack ; pointing to our new stack area
jmp stublet
; We had to align 4 byte
ALIGN 4
mboot:
; Multiboot header for GRUB
MULTIBOOT_PAGE_ALIGN equ 1<<0
MULTIBOOT_MEMORY_INFO equ 1<<1
MULTIBOOT_AOUT_KLUDGE equ 1<<16
MULTIBOOT_HEADER_MAGIC equ 0x1BADB002
MULTIBOOT_HEADER_FLAGS equ MULTIBOOT_PAGE_ALIGN | MULTIBOOT_MEMORY_INFO | MULTIBOOT_AOUT_KLUDGE
MULTIBOOT_CHECKSUM equ -(MULTIBOOT_HEADER_MAGIC + MULTIBOOT_HEADER_FLAGS)
EXTERN code, bss, end
; Here comes the boot signature for grub
dd MULTIBOOT_HEADER_MAGIC
dd MULTIBOOT_HEADER_FLAGS
dd MULTIBOOT_CHECKSUM
; the linker script will fill these datas
dd mboot
dd code
dd bss
dd end
dd start
stublet:
extern main
call main
jmp $
; GTD
; IRSs
SECTION .bss
; reserve 8kb (8192byte) of memory here
resb 8192
_sys_stack:
so dieses code kompilimiere ich mit:
nasm -f aout -o start.o start.asm
und bindes es so :
ld -T link.ld -o kernel.bin start.o
mit diesem linker script:
Code: [Auswählen]
OUTPUT_FORMAT("binary")
ENTRY(start)
phys = 0x00100000;
SECTIONS
{
.text phys : AT(phys) {
code = .;
*(.text)
*(.rodata)
. = ALIGN(4096);
}
.data : AT(phys + (data - code))
{
data = .;
*(.data)
. = ALIGN(4096);
}
.bss : AT(phys + (bss - code))
{
bss = .;
*(.bss)
. = ALIGN(4096);
}
end = .;
}
so, mit dem hexeditor öffne ich den kernel, und da ist der multiboot header...
jetzt mache ich eine datei namens main.c, implementiere zum testen eine strlen:
Code: [Auswählen]
size_t strlen(const char* string) {
int len=0;
while(string[len]!='\0') len++;
return len;
}
void main()
{
/* You would add commands after here */
char *test= "hi";
int len = strlen(test);
}
dies komplimiere ich so:
gcc -Wall -O -fstrength-reduce -fomit-frame-pointer -finline-functions -nostdinc -fno-builtin -I./include -c -o main.o main.c
und binde es wie oben:
ld -T link.ld -o kernel.bin start.o main.o
okay, jetzt das ganze im hex editor angeschaut: nein, kein multiboot header, sondern nur die variabel "hi" und lauter 0er, 1MB lang..., und meine theorie bestätigt sich:
GRUB sagt: not executable format... oder so, jedoch, lösche ich den callback strlen:
Code: [Auswählen]
size_t strlen(const char* string) {
int len=0;
while(string[len]!='\0') len++;
return len;
}
void main()
{
/* You would add commands after here */
char *test= "hi";
}
geht es auf einmal, da ist auch ein multiboot header da.
Ich arbeite unter gcc-Version 4.1.2 (Ubuntu 4.1.2-0ubuntu4)
woran KÖNNTE es leigen? ps: hab auf google etwas geschaut, auch hier, doch nicht BRAUCHBARES gefunden
Mfg Ercan