Merge into main the new state of the operating system/kernel #1
14
Makefile
14
Makefile
@ -5,7 +5,7 @@ CC = ${HOME}/opt/cross/bin/i686-elf-gcc
|
|||||||
CPP = ${HOME}/opt/cross/bin/i686-elf-g++
|
CPP = ${HOME}/opt/cross/bin/i686-elf-g++
|
||||||
CFLAGS = -ffreestanding -Og -ggdb -Wall -Wextra
|
CFLAGS = -ffreestanding -Og -ggdb -Wall -Wextra
|
||||||
|
|
||||||
OFILES =$(BUILD_DIR)/boot.o $(BUILD_DIR)/kterm.o $(BUILD_DIR)/kernel.o $(BUILD_DIR)/memory.o $(BUILD_DIR)/paging.o $(BUILD_DIR)/pit.o $(BUILD_DIR)/time.o $(BUILD_DIR)/keyboard.o $(BUILD_DIR)/io.o $(BUILD_DIR)/gdtc.o $(BUILD_DIR)/idt.o $(BUILD_DIR)/pic.o $(BUILD_DIR)/sv-terminal.o $(BUILD_DIR)/string.o $(BUILD_DIR)/launcher.o
|
OFILES =$(BUILD_DIR)/boot.o $(BUILD_DIR)/kterm.o $(BUILD_DIR)/kernel.o $(BUILD_DIR)/memory.o $(BUILD_DIR)/paging.o $(BUILD_DIR)/pit.o $(BUILD_DIR)/time.o $(BUILD_DIR)/keyboard.o $(BUILD_DIR)/io.o $(BUILD_DIR)/gdtc.o $(BUILD_DIR)/idt.o $(BUILD_DIR)/pic.o $(BUILD_DIR)/sv-terminal.o $(BUILD_DIR)/string.o $(BUILD_DIR)/prekernel.o
|
||||||
|
|
||||||
SRC_DIR = source
|
SRC_DIR = source
|
||||||
BUILD_DIR = build
|
BUILD_DIR = build
|
||||||
@ -30,7 +30,7 @@ clean_iso:
|
|||||||
iso: clean_iso clean build
|
iso: clean_iso clean build
|
||||||
mkdir -p root/boot/grub
|
mkdir -p root/boot/grub
|
||||||
cp build/myos.bin root/boot/myos.bin
|
cp build/myos.bin root/boot/myos.bin
|
||||||
cp src/grub.cfg root/boot/grub/grub.cfg
|
cp source/grub.cfg root/boot/grub/grub.cfg
|
||||||
grub-mkrescue -o build/barinkOS.iso root
|
grub-mkrescue -o build/barinkOS.iso root
|
||||||
|
|
||||||
run: all
|
run: all
|
||||||
@ -58,13 +58,13 @@ $(BUILD_DIR)/kterm.o:
|
|||||||
$(CPP) -c $(SRC_DIR)/kernel/Terminal/kterm.cpp -o $(BUILD_DIR)/kterm.o $(CFLAGS) -fno-exceptions -fno-rtti
|
$(CPP) -c $(SRC_DIR)/kernel/Terminal/kterm.cpp -o $(BUILD_DIR)/kterm.o $(CFLAGS) -fno-exceptions -fno-rtti
|
||||||
|
|
||||||
$(BUILD_DIR)/boot.o:
|
$(BUILD_DIR)/boot.o:
|
||||||
$(AS) $(SRC_DIR)/kernel/KernelLauncher/boot.s -o $(BUILD_DIR)/boot.o
|
$(AS) $(SRC_DIR)/kernel/Boot/boot.s -o $(BUILD_DIR)/boot.o
|
||||||
|
|
||||||
$(BUILD_DIR)/crti.o:
|
$(BUILD_DIR)/crti.o:
|
||||||
$(AS) $(SRC_DIR)/kernel/KernelLauncher/crti.s -o $(BUILD_DIR)/crti.o
|
$(AS) $(SRC_DIR)/kernel/crti.s -o $(BUILD_DIR)/crti.o
|
||||||
|
|
||||||
$(BUILD_DIR)/crtn.o:
|
$(BUILD_DIR)/crtn.o:
|
||||||
$(AS) $(SRC_DIR)/kernel/KernelLauncher/crtn.s -o $(BUILD_DIR)/crtn.o
|
$(AS) $(SRC_DIR)/kernel/crtn.s -o $(BUILD_DIR)/crtn.o
|
||||||
|
|
||||||
$(BUILD_DIR)/io.o:
|
$(BUILD_DIR)/io.o:
|
||||||
$(CPP) -c $(SRC_DIR)/kernel/io.cpp -o $(BUILD_DIR)/io.o $(CFLAGS) -fno-exceptions -fno-rtti
|
$(CPP) -c $(SRC_DIR)/kernel/io.cpp -o $(BUILD_DIR)/io.o $(CFLAGS) -fno-exceptions -fno-rtti
|
||||||
@ -104,5 +104,5 @@ $(BUILD_DIR)/memory.o:
|
|||||||
$(BUILD_DIR)/paging.o:
|
$(BUILD_DIR)/paging.o:
|
||||||
$(CPP) -c $(SRC_DIR)/kernel/Memory/VirtualMemoryManager.cpp -o $(BUILD_DIR)/paging.o $(CFLAGS) -fno-exceptions -fno-rtti
|
$(CPP) -c $(SRC_DIR)/kernel/Memory/VirtualMemoryManager.cpp -o $(BUILD_DIR)/paging.o $(CFLAGS) -fno-exceptions -fno-rtti
|
||||||
|
|
||||||
$(BUILD_DIR)/launcher.o:
|
$(BUILD_DIR)/prekernel.o:
|
||||||
$(CPP) -c $(SRC_DIR)/kernel/KernelLauncher/launcher.cpp -o $(BUILD_DIR)/launcher.o $(CFLAGS) -fno-exceptions -fno-rtti
|
$(CPP) -c $(SRC_DIR)/kernel/PreKernel/prekernel.cpp -o $(BUILD_DIR)/prekernel.o $(CFLAGS) -fno-exceptions -fno-rtti
|
@ -1,3 +1,9 @@
|
|||||||
menuentry "BarinkOS" {
|
menuentry "BarinkOS" {
|
||||||
multiboot /boot/myos.bin
|
multiboot /boot/myos.bin
|
||||||
}
|
}
|
||||||
|
|
||||||
|
menuentry "BarinkOS Tests" {
|
||||||
|
multiboot /boot/myos.bin
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -43,6 +43,14 @@ multiboot_page_table:
|
|||||||
.global _start
|
.global _start
|
||||||
.type _start, @function
|
.type _start, @function
|
||||||
_start:
|
_start:
|
||||||
|
|
||||||
|
/* push the pointer to the Multiboot information structure*/
|
||||||
|
pushl %ebx
|
||||||
|
|
||||||
|
/* push the magic value */
|
||||||
|
pushl %eax
|
||||||
|
call testLauncher
|
||||||
|
|
||||||
# Get physical address of the boot_page_table
|
# Get physical address of the boot_page_table
|
||||||
movl $(boot_page_table - 0xC0000000), %edi
|
movl $(boot_page_table - 0xC0000000), %edi
|
||||||
# Map address 0
|
# Map address 0
|
||||||
@ -112,11 +120,7 @@ isPaging:
|
|||||||
pushl $0
|
pushl $0
|
||||||
popf
|
popf
|
||||||
|
|
||||||
/* push the pointer to the Multiboot information structure*/
|
|
||||||
pushl %ebx
|
|
||||||
|
|
||||||
/* push the magic value */
|
|
||||||
pushl %eax
|
|
||||||
|
|
||||||
call early_main
|
call early_main
|
||||||
|
|
||||||
@ -129,11 +133,11 @@ isPaging:
|
|||||||
jmp 1b
|
jmp 1b
|
||||||
|
|
||||||
|
|
||||||
.include "./src/kernel/Memory/GDT/gdt.s"
|
.include "./source/kernel/Memory/GDT/gdt.s"
|
||||||
.include "./src/kernel/irs_table.s"
|
.include "./source/kernel/irs_table.s"
|
||||||
.include "./src/kernel/irq_table.s"
|
.include "./source/kernel/irq_table.s"
|
||||||
.include "./src/kernel/Interrupts/idt/idt.s"
|
.include "./source/kernel/Interrupts/idt/idt.s"
|
||||||
.include "./src/kernel/Memory/paging.s"
|
.include "./source/kernel/Memory/paging.s"
|
||||||
.include "./src/kernel/cpu.s"
|
.include "./source/kernel/cpu.s"
|
||||||
|
|
||||||
|
|
@ -1,91 +0,0 @@
|
|||||||
#pragma once
|
|
||||||
#include "../multiboot.h"
|
|
||||||
#define CHECK_FLAG(flags, bit) ((flags) & (1 <<(bit)))
|
|
||||||
#define __VERBOSE__
|
|
||||||
#include "../Terminal/kterm.h"
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
void CheckMBT ( multiboot_info_t* mbt ){
|
|
||||||
/* Set MBI to the addresss of the multiboot information structure*/
|
|
||||||
multiboot_info_t * mbi = (multiboot_info_t *) mbt;
|
|
||||||
|
|
||||||
#ifdef __VERBOSE__
|
|
||||||
/* Print out the flags */
|
|
||||||
printf("flags = 0x%x\n", (unsigned) mbi->flags);
|
|
||||||
#endif
|
|
||||||
/* Are mem_* valid? */
|
|
||||||
if ( CHECK_FLAG(mbi->flags,0)){
|
|
||||||
// Do nothing
|
|
||||||
}
|
|
||||||
|
|
||||||
/* is boot device valid ? */
|
|
||||||
if (CHECK_FLAG (mbi->flags, 1))
|
|
||||||
{
|
|
||||||
#ifdef __VERBOSE__
|
|
||||||
printf("boot_device = 0x0%x\n", (unsigned) mbi->boot_device);
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
/* is the command line passed? */
|
|
||||||
if (CHECK_FLAG ( mbi->flags,2))
|
|
||||||
{
|
|
||||||
#ifdef __VERBOSE__
|
|
||||||
printf("cmdline = %s\n", (char *) (mbi->cmdline + 0xC0000000));
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Are mods_* valid? */
|
|
||||||
if(CHECK_FLAG ( mbi->flags, 3)){
|
|
||||||
multiboot_module_t *mod;
|
|
||||||
uint32_t i;
|
|
||||||
#ifdef __VERBOSE__
|
|
||||||
printf("mods count = %d, mods_addr = 0x%x\n", (int) mbi->mods_count, (int) mbi->mods_addr);
|
|
||||||
|
|
||||||
for(i = 0, mod = (multiboot_module_t *) mbi->mods_addr; i < mbi->mods_count; i++ , mod++){
|
|
||||||
printf(" mod start = 0x%x, mod_end = 0x%x, cmdline = %s\n", (unsigned) mod->mod_start, (unsigned) mod->mod_end, (char*) mod->cmdline);
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Bits 4 and 5 are mutually exclusive! */
|
|
||||||
if (CHECK_FLAG (mbi->flags, 4) && CHECK_FLAG(mbi->flags, 5))
|
|
||||||
{
|
|
||||||
#ifdef __VERBOSE__
|
|
||||||
printf("Both bits 4 and 5 are set.\n");
|
|
||||||
#endif
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Is the symbol table of a.out valid? */
|
|
||||||
if (CHECK_FLAG(mbi->flags, 4)){
|
|
||||||
multiboot_aout_symbol_table_t *multiboot_aout_sym = &(mbi->u.aout_sym);
|
|
||||||
#ifdef __VERBOSE__
|
|
||||||
printf( "multiboot_aout_symbol_table: tabsize = 0x%0x, strsize = 0x%x, addr = 0x%x\n",
|
|
||||||
(unsigned) multiboot_aout_sym->tabsize,
|
|
||||||
(unsigned) multiboot_aout_sym->strsize,
|
|
||||||
(unsigned) multiboot_aout_sym->addr);
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Is the section header table of ELF valid? */
|
|
||||||
if (CHECK_FLAG(mbi->flags, 5)){
|
|
||||||
multiboot_elf_section_header_table_t *multiboot_elf_sec = &(mbi->u.elf_sec);
|
|
||||||
#ifdef __VERBOSE__
|
|
||||||
printf("multiboot_elf_sec: num = %u, size = 0x%x, addr = 0x%x, shnd = 0x%x\n",
|
|
||||||
|
|
||||||
(unsigned) multiboot_elf_sec->num, (unsigned) multiboot_elf_sec->size,
|
|
||||||
(unsigned) multiboot_elf_sec->addr, (unsigned) multiboot_elf_sec->shndx);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Draw diagonal blue line */
|
|
||||||
if (CHECK_FLAG (mbt->flags, 12)){
|
|
||||||
#ifdef __VERBOSE__
|
|
||||||
printf("Can draw!\n");
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
}
|
|
@ -1,28 +0,0 @@
|
|||||||
#include <stdint.h>
|
|
||||||
#include <stddef.h>
|
|
||||||
|
|
||||||
void put_char(char ch, size_t x, size_t y ){
|
|
||||||
*((uint16_t*)0xb8000+(y * 80 + x)) = ch | ((7 | 0 << 4) << 8);
|
|
||||||
}
|
|
||||||
|
|
||||||
void write_ln(char* s, size_t length, size_t x , size_t y)
|
|
||||||
{
|
|
||||||
// Because read only data is linked at a virtual address we'll need to convert
|
|
||||||
// the string adddres from virtual to phys.
|
|
||||||
s = s - 0xC0000000;
|
|
||||||
size_t column , row;
|
|
||||||
column = x;
|
|
||||||
row = y;
|
|
||||||
for(int i = 0; i < length ; i ++)
|
|
||||||
{
|
|
||||||
|
|
||||||
put_char(s[i] , column,row );
|
|
||||||
column ++;
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
extern "C" void testLauncher () {
|
|
||||||
write_ln("hello", 5 ,0,0);
|
|
||||||
}
|
|
@ -1,6 +1,6 @@
|
|||||||
#include "MBI_MMap.h"
|
#include "MBI_MMap.h"
|
||||||
|
|
||||||
|
/*
|
||||||
void mapMultibootMemoryMap( MemoryInfo* memInfo , multiboot_info_t *mbt) {
|
void mapMultibootMemoryMap( MemoryInfo* memInfo , multiboot_info_t *mbt) {
|
||||||
|
|
||||||
printf("mmap_addr = 0x%x, mmap_length = 0x%x\n", (unsigned) mbt->mmap_addr , (unsigned) mbt->mmap_length );
|
printf("mmap_addr = 0x%x, mmap_length = 0x%x\n", (unsigned) mbt->mmap_addr , (unsigned) mbt->mmap_length );
|
||||||
@ -23,13 +23,13 @@ void mapMultibootMemoryMap( MemoryInfo* memInfo , multiboot_info_t *mbt) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
*/
|
||||||
/**
|
/**
|
||||||
* @brief Debug Verbose functions
|
* @brief Debug Verbose functions
|
||||||
*
|
*
|
||||||
* @param mmap
|
* @param mmap
|
||||||
*/
|
*/
|
||||||
|
/*
|
||||||
void print_Multiboot_memory_Map(multiboot_memory_map_t* mmap) {
|
void print_Multiboot_memory_Map(multiboot_memory_map_t* mmap) {
|
||||||
printf(
|
printf(
|
||||||
"size = 0x%x, base_addr = 0x%x%08x, length = 0x%x%08x, type = 0x%x\n",
|
"size = 0x%x, base_addr = 0x%x%08x, length = 0x%x%08x, type = 0x%x\n",
|
||||||
@ -41,3 +41,4 @@ void print_Multiboot_memory_Map(multiboot_memory_map_t* mmap) {
|
|||||||
(unsigned) mmap->type
|
(unsigned) mmap->type
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
*/
|
@ -1,16 +1,18 @@
|
|||||||
#pragma once
|
#pragma once
|
||||||
#include <stddef.h>
|
#include <stddef.h>
|
||||||
#include "../../multiboot.h"
|
//#include "../../multiboot.h"
|
||||||
#include "../memoryinfo.h"
|
#include "../memoryinfo.h"
|
||||||
|
|
||||||
void initialise_available_regions(uint32_t memoryMapAddr, uint32_t memoryMapLastAddr, uint32_t* memoryBitMap, int* used_blocks);
|
void initialise_available_regions(uint32_t memoryMapAddr, uint32_t memoryMapLastAddr, uint32_t* memoryBitMap, int* used_blocks);
|
||||||
|
|
||||||
|
/*
|
||||||
void mapMultibootMemoryMap( MemoryInfo* memInfo , multiboot_info_t *mbt);
|
void mapMultibootMemoryMap( MemoryInfo* memInfo , multiboot_info_t *mbt);
|
||||||
|
*/
|
||||||
/**
|
/**
|
||||||
* @brief Debug Verbose Functions
|
* @brief Debug Verbose Functions
|
||||||
*
|
*
|
||||||
* @param mmap
|
* @param mmap
|
||||||
*/
|
*/
|
||||||
|
/*
|
||||||
void print_Multiboot_memory_Map(multiboot_memory_map_t* mmap);
|
void print_Multiboot_memory_Map(multiboot_memory_map_t* mmap);
|
||||||
|
*/
|
||||||
|
28
source/kernel/PreKernel/bootstructure.h
Normal file
28
source/kernel/PreKernel/bootstructure.h
Normal file
@ -0,0 +1,28 @@
|
|||||||
|
#pragma once
|
||||||
|
#include <stddef.h>
|
||||||
|
#include <stdint.h>
|
||||||
|
|
||||||
|
|
||||||
|
extern "C" const uint32_t kernel_begin;
|
||||||
|
extern "C" const uint32_t kernel_end;
|
||||||
|
struct BootInfoBlock {
|
||||||
|
bool MapIsInvalid;
|
||||||
|
uint32_t bootDeviceID ;
|
||||||
|
|
||||||
|
uint32_t GrubModuleCount;
|
||||||
|
|
||||||
|
bool ValidSymbolTable;
|
||||||
|
uint32_t SymbolTableAddr;
|
||||||
|
uint32_t SymbolTabSize;
|
||||||
|
uint32_t SymbolStrSize;
|
||||||
|
|
||||||
|
bool ValidELFHeader;
|
||||||
|
|
||||||
|
bool EnabledVBE;
|
||||||
|
|
||||||
|
bool PhysicalMemoryMapAvailable;
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
// Put the BootInfoBlock 1MB above the kernel.
|
||||||
|
const uint32_t BootInfoBlock_pptr = kernel_end - 0xC0000000 + 0x1000;
|
93
source/kernel/PreKernel/prekernel.cpp
Normal file
93
source/kernel/PreKernel/prekernel.cpp
Normal file
@ -0,0 +1,93 @@
|
|||||||
|
#include <stdint.h>
|
||||||
|
#include <stddef.h>
|
||||||
|
#include "multiboot.h"
|
||||||
|
#include "bootstructure.h"
|
||||||
|
#define CHECK_FLAG(flags, bit) ((flags) & (1 <<(bit)))
|
||||||
|
|
||||||
|
|
||||||
|
extern "C" void testLauncher ( unsigned long magic, multiboot_info_t* mbi) {
|
||||||
|
|
||||||
|
// Create the bootInfoBlock at its location
|
||||||
|
BootInfoBlock* BIB = (BootInfoBlock*) BootInfoBlock_pptr;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Check Multiboot magic number
|
||||||
|
*/
|
||||||
|
if (magic != MULTIBOOT_BOOTLOADER_MAGIC)
|
||||||
|
{
|
||||||
|
BIB->MapIsInvalid = true;
|
||||||
|
return;
|
||||||
|
} else{
|
||||||
|
BIB->MapIsInvalid = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* is boot device valid ? */
|
||||||
|
if (CHECK_FLAG (mbi->flags, 1))
|
||||||
|
{
|
||||||
|
BIB->bootDeviceID = mbi->boot_device;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Are mods_* valid? */
|
||||||
|
if(CHECK_FLAG ( mbi->flags, 3)){
|
||||||
|
multiboot_module_t *mod;
|
||||||
|
uint32_t i;
|
||||||
|
|
||||||
|
BIB->GrubModuleCount = mbi->mods_count;
|
||||||
|
|
||||||
|
|
||||||
|
for(i = 0, mod = (multiboot_module_t *) mbi->mods_addr; i < mbi->mods_count; i++ , mod++){
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Is the symbol table of a.out valid? */
|
||||||
|
if (CHECK_FLAG(mbi->flags, 4))
|
||||||
|
{
|
||||||
|
BIB->ValidSymbolTable = true;
|
||||||
|
multiboot_aout_symbol_table_t *multiboot_aout_sym = &(mbi->u.aout_sym);
|
||||||
|
|
||||||
|
} else{
|
||||||
|
BIB->ValidSymbolTable = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Is the section header table of ELF valid? */
|
||||||
|
if (CHECK_FLAG(mbi->flags, 5))
|
||||||
|
{
|
||||||
|
BIB->ValidELFHeader = true;
|
||||||
|
multiboot_elf_section_header_table_t *multiboot_elf_sec = &(mbi->u.elf_sec);
|
||||||
|
|
||||||
|
}else{
|
||||||
|
BIB->ValidELFHeader = false;
|
||||||
|
}
|
||||||
|
/*
|
||||||
|
If we got a memory map from our bootloader we
|
||||||
|
should be parsing it to find out the memory regions available.
|
||||||
|
*/
|
||||||
|
if (CHECK_FLAG(mbi->flags, 6))
|
||||||
|
{
|
||||||
|
BIB->PhysicalMemoryMapAvailable = true;
|
||||||
|
multiboot_memory_map_t *mmap = (multiboot_memory_map_t*) (mbi->mmap_addr) ;
|
||||||
|
|
||||||
|
for (; (unsigned long) mmap < mbi->mmap_addr + mbi->mmap_length; mmap = (multiboot_memory_map_t *) ((unsigned long) mmap + mmap->size + sizeof(mmap->size))){
|
||||||
|
|
||||||
|
if ( mmap->type == MULTIBOOT_MEMORY_AVAILABLE){
|
||||||
|
|
||||||
|
} else{
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
} else{
|
||||||
|
BIB->PhysicalMemoryMapAvailable = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Draw diagonal blue line */
|
||||||
|
if (CHECK_FLAG (mbi->flags, 12)){
|
||||||
|
BIB->EnabledVBE = true;
|
||||||
|
} else{
|
||||||
|
BIB->EnabledVBE;
|
||||||
|
}
|
||||||
|
}
|
@ -22,6 +22,7 @@ void kterm_init () {
|
|||||||
kterm_column = 0;
|
kterm_column = 0;
|
||||||
kterm_color = vga_entry_color ( VGA_COLOR_LIGHT_GREY , VGA_COLOR_BLACK);
|
kterm_color = vga_entry_color ( VGA_COLOR_LIGHT_GREY , VGA_COLOR_BLACK);
|
||||||
kterm_buffer = (uint16_t*) 0xC03FF000;
|
kterm_buffer = (uint16_t*) 0xC03FF000;
|
||||||
|
|
||||||
for (size_t y = 0; y < VGA_HEIGHT; y++ ){
|
for (size_t y = 0; y < VGA_HEIGHT; y++ ){
|
||||||
for( size_t x = 0; x < VGA_WIDTH; x++){
|
for( size_t x = 0; x < VGA_WIDTH; x++){
|
||||||
const size_t index = y * VGA_WIDTH + x;
|
const size_t index = y * VGA_WIDTH + x;
|
||||||
@ -31,7 +32,6 @@ void kterm_init () {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void kterm_resetcolor(){
|
void kterm_resetcolor(){
|
||||||
kterm_color = vga_entry_color ( VGA_COLOR_LIGHT_GREY , VGA_COLOR_BLACK);
|
kterm_color = vga_entry_color ( VGA_COLOR_LIGHT_GREY , VGA_COLOR_BLACK);
|
||||||
}
|
}
|
||||||
@ -42,9 +42,7 @@ void kterm_setcolor(uint8_t color){
|
|||||||
|
|
||||||
void kterm_putat (char c, uint8_t color, size_t x, size_t y ) {
|
void kterm_putat (char c, uint8_t color, size_t x, size_t y ) {
|
||||||
const size_t index = y * VGA_WIDTH + x;
|
const size_t index = y * VGA_WIDTH + x;
|
||||||
|
|
||||||
kterm_buffer[index] = vga_entry(c, color);
|
kterm_buffer[index] = vga_entry(c, color);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void enable_cursor (uint8_t start_cursor , uint8_t end_cursor ){
|
void enable_cursor (uint8_t start_cursor , uint8_t end_cursor ){
|
||||||
|
@ -1,15 +1,13 @@
|
|||||||
#include "kernel.h"
|
#include "kernel.h"
|
||||||
|
extern "C" void early_main()
|
||||||
extern "C" void early_main(unsigned long magic, unsigned long addr){
|
{
|
||||||
|
/*
|
||||||
// Convert MBI address to higher quarter kernel space
|
|
||||||
addr += KERNEL_BASE_ADDR;
|
|
||||||
/**
|
|
||||||
* Initialize terminal interface
|
* Initialize terminal interface
|
||||||
* NOTE: This should be done later on , the magic value should be checked first.
|
|
||||||
*/
|
*/
|
||||||
initGDT();
|
initGDT();
|
||||||
|
|
||||||
kterm_init();
|
kterm_init();
|
||||||
|
|
||||||
init_serial();
|
init_serial();
|
||||||
print_serial("Hello Higher half kernel!\n");
|
print_serial("Hello Higher half kernel!\n");
|
||||||
|
|
||||||
@ -17,110 +15,38 @@ extern "C" void early_main(unsigned long magic, unsigned long addr){
|
|||||||
// Enable interrupts
|
// Enable interrupts
|
||||||
asm volatile("STI");
|
asm volatile("STI");
|
||||||
|
|
||||||
|
/*
|
||||||
printf("DEBUG:\n Magic: 0x%x\n MBT_addr: 0x%x\n", magic, addr);
|
|
||||||
/**
|
|
||||||
* Check Multiboot magic number
|
|
||||||
* NOTE: Printf call should not be a thing this early on ...
|
|
||||||
*/
|
|
||||||
if (magic != MULTIBOOT_BOOTLOADER_MAGIC){
|
|
||||||
printf("Invalid magic number: 0x%x\n", magic);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Show a little banner for cuteness
|
* Show a little banner for cuteness
|
||||||
*/
|
*/
|
||||||
printf("|=== BarinkOS ===|\n");
|
printf("|=== BarinkOS ===|\n");
|
||||||
/**
|
|
||||||
* Use the address given as an argument as the pointer
|
|
||||||
* to a Multiboot information structure.
|
|
||||||
*/
|
|
||||||
multiboot_info_t* mbt = (multiboot_info_t*) (addr );
|
|
||||||
|
|
||||||
/**
|
BootInfoBlock* BootInfo = (BootInfoBlock*) ( BootInfoBlock_pptr + 0xC0000000 );
|
||||||
* Construct our own bootInfo structure
|
|
||||||
*/
|
|
||||||
BootInfo bootinfo = {};
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
If we got a memory map from our bootloader we
|
|
||||||
should be parsing it to find out the memory regions available.
|
|
||||||
*/
|
|
||||||
if (CHECK_FLAG(mbt->flags, 6))
|
|
||||||
{
|
|
||||||
|
|
||||||
/*
|
|
||||||
Setup Physical memory managment
|
|
||||||
*/
|
|
||||||
MemoryInfo meminfo = {};
|
|
||||||
bootinfo.memory = &meminfo;
|
|
||||||
|
|
||||||
///mapMultibootMemoryMap(bootinfo.memory , mbt);
|
|
||||||
printf("Memory size: 0x%x bytes\n", bootinfo.memory->TotalMemory );
|
|
||||||
|
|
||||||
/*
|
printf("Bootloader information:\n");
|
||||||
PhysicalMemory memAlloc = PhysicalMemory{};
|
if( BootInfo->ValidELFHeader )
|
||||||
memAlloc.setup(bootinfo.memory );
|
{
|
||||||
*/
|
printf("- Valid ELF Header is available!\n");
|
||||||
|
}
|
||||||
|
|
||||||
// TODO: FIX physical allocator
|
if(BootInfo->EnabledVBE)
|
||||||
/*
|
{
|
||||||
Mark already in use sections
|
printf("- VBE graphics mode is available!\n");
|
||||||
*/
|
}
|
||||||
|
|
||||||
// Mark kernel memory as used
|
|
||||||
printf("Kernel Begin Pointer: 0x%x, Kernel end pointer: 0x%x\n", &kernel_begin , &kernel_end );
|
|
||||||
|
|
||||||
|
|
||||||
multiboot_memory_map_t *mmap = (multiboot_memory_map_t*) (mbt->mmap_addr + KERNEL_BASE_ADDR) ;
|
|
||||||
|
|
||||||
for (; (unsigned long) mmap < mbt->mmap_addr + mbt->mmap_length; mmap = (multiboot_memory_map_t *) ((unsigned long) mmap + mmap->size + sizeof(mmap->size))){
|
if(BootInfo->ValidSymbolTable)
|
||||||
|
{
|
||||||
|
printf("- Valid Symbol Table available at 0x%x.\n Tab Size: %d, str Size: %d\n", BootInfo->SymbolTableAddr, BootInfo->SymbolTabSize, BootInfo->SymbolStrSize);
|
||||||
|
}
|
||||||
|
|
||||||
if ( mmap->type == MULTIBOOT_MEMORY_AVAILABLE){
|
if(BootInfo->PhysicalMemoryMapAvailable)
|
||||||
|
{
|
||||||
} else{
|
printf("- Physical Memory Map available!\n");
|
||||||
printf("allocate region: 0x%x, size : 0x%x bytes\n", (unsigned) mmap->addr,(unsigned) mmap->len );
|
|
||||||
// memAlloc.allocate_region((unsigned)mmap->addr , (unsigned)mmap->len);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
printf("allocate region: 0x%x, size : 0x%x bytes\n", &kernel_begin, &kernel_end - &kernel_begin );
|
|
||||||
//memAlloc.allocate_region(kernel_end, kernel_end - kernel_begin);
|
|
||||||
|
|
||||||
// test alloc_block
|
|
||||||
/*
|
|
||||||
uint8_t* memory = (uint8_t*) memAlloc.allocate_block();
|
|
||||||
printf("Got a new pointer: 0x%x\n", memory);
|
|
||||||
|
|
||||||
uint8_t* memory2 = (uint8_t*) memAlloc.allocate_block();
|
|
||||||
printf("Got a new pointer: 0x%x\n", memory2);
|
|
||||||
|
|
||||||
|
|
||||||
memAlloc.free_block((void*) memory);
|
|
||||||
|
|
||||||
uint8_t* newBlockPlse = (uint8_t*) memAlloc.allocate_block();
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
//memAlloc.free_block((void*) memory);
|
|
||||||
//InitializePaging();
|
|
||||||
//IdentityMap();
|
|
||||||
//Enable();
|
|
||||||
} else{
|
|
||||||
printf("memory flag not set!");
|
|
||||||
}
|
}
|
||||||
|
|
||||||
CheckMBT( (multiboot_info_t *) addr);
|
|
||||||
asm volatile("mov %cr0, %eax ");
|
asm volatile("mov %cr0, %eax ");
|
||||||
asm volatile("or $1, %eax");
|
asm volatile("or $1, %eax");
|
||||||
asm volatile("mov %eax, %cr0");
|
asm volatile("mov %eax, %cr0");
|
||||||
kernel_main(&bootinfo);
|
kernel_main();
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -151,9 +77,28 @@ void map_multiboot_info_structure(unsigned long addr){
|
|||||||
asm("movl %cr3, %ecx;" "movl %ecx, %cr3" );
|
asm("movl %cr3, %ecx;" "movl %ecx, %cr3" );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void PhysicalMemoryAllocatorTest(){
|
||||||
extern "C" void kernel_main (BootInfo* bootinfo) {
|
#ifdef UNIT_TESTS
|
||||||
|
// test alloc_block
|
||||||
|
uint8_t* memory = (uint8_t*) memAlloc.allocate_block();
|
||||||
|
printf("Got a new pointer: 0x%x\n", memory);
|
||||||
|
|
||||||
|
uint8_t* memory2 = (uint8_t*) memAlloc.allocate_block();
|
||||||
|
printf("Got a new pointer: 0x%x\n", memory2);
|
||||||
|
|
||||||
|
memAlloc.free_block((void*) memory);
|
||||||
|
uint8_t* newBlockPlse = (uint8_t*) memAlloc.allocate_block();
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
extern "C" void kernel_main () {
|
||||||
pit_initialise();
|
pit_initialise();
|
||||||
|
|
||||||
|
// Create a dummy BootInfo object
|
||||||
|
// TODO: This should be done properly or the dependency should
|
||||||
|
// be removed from the SuperVisorTerminal.
|
||||||
|
BootInfo* bootinfo = {};
|
||||||
|
|
||||||
startSuperVisorTerminal(bootinfo);
|
startSuperVisorTerminal(bootinfo);
|
||||||
}
|
}
|
@ -3,19 +3,16 @@ extern "C"
|
|||||||
{
|
{
|
||||||
#include "Lib/string.h"
|
#include "Lib/string.h"
|
||||||
}
|
}
|
||||||
|
|
||||||
#include "definitions.h"
|
#include "definitions.h"
|
||||||
|
|
||||||
#include "Drivers/VGA/VBE.h"
|
#include "Drivers/VGA/VBE.h"
|
||||||
#include "Terminal/kterm.h"
|
#include "Terminal/kterm.h"
|
||||||
|
|
||||||
#include "multiboot.h"
|
|
||||||
#include "bootinfo.h"
|
#include "bootinfo.h"
|
||||||
|
|
||||||
#include "Memory/PhysicalMemoryManager.h"
|
#include "Memory/PhysicalMemoryManager.h"
|
||||||
#include "Memory/memoryinfo.h"
|
#include "Memory/memoryinfo.h"
|
||||||
#include "Memory/VirtualMemoryManager.h"
|
#include "Memory/VirtualMemoryManager.h"
|
||||||
#include "KernelLauncher/bootcheck.h"
|
|
||||||
|
|
||||||
#include "Memory/GDT/gdtc.h"
|
#include "Memory/GDT/gdtc.h"
|
||||||
#include "Interrupts/idt/idt.h"
|
#include "Interrupts/idt/idt.h"
|
||||||
@ -27,17 +24,15 @@ extern "C"
|
|||||||
|
|
||||||
#include "time.h"
|
#include "time.h"
|
||||||
#include "SuperVisorTerminal/superVisorTerminal.h"
|
#include "SuperVisorTerminal/superVisorTerminal.h"
|
||||||
|
#include "PreKernel/bootstructure.h"
|
||||||
|
|
||||||
#define CHECK_FLAG(flag, bit) ( flag & (1 << bit ))
|
#define CHECK_FLAG(flag, bit) ( flag & (1 << bit ))
|
||||||
#define PANIC(message) {return;}
|
#define PANIC(message) {return;}
|
||||||
|
|
||||||
|
|
||||||
void map_multiboot_info_structure(unsigned long addr);
|
void map_multiboot_info_structure(unsigned long addr);
|
||||||
|
|
||||||
extern "C" void kernel_main (BootInfo* bootinfo);
|
extern "C" void kernel_main ();
|
||||||
|
|
||||||
extern "C" const void* kernel_begin;
|
|
||||||
extern "C" const void* kernel_end;
|
|
||||||
|
|
||||||
extern "C" uint32_t boot_page_directory;
|
extern "C" uint32_t boot_page_directory;
|
||||||
extern "C" uint32_t multiboot_page_table;
|
extern "C" uint32_t multiboot_page_table;
|
||||||
|
@ -16,7 +16,7 @@ SECTIONS
|
|||||||
|
|
||||||
.multiboot.text : {
|
.multiboot.text : {
|
||||||
*(multiboot.text)
|
*(multiboot.text)
|
||||||
*launcher.o(.text)
|
*prekernel.o(.text)
|
||||||
}
|
}
|
||||||
|
|
||||||
. += 0xC0000000; /* Addresses in the following code need to be above the 3Gb mark */
|
. += 0xC0000000; /* Addresses in the following code need to be above the 3Gb mark */
|
||||||
|
Loading…
Reference in New Issue
Block a user