Könnt ihr mir erklären, was ich hier richtig und was ich falsch bei meinem Hobby OS Projekt mache?
-
Hallo, ich bin neu hier im Forum und arbeite an einen Hobby OS Projekt namens Qinix(Quick Unix). Es soll in C geschrieben werden(der Bootloader nathürlich in Assembler). Also der Bootloader sieht bis jetzt so aus: Er sucht den Kernel, schaltet in den Protected Mode um und springt zum Kernel. Der C Kernel soll erstmal nur Hallo Welt ausgeben. Damit der C Kernel diese Kernelnummer wie 0x1000, ... bekommt, muss es gelinkt werden und dann steht in der 4/5 zeile .text 0x1000 : . Das einzigste Problem ist, dass ich den Kernel trotzdem nicht ausführen kann. Könnt ihr mir sagen, wie ich es eigentlich machen soll oder was ich falsch gemacht habe? Danke im Voraus!
-
Da du keinerlei brauchbare Information rausrückst, rate ich mal ins Blaue: Du hast die C-Standardbibliothek beim Programmieren benutzt. Die existiert aber nicht, wenn dein Kernel ausgeführt wird.
Es gibt hier ein Betriebssytementwicklungsforum wo du Erklärungen zu den absoluten Grundlagen findest.
-
Ich habe schon die Videomemory 0xB8000 benutzt.
-
Bei 0xB8000 liegt doch der MDA Speicher. Hast du denn den entsprechenden Modus an?
-
Also ich habe den Textmodus 80x25.
-
Farbe oder s/w?
-
Farbe
-
Hier der Source Code:
boot.asm
[BITS 16] [ORG 0x7C00] %include "gdt.inc" start: cli mov ax, 0x9000 mov ss, ax mov sp, 0x200 xor ax, ax mov ds, ax sti mov bx, 0 mov ax, 0x4000 mov es, ax mov ah, 0x2 mov al, 1 mov ch, 0 mov cl, 2 mov dh, 0 mov dl, 0 int 0x13 cli mov ax, cs mov ds, ax xor eax, eax mov es, ax mov si, gdt xor di, di mov cx, 6 rep movsd lgdt[gdtr] mov eax, cr0 or eax, 1 mov cr0, eax db 0xea dw (PMODE) dw 0x8 [BITS 32] PMODE: xor eax, eax mov eax, 2 shl eax, 3 mov ds, ax mov ss,ax mov es, ax xor ax, ax mov fs, ax mov gs, ax mov esp, 0x9000 jmp 08h:0x4000 times 512 - ($ - $$) - 2 db 0 dw 0aa55h
gdt.inc
gdtr: dw gdt_end-gdt-1 dd gdt gdt: dd 0, 0 codesel equ $-gdt dw 0xFFFF dw 0x0000 db 0x00 db 0x9A db 0xCF db 0x00 datasel equ $-gdt dw 0xFFFF dw 0x0000 db 0x00 db 0x92 db 0xCF db 0x00 gdt_end:
kernel.c
#include "console.h" int main() { kprintf("hello", 17, 0x0A); while(1); }
console.h
#ifndef _CONSOLE_H___ #define _CONSOLE_H___ // Printf Funktion unsigned int kprintf(char *message, unsigned int line, unsigned int colour) { char *vidmem = (char *) 0xb8000; unsigned int i = 0; i = (line * 80 * 2); while(*message != 0) { if(*message == '\n') { line++; i = (line * 80 * 2); message++; } else { vidmem[i] = *message; message++; i++; vidmem[i] = colour; i++; }; }; return(1); }; #endif
link.ld
OUTPUT_FORMAT("binary") INPUT(kernel.o) ENTRY(main) SECTIONS { .text 0x4000: { *(.text) } .data : { *(.data) } .bss : { *(.bss) } }
nasm -f bin -o boot.bin boot.asm gcc kernel.c -o kernel.o ld -T link.ld -o kernel.bin cat boot.bin kernel.bin > os.img qemu -fda os.img