D Bare Bones: Difference between revisions
Jump to navigation
Jump to search
[unchecked revision] | [unchecked revision] |
Content added Content deleted
mNo edit summary |
m (added source tags) |
||
Line 19: | Line 19: | ||
==start.asm== |
==start.asm== |
||
<source lang="asm"> |
|||
<pre> |
|||
global start |
global start |
||
Line 79: | Line 79: | ||
resb STACKSIZE |
resb STACKSIZE |
||
</ |
</source> |
||
Assemble that with: |
Assemble that with: |
||
Line 88: | Line 88: | ||
==kernel.main.d== |
==kernel.main.d== |
||
<source lang="d"> |
|||
<pre> |
|||
module kernel.main; |
module kernel.main; |
||
Line 97: | Line 97: | ||
videoram[1] = 0x07; |
videoram[1] = 0x07; |
||
} |
} |
||
</ |
</source> |
||
You then compile that with: |
You then compile that with: |
Revision as of 00:05, 10 May 2009
Difficulty level |
---|
Beginner |
Kernel Designs |
---|
Models |
Other Concepts |
In this Tutorial we will write a kernel in the D language and boot it.
WAIT! Have you read Getting Started, Beginner Mistakes, and some of the related OS theory?
Preface
The following tutorial assumes basic knowledge of a compiler, linker and assembler toolchain. It also of course assumes prior knowledge of the D programming language.
Overview
In this tutorial we will create a simple D kernel that prints 'D' on to the screen. The basic setup will consist of three files:
- start.asm
- kernel.main.d
- linker.ld
start.asm
global start
extern main ; Allow main() to be called from the assembly code
MODULEALIGN equ 1<<0
MEMINFO equ 1<<1
FLAGS equ MODULEALIGN | MEMINFO
MAGIC equ 0x1BADB002
CHECKSUM equ -(MAGIC + FLAGS)
section .text ; Next is the Grub Multiboot Header
align 4
MultiBootHeader:
dd MAGIC
dd FLAGS
dd CHECKSUM
STACKSIZE equ 0x4000 ; 16k if you're wondering
static_ctors_loop:
mov ebx, start_ctors
jmp .test
.body:
call [ebx]
add ebx,4
.test:
cmp ebx, end_ctors
jb .body
start:
mov esp, STACKSIZE+stack
push eax
push ebx
call main
static_dtors_loop:
mov ebx, start_dtors
jmp .test
.body:
call [ebx]
add ebx,4
.test:
cmp ebx, end_dtors
jb .body
cpuhalt:
hlt
jmp cpuhalt
section .bss
align 32
stack:
resb STACKSIZE
Assemble that with:
nasm -f elf -o start.o start.asm
kernel.main.d
module kernel.main;
extern(C) void main(uint magic, uint addr)
{
byte *videoram = cast( byte * ) 0xb8000; // Set up video memory
videoram[0] = 'D';
videoram[1] = 0x07;
}
You then compile that with:
gdc -nostdlib -nodefaultlibs -g -c -o kernel.main.o kernel.main.d
linker.ld
OUTPUT_FORMAT(elf32-i386) ENTRY (start) SECTIONS{ . = 0x00100000; .text :{ code = .; _code = .; __code = .; *(.text) *(.rodata) } .rodata ALIGN (0x1000) : { *(.rodata) } .data ALIGN (0x1000) : { data = .; _data = .; __data = .; *(.data) __CTOR_LIST__ = .; LONG((__CTOR_END__ - __CTOR_LIST__) / 4 - 2) *(.ctors) LONG(0) __CTOR_END__ = .; __DTOR_LIST__ = .; LONG((__DTOR_END__ - __DTOR_LIST__) / 4 - 2) *(.dtors) LONG(0) __DTOR_END__ = .; } } .bss : { sbss = .; bss = .; _bss = .; __bss = .; *(COMMON) *(.bss) ebss = .; } end = .; _end = .; __end = .; }
Now finally you can link all of that with:
ld -T linker.ld -o kernel.bin start.o kernel.main.o
Your kernel is now kernel.bin, and can now be booted by grub.
Hopefully this has gotten you started on writing your operating system in the D programming language.