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!


  • Mod

    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)
        }
    }
    

    makefile.sh

    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
    

Anmelden zum Antworten