i have followed this tutorial on a d os bare bones but i am having problems, link: D_Bare_Bones (http://wiki.osdev.org/D_Bare_Bones)
when i run
Code: Select all
ld -T linker.ld -o kernel.bin start.o kernel.main.o
Code: Select all
kernel.main.o: In function `main':
/home/daniel/N3OS/OLD/1.0/kernel.main.d:13: undefined reference to `_d_criticalenter'
/home/daniel/N3OS/OLD/1.0/kernel.main.d:13: undefined reference to `_d_criticalexit'
/home/daniel/N3OS/OLD/1.0/kernel.main.d:16: undefined reference to `_d_criticalenter'
/home/daniel/N3OS/OLD/1.0/kernel.main.d:16: undefined reference to `_d_criticalexit'
/home/daniel/N3OS/OLD/1.0/kernel.main.d:17: undefined reference to `_d_criticalenter'
/home/daniel/N3OS/OLD/1.0/kernel.main.d:17: undefined reference to `_d_criticalexit'
kernel.main.o: In function `kernel.main._D6kernel4main9__modinitFZv':
/home/daniel/N3OS/OLD/1.0/kernel.main.d:1: undefined reference to `_Dmodule_ref'
/home/daniel/N3OS/OLD/1.0/kernel.main.d:1: undefined reference to `_Dmodule_ref'
my source code:
start.asm
Code: Select all
global start
extern main ; Allow main() to be called from the assembly code
extern start_ctors, end_ctors, start_dtors, end_dtors
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
Code: Select all
module kernel.main;
extern(C) void main(uint magic, uint addr) {
int ypos = 0; //Starting points of the cursor
int xpos = 0;
const uint COLUMNS = 80; //Screensize
const uint LINES = 24;
ubyte* vidmem = cast(ubyte*)0xFFFF8000000B8000; //Video memory address
for (int i = 0; i < COLUMNS * LINES * 2; i++) { //Loops through the screen and clears it
synchronized {*(vidmem + i) = 0;}
}
synchronized {*(vidmem + (xpos + ypos * COLUMNS) * 2) = 'D' & 0xFF;} //Prints the letter D
synchronized {*(vidmem + (xpos + ypos * COLUMNS) * 2 + 1) = 0x07;} //Sets the colour for D to be light grey (0x07)
for (;;) { //Loop forever. You can add your kernel logic here
}
}
Code: Select all
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)
start_ctors = .; *(.ctors) end_ctors = .;
start_dtors = .; *(.dtors) end_dtors = .;
}
.bss : {
sbss = .;
bss = .; _bss = .; __bss = .;
*(COMMON)
*(.bss)
ebss = .;
}
end = .; _end = .; __end = .;
}