User:Derekbank/C Kernel
Prerequisites
You will need to have the GRUB files stage1 & stage2. Download GRUB and copy these files into your os's directory. You will also need nasm, gcc, ld, and qemu. NOTE: Examples are written for linux.
Source Code
Loader.asm:
global loader
extern main
MODULE_ALIGN equ 1<<0
MEM_INFO equ 1<<1
FLAGS equ MODULE_ALIGN | MEM_INFO
MAGIC equ 0x1BADB002
CHECKSUM equ -(MAGIC + FLAGS)
section .text
align 4
MultiBootHeader:
dd MAGIC
dd FLAGS
dd CHECKSUM
STACKSIZE equ 0x4000
loader:
call main
cli
hang:
hlt
jmp hang
section .bss
align 4
stack:
resb STACKSIZE
This code basically sets up GRUB and jumps to the kernel
Now for the actually kernel. Kernel.C:
void main(){
unsigned char* video = (unsigned char*) 0xB8000;
video[0] = 'O';
video[1] = 0x07;
video[2] = 'S';
video[3] = 0x07;
}
This simple kernel writes 'OS' to the screen. It should be self-examplatory, except for 0x07. That tells the graphics card the it will be written in white on black and doesn't blink.
Now we need to a linker script Link.ld:
ENTRY (loader)
SECTIONS{
. = 0x00100000;
.text :{
*(.text)
}
.rodata ALIGN (0x1000) : {
*(.rodata)
}
.data ALIGN (0x1000) : {
*(.data)
}
.bss : {
sbss = .;
*(COMMON)
*(.bss)
ebss = .;
}
}
Last but not least, the build script. Build.sh:
nasm -f elf -o loader.o Loader.asm
gcc -o kernel.o -c Kernel.C -Wall -Wextra -nostdlib
ld -T Link.ld -o os.bin loader.o kernel.o
cat stage1 stage2 pad os.bin > image.img
Building and Booting
There is one file that is still missing, pad. Use the linux command "dd if=/dev/zero of=pad bs=1 count=750" to create it. (without the quotation marks) Type the command chmod 777 Build.sh Then type ./Build.sh This should take a moment. Debug any errors occurred. Now to boot it, type qemu -fda image.img It will show some grub stuff. Type in kernel 200+18 <enter> boot <enter>
Voila, the letters O and S are printed at the top.