Beiträge anzeigen

Diese Sektion erlaubt es dir alle Beiträge dieses Mitglieds zu sehen. Beachte, dass du nur solche Beiträge sehen kannst, zu denen du auch Zugriffsrechte hast.


Themen - geforcefan

Seiten: [1]
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:


;   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
2
Lowlevel-Coding / GRUB lädt mein Kernel ab ca. 1,240 kb nicht
« am: 15. January 2007, 18:05 »
Hallo Zusammen,
ich bin neu hier und ich mich interessiert in letzter Teit Kernel programmierung.
Ich bin soweit, ich kan Kernel in C schreiben, und es mit GRUB laden. Jetzt bin ich an einem Punkt wo der Grub mein Kernel nicht mehr lädt. Ich benutze den VMware. Nachdem ich GRUB starte und "kernel /kernel.bin" schreibe, schreibe ich "boot", jedoch passiert nichts:



kann mir vll einer sagen wieso?

Danke!

Ercan
Seiten: [1]

Einloggen