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:
; 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:
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:
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:
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