?
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