Autor Thema: C-Kernel zeigt nichts an  (Gelesen 11353 mal)

Nils

  • Beiträge: 18
    • Profil anzeigen
    • nDallmeyer.de
Gespeichert
« am: 10. March 2007, 15:23 »
Hi,

ich habe das Tutorial von TJ durchgearbeitet und mit einem anderen Bootloader verbunden (TJ's funktionierte bei mir irgendwie nicht). Der Bootloader startet normal, aber der Kernel zeigt einfach nichts an.
Es wird alles fehler- und Warnungsfrei kompiliert.

Woran könnte es liegen ?

Hier der Code:
kernel32.asm
[Bits 32]
extern _kernel
global start
global _EnableA20Gate

start:

call _kernel ; siehe kernel.c warum

STOP:
jmp STOP

kernel.c
void kernel() // Da main scheinbar ein reserviertes Wort ist
{
  int i;
  char Text[] = "Welcome to Protected Mode";
  char *VideoMem = (char*)0xB8000;
  for(i = 0; Text[i] != 0; i++)
  {
     VideoMem[i] = Text[i];
     VideoMem[++i] = 7;
  }
}

void memcpy(void *dest, const void *src, int n)
{
  int i;
  for (i = 0;i <= n;i++)
  {
     dest = (void*)src;
     dest++;
     src++;
  }
}

link.txt
OUTPUT_FORMAT("binary")
INPUT(kernel32.obj ckernel.obj)
ENTRY(start)
SECTIONS
{
 .text  0x200 : {
   code = .; _code = .; __code = .;
   *(.text)
   . = ALIGN(1);
 }
 .data  : {
   data = .; _data = .; __data = .;
   *(.data)
   . = ALIGN(1);
 }
 .bss  :
 {
   bss = .; _bss = .; __bss = .;
   *(.bss)
   . = ALIGN(1);
 }
 end = .; _end = .; __end = .;
}

Ich hoffe, dass euch die 3 Dateien ausreichen :)

FreakyPenguin

  • Administrator
  • Beiträge: 301
    • Profil anzeigen
    • toni.famkaufmann.info
Gespeichert
« Antwort #1 am: 10. March 2007, 15:41 »
Wo läd denn der Bootloader deinen Kernel hin? An 0x200? Denn wenn das nicht der Fall ist, musst du dein Linker-Script anpassen, da sonst die Adresse des Videospeichers nicht stimmt.

edit:
Ich sehe grad, dass bei dir die Sections für read only Daten fehlen:
*(.rdata) /* read-only daten */
*(.rodata) /* read-only daten von mingw */
« Letzte Änderung: 10. March 2007, 15:45 von FreakyPenguin »

Nils

  • Beiträge: 18
    • Profil anzeigen
    • nDallmeyer.de
Gespeichert
« Antwort #2 am: 10. March 2007, 15:49 »
Bootloaderausschnitt
mov ax, 0x1000
Dann habe ich den Linkerscript angepasst:
OUTPUT_FORMAT("binary")
INPUT(kernel32.obj ckernel.obj)
ENTRY(start)
SECTIONS
{
 .text  0x1000 : {
   code = .; _code = .; __code = .;
   *(.text)
   . = ALIGN(1);
   *(.rdata)
   *(.rodata)
 }
 .data  : {
   data = .; _data = .; __data = .;
   *(.data)
   . = ALIGN(1);
 }
 .bss  :
 {
   bss = .; _bss = .; __bss = .;
   *(.bss)
   . = ALIGN(1);
 }
 end = .; _end = .; __end = .;
}

FreakyPenguin

  • Administrator
  • Beiträge: 301
    • Profil anzeigen
    • toni.famkaufmann.info
Gespeichert
« Antwort #3 am: 10. March 2007, 16:02 »
Dieser eine Befehl reicht uns nicht, um zu erkennen, wohin der Bootloader deinen Kernel lädt. Dazu musst du uns noch etwas mehr Infos geben.

Ich würde dir aber zu Grub als Bootloader raten.

Nils

  • Beiträge: 18
    • Profil anzeigen
    • nDallmeyer.de
Gespeichert
« Antwort #4 am: 10. March 2007, 16:06 »
GRUB kenne ich schon.... Ist es mit GRUB wirklich so, dass man immer wieder CDs brennen muss, nur um eine Kleinigkeit zu testen ? Naja egal:
org 0x7C00

start:
cli                 
mov ax, 0x9000     
mov ss, ax           
mov sp, 0         
sti               

mov [bootdriv], dl

call load

mov ax, 0x1000       ; Speicheradresse der Shell
mov es, ax
mov ds, ax
push ax
mov ax, 0
push ax
retf

bootdriv db 0         ; Bootlaufwerk 
loadmsg db "Test",13,10,0

; Mit dieser Funktion geben wir einen String aus
putstr:
lodsb
or al,al
jz short putstrd
mov ah,0x0E
mov bx,0x0007
int 0x10
jmp putstr
putstrd:
retn

; Shell vom Bootlaufwerk laden
load:
push ds
mov ax, 0
mov dl, [bootdriv]
int 13h
pop ds
jc load

load1:
mov ax,0x1000
mov es,ax
mov bx, 0
mov ah, 2
mov al, 5
mov cx, 2
mov dx, 0
int 13h
jc load1
mov si,loadmsg
call putstr
retn

times 512-($-$$)-2 db 0
dw 0AA55h

MNemo

  • Beiträge: 547
    • Profil anzeigen
Gespeichert
« Antwort #5 am: 10. March 2007, 16:14 »
Startest du keinen PM? das brauchst du für ein c-kernel!

grub macht das automatich. und Nein du must nicht jedes mal eine cd brennen das geht auch mit disketten bzw images und bochs ode qemu.
„Wichtig ist nicht, besser zu sein als alle anderen. Wichtig ist, besser zu sein als du gestern warst!“

FreakyPenguin

  • Administrator
  • Beiträge: 301
    • Profil anzeigen
    • toni.famkaufmann.info
Gespeichert
« Antwort #6 am: 10. March 2007, 16:19 »
Ja, ohne Protected Mode ist nichts mit C-Kernel (zumindest nicht mit gängigen Compilern). Wenn du grub testen möchtest würd ich dir empfehlen ein Disketten-Image von LOST zu nehmen(http://lost-os.ath.cx/) und dort die Module zu löschen und den Kernel zu tausche. So kannst du schon mal ettliche Fehlerquellen ausschliessen.

Nils

  • Beiträge: 18
    • Profil anzeigen
    • nDallmeyer.de
Gespeichert
« Antwort #7 am: 10. March 2007, 16:22 »
Arghs, verdammter PM....

Ich hatte mit GRUB nie wirklich was zu tun (nur mit Problemen :-D), wie kann man denn dort den Kernel austauschen ?

nooooooooos

  • Beiträge: 734
    • Profil anzeigen
Gespeichert
« Antwort #8 am: 10. March 2007, 16:25 »
Sonst kannst du auch einfach mal probieren den Kernel auf eine höhere Position zu laden. Die meisten Tuts gehen von 0x10000 aus.

Ausserdem überschreibst du beim laden der Register für den int 0x13,ah=2 mittels xor dx,dx auch dl. Dort muss aber das Bootlaufwerk drin bleiben. Schreib mal nur xor dh,dh.


Gruss
Noooooooooos

FreakyPenguin

  • Administrator
  • Beiträge: 301
    • Profil anzeigen
    • toni.famkaufmann.info
Gespeichert
« Antwort #9 am: 10. March 2007, 16:30 »
Du lädst die Images mit einem Virtuellen Diskettentreiber (unter Win. Unter Linux einfach ein mount -o loop image.img pfad). Danach löschst du alle die .mod und die .krn Datei. Wenn du damit fertig bist, kopierst du deinen Kernel dort hin. Nun musst du die folgende Datei bearbeiten: boot/grub/menu.lst. Die sollte eigentlich selbsterklärend sein. Für dich wird wohl sowas reichen:
title OsName
kernel /kernel.krn
boot

edit: N(o+)s: Was soll ihm denn das bringen? Dann hat er ja trotzdem noch keinen Protected Mode

Nils

  • Beiträge: 18
    • Profil anzeigen
    • nDallmeyer.de
Gespeichert
« Antwort #10 am: 10. March 2007, 16:34 »
Ok und wo findet man einen virtuellen Diskettentreiber ? Google konnte mir nichts sagen.

nooooooooos

  • Beiträge: 734
    • Profil anzeigen
Gespeichert
« Antwort #11 am: 10. March 2007, 16:38 »
Hmm...steht dazu im Tut denn nix??

FreakyPenguin

  • Administrator
  • Beiträge: 301
    • Profil anzeigen
    • toni.famkaufmann.info
Gespeichert
« Antwort #12 am: 10. March 2007, 16:39 »

Nils

  • Beiträge: 18
    • Profil anzeigen
    • nDallmeyer.de
Gespeichert
« Antwort #13 am: 10. March 2007, 16:43 »
Danke. Hat krn eine spezielle Bedeutung, also muss die Datei entsprechend aussehen, oder ist das eine umbenannte bin-Datei ?

FreakyPenguin

  • Administrator
  • Beiträge: 301
    • Profil anzeigen
    • toni.famkaufmann.info
Gespeichert
« Antwort #14 am: 10. March 2007, 16:48 »
Nein. Die Endung kannst du wählen wie du willst. Aber der kernel sollte im Elf format vorliegen. Und du musst deinem Kernel noch Multiboot Header hinzufügen:

Beispiel aus LOST:
multiboot_header:
align 4
  MULTIBOOT_MAGIC     equ 0x1BADB002
  MULTIBOOT_FLAGS     equ 0x03
  MULTIBOOT_CHECKSUM  equ -MULTIBOOT_MAGIC-MULTIBOOT_FLAGS

  dd MULTIBOOT_MAGIC
  dd MULTIBOOT_FLAGS
  dd MULTIBOOT_CHECKSUM

Nils

  • Beiträge: 18
    • Profil anzeigen
    • nDallmeyer.de
Gespeichert
« Antwort #15 am: 10. March 2007, 16:54 »
1. Wo muss ich das hinzufügen ?
2. Wie sehen für ELF eigentlich die genauen Compileroptionen aus ? ELF ist doch im Prinzip Exe ?

FreakyPenguin

  • Administrator
  • Beiträge: 301
    • Profil anzeigen
    • toni.famkaufmann.info
Gespeichert
« Antwort #16 am: 10. March 2007, 16:58 »
1. Wo muss ich das hinzufügen ?
In deiner Kernel.asm oder wie sie auch immer heisst. Die boot.asm darfte nun nichtmehr dazu kopieren.


2. Wie sehen für ELF eigentlich die genauen Compileroptionen aus ? ELF ist doch im Prinzip Exe ?
Um deinen Kernel als elf zu erhalten Musst du nur das output-Format im Linkerskript nach elf32-i386 ändern. Un nein, ELF ist nicht exe ;-)

Nils

  • Beiträge: 18
    • Profil anzeigen
    • nDallmeyer.de
Gespeichert
« Antwort #17 am: 10. March 2007, 17:01 »
Zu 1.: Es gibt zwei Kernel: 16 und 32. In welchen müsste es denn für GRUB rein ?
Zu 2.: OUTPUT_FORMAT("elf32-i386") ? Wenn ja: er kennt elf32-i386 nicht.

nooooooooos

  • Beiträge: 734
    • Profil anzeigen
Gespeichert
« Antwort #18 am: 10. March 2007, 17:02 »
Soviel zum Pmode...den 32iger natürlich...

Gruss
Noooooooooos

FreakyPenguin

  • Administrator
  • Beiträge: 301
    • Profil anzeigen
    • toni.famkaufmann.info
Gespeichert
« Antwort #19 am: 10. March 2007, 17:08 »
Die Kernel16 brauchst du nun nicht mehr.

Arbeitest du unter Windows? Wenn ja welche gcc-Dist. verwendest du?

 

Einloggen