Display an hello world in C++

This commit is contained in:
Baptiste Wicht 2013-10-26 18:56:16 +02:00
parent 0621247e54
commit 6e823e6d6a
4 changed files with 71 additions and 9 deletions

View File

@ -10,14 +10,16 @@ micro_kernel.bin: $(KERNEL_SRC) $(KERNEL_UTILS_SRC)
nasm -w+all -f bin -o micro_kernel.bin src/micro_kernel.asm nasm -w+all -f bin -o micro_kernel.bin src/micro_kernel.asm
kernel.o: src/kernel.cpp kernel.o: src/kernel.cpp
g++ -Wall -Wextra -O2 -fno-exceptions -fno-rtti -ffreestanding -c src/kernel.cpp -o kernel.o g++ -O2 -std=c++11 -Wall -Wextra -fno-exceptions -fno-rtti -ffreestanding -c src/kernel.cpp -o kernel.o
kernel.bin: kernel.o kernel.bin: kernel.o
g++ -T linker.ld -o kernel.bin.o -ffreestanding -O2 -nostdlib kernel.o g++ -std=c++11 -T linker.ld -o kernel.bin.o -ffreestanding -O2 -nostdlib kernel.o
objcopy -R .note -R .comment -S -O binary kernel.bin.o kernel.bin objcopy -R .note -R .comment -S -O binary kernel.bin.o kernel.bin
filler.bin: kernel.bin
bash fill.bash bash fill.bash
thor.flp: bootloader.bin micro_kernel.bin kernel.bin thor.flp: bootloader.bin micro_kernel.bin kernel.bin filler.bin
cat bootloader.bin > thor.bin cat bootloader.bin > thor.bin
cat micro_kernel.bin >> thor.bin cat micro_kernel.bin >> thor.bin
cat kernel.bin >> thor.bin cat kernel.bin >> thor.bin

View File

@ -8,7 +8,7 @@ SECTIONS
{ {
/* Begin putting sections at 1 MiB, a conventional place for kernels to be /* Begin putting sections at 1 MiB, a conventional place for kernels to be
loaded at by the bootloader. */ loaded at by the bootloader. */
. = 0x10000; . = 0x5000;
/* First put the multiboot header, as it is required to be put very early /* First put the multiboot header, as it is required to be put very early
early in the image or the bootloader won't recognize the file format. early in the image or the bootloader won't recognize the file format.

View File

@ -573,6 +573,8 @@ load_command:
call 0x5000 call 0x5000
jmp $
call clear_command call clear_command
ret ret

View File

@ -1,8 +1,66 @@
void k_print_line(const char* string);
void k_print(const char* string);
extern "C" extern "C"
void kernel_main(){ void kernel_main(){
unsigned char *vidmem = (unsigned char*) 0x0B8000; k_print_line("hello, world!");
*vidmem++ = 'a'; return;
*vidmem++ = 0; }
*vidmem++ = 'b';
typedef unsigned int uint8_t __attribute__((__mode__(__QI__)));
typedef unsigned int uint16_t __attribute__ ((__mode__ (__HI__)));
enum vga_color {
BLACK = 0,
BLUE = 1,
GREEN = 2,
CYAN = 3,
RED = 4,
MAGENTA = 5,
BROWN = 6,
LIGHT_GREY = 7,
DARK_GREY = 8,
LIGHT_BLUE = 9,
LIGHT_GREEN = 10,
LIGHT_CYAN = 11,
LIGHT_RED = 12,
LIGHT_MAGENTA = 13,
LIGHT_BROWN = 14,
WHITE = 15,
};
uint8_t make_color(vga_color fg, vga_color bg){
return fg | bg << 4;
}
uint16_t make_vga_entry(char c, uint8_t color){
uint16_t c16 = c;
uint16_t color16 = color;
return c16 | color16 << 8;
}
void k_print_line(const char* string){
long current_line = 0;
long current_column = 0;
k_print(string);
current_column = 0;
++current_line;
}
void k_print(const char* string){
long current_line = 0;
long current_column = 0;
uint16_t* vga_buffer = (uint16_t*) 0x0B8000;
for(int i = 0; string[i] != 0; ++i){
vga_buffer[current_line * 80 + current_column] = make_vga_entry(string[i], make_color(WHITE, BLACK));
++current_column;
}
return;
} }