Hallo Forum,
ich kämpfe nun schon seit längerer Zeit mit Problemen mit einem kleinen Assembler/C-Kernel.
Gleich vorweg: Ich habe kein "echtes" eingebautes Diskettenlaufwerk, sondern ein USB-Teil, und das versteht sich leider mit meiner openSUSE-Installation nicht so gut (scheint generell nicht unterstützt zu werden). Deshalb hab ich mich entschieden, erstmal kein Multiboot zu verwenden. Hab auch schon einen kleinen Asm-Bootsektor geschrieben, der einen kleinen "Hello World"-Kernel lädt. (Funktioniert tadellos) Nun wollte ich einfach mal diesen Kernel in C umsetzen (nur um zu sehen, wie das im Prinzip läuft), aber der verhält sich bockig. Ich vermute, das Problem liegt am Build-Vorgang, denn der Kernel verwendet keinerlei "böse" Funktionen.
Hier der Code:
Ich hoffe doch, das mein Anfängerfehler nicht zu gravierend ist.
P.S.: Bei Bedarf kann ich auch den Hexdump anfügen!
ich kämpfe nun schon seit längerer Zeit mit Problemen mit einem kleinen Assembler/C-Kernel.
Gleich vorweg: Ich habe kein "echtes" eingebautes Diskettenlaufwerk, sondern ein USB-Teil, und das versteht sich leider mit meiner openSUSE-Installation nicht so gut (scheint generell nicht unterstützt zu werden). Deshalb hab ich mich entschieden, erstmal kein Multiboot zu verwenden. Hab auch schon einen kleinen Asm-Bootsektor geschrieben, der einen kleinen "Hello World"-Kernel lädt. (Funktioniert tadellos) Nun wollte ich einfach mal diesen Kernel in C umsetzen (nur um zu sehen, wie das im Prinzip läuft), aber der verhält sich bockig. Ich vermute, das Problem liegt am Build-Vorgang, denn der Kernel verwendet keinerlei "böse" Funktionen.
Hier der Code:
Code: [Auswählen]
; boot.asm
[global _start]
[extern init]
_start:
call init
hang:
jmp hang
times 512-($-$$)-2 db 0
dw 0xAA55
Code: [Auswählen]
#include "kernel.h"
void init(void)
{
printline("Hello World!\0");
}
void printline(char hw[])
{
int i;
char* video = (char*) 0xb8000;
for (i = 0; hw[i] != '\0'; i++) {
video[i * 2] = hw[i];
video[i * 2 + 1] = 0x07;
}
}
Code: [Auswählen]
#ifndef KERNEL_H
#define KERNEL_H
void main(void);
void printline(char hw[]);
#endif
Code: [Auswählen]
/* Bei _start soll die Ausfuehrung losgehen */
ENTRY(_start)
OUTPUT_FORMAT(binary)
OUTPUT_ARCH(i386:i386)
SECTIONS
{
. = 0x7E00;
.text : {
*(.text)
}
.rodata : {
*(.rodata)
}
.data : {
*(.data)
}
.bss : {
_sbss = .;
*(COMMON)
*(.bss)
_ebss = .;
}
}
Code: [Auswählen]
CC = /usr/bin/gcc
LD = /usr/bin/ld
AS = /usr/bin/nasm
CFLAGS = -Wall -Wextra -Werror -nostdlib -nostartfiles -nodefaultlibs -ffreestanding -c
LDFLAGS = -T kernel.ld
ASFLAGS = -f aout
prog:
$(AS) $(ASFLAGS) -o a.out boot.asm
$(CC) $(CFLAGS) -o b.out kernel.c
$(LD) $(LDFLAGS) -o kernel.img a.out b.out
hexdump kernel.img
init:
umount /dev/sda2
ntfs-3g /dev/sda2 /mnt/windata
clean:
rm a.out
rm b.out
rm kernel.img
rm *~
.PHONY: clean
Ich hoffe doch, das mein Anfängerfehler nicht zu gravierend ist.
P.S.: Bei Bedarf kann ich auch den Hexdump anfügen!

Übersicht
Wiki
Hilfe
Suche
Einloggen
Registrieren
Drucken

Gespeichert
)