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.


Nachrichten - geforcefan

Seiten: [1]
1
Lowlevel-Coding / Re: GRUB und C Kernel Problem
« am: 25. August 2007, 16:43 »
Okay, jetzt stehe ich vor ein neues Problem:

Ich habe laut dem Tutorial IDT, GTD, ISR, IRQ programmiert, geht eigentlich auch, aber sobald ich mein Keyboard benutzen will, wird auf dem Bildschirm eine S geschrieben, und hinten dran steht: General Protection Fault Exception. System Halted!

ich suche grad mein fehler, aber finde ihn nicht.


void keyboard_handler(struct regs *r)
{
    unsigned char scancode;

    scancode = inportb(0x60);

    if (scancode & 0x80)
    {
    }
    else
    {
        putch(kbdus[scancode]);
    }
}

void keyboard_install()
{
    irq_install_handler(1, keyboard_handler);
}
int main() {
...
keyboard_install();
...
}

woran könnte es nun liegen?
2
Lowlevel-Coding / Re: GRUB und C Kernel Problem [gelöst]
« am: 25. August 2007, 12:13 »
hey, das war ja ein fehler von 4 zeichen:

nasm -f aout -o start.o start.asm

muss

nasm -f elf -o start.o start.asm

heißen...
Das hast du ja in deinen makefile geschrieben...

immer diese Kleinigkeiten... Aber ich wundere mich trotzdem... in jedem tutorial heißt es aout....
3
Lowlevel-Coding / Re: GRUB und C Kernel Problem
« am: 25. August 2007, 12:07 »
Hey, vielen dank an dich ;) Es funktioniert...
ich schau mal was ich bei mir falsch gemacht habe...

Mfg Ercan
4
Lowlevel-Coding / Re: GRUB und C Kernel Problem
« am: 25. August 2007, 11:37 »
Wie jetzt? Emu oder mein PC ^^
Nein keine x86-64 system... Wieso denn?
5
Lowlevel-Coding / Re: GRUB und C Kernel Problem
« am: 25. August 2007, 10:58 »
oh sorry, hab falsches Kernel geladen :/( es geht doch nicht....

Mfg Ercan
6
Lowlevel-Coding / Re: GRUB und C Kernel Problem
« am: 25. August 2007, 10:45 »
Mein C-Code hat kein Sinn, ich probiere es nur aus, weil ich habe auch versucht  einen String auf dem Video Speicher zu schreiben, gleiches Ergebnis. Ich wollte nut mit dem Code verdeutlichen, das wenn ich ich eine Funktion, oder ähnliches verwende, geht nichts... Also zur Code: Da ich Tage lang am verzweifeln war, habe ich schnell mal ein Test C Code geschreiben...

Nun zum linkerscript:
Beim erset versuch gab es beim linken ein Fehler, undefined referece to 'bss, end, code'
Aber danach habe ich das ganze etwas geändert:

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 = .;
}

und jetzt klappt es ;)

Aber wieso kapiere ich nicht sooo ganz, naja danke ;)

Mfg Ercan
7
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
8
Hi, danke für dein antwort. Mit dem endlosschleife versteh ich nicht so ganz. Wenn ich eine Zeile aus dem main.c lösche, funktioniert der Kernel...
Und mit Bochs komme ich mal ganricht klar. Und wenn ich GRUB auf die Diskette tue, steht "cannot mount selectet device" oder sowas... Also d.H. ich kann nicht auf FAT arbeiten, und weil mein PC, an dem ich mit Linux arbeite, und dort keine Probleme gibt, nicht benutzen kann (wegen Defekter Platte)... Wie kann ich GRUB unter Windows auf eine Diskete kopieren, das es auch den FD mountert?

Achja, der Code:

#include <system.h>


void put_right(unsigned char *text,unsigned char *text2, unsigned char forecolor, unsigned char backcolor)
{
    int spaces = 0;
    puts(text);
    spaces = WIDTH_SCREEN - strlen(text) - strlen(text2) - 5;

    csr_x = csr_x + spaces;
settextcolor(forecolor,backcolor);
    puts(text2);
puts("\n");
settextcolor(STD_FGC,STD_BGC);
}

int main()
{
    init_video();

settextcolor(STD_FGC,STD_BGC);
cls();
puts("Erban Kernel 0.1\n");
puts("---------------------------------------\n");
puts("Programed by Ercan Akyuerek\n"
"Copyright by Ercan Akyuerek 2007\n"
"Last Update: 13. January 2007\n");
puts("---------------------------------------\n");

        // Test Code

put_right("Preparing System Loading","DONE", LIGHT_GREEN, BLACK);
put_right("Preparing System Loading","FAILED", LIGHT_RED, BLACK);
put_right("Preparing System Loading","FAILED", LIGHT_RED, BLACK);
return(0);
}
9
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