Made kernel C++ now

This commit is contained in:
Xnoe 2021-10-21 23:19:36 +01:00
parent cd8bd42ebb
commit 2a68860bef
Signed by: xnoe
GPG Key ID: 45AC398F44F0DAFE
14 changed files with 70 additions and 75 deletions

View File

@ -1,5 +1,5 @@
CFLAGS = -std=gnu11 -m32 -mgeneral-regs-only -nostdlib -fno-builtin -fno-exceptions -fno-leading-underscore -fno-pie -fno-stack-protector -Wno-pointer-to-int-cast
CXXFLAGS = -m32 -fno-use-cxa-atexit -nostdlib -fno-builtin -fno-rtti -fno-exceptions -fno-leading-underscore
CXXFLAGS = -m32 -fno-use-cxa-atexit -mgeneral-regs-only -nostdlib -fno-builtin -fno-rtti -fno-exceptions -fno-leading-underscore -fpermissive -fno-pie -fno-stack-protector
LDFLAGS =
DISK_IMG_FILES = build/kernel/kernel.bin
@ -52,7 +52,7 @@ build/kernel/%.o: src/kernel/%.c
gcc $(CFLAGS) -o $@ -c $<
build/kernel/%.o: src/kernel/%.cpp
g++ $(CFLAGS) -o $@ -c $<
g++ $(CXXFLAGS) -o $@ -c $<
build/kernel/%.o: src/kernel/%.asm
nasm -felf32 $< -o $@

View File

@ -66,7 +66,7 @@ void init_atapio() {
// We've initialised now, let's load the FAT and RootDirEntries.
read_sectors(sectorsPerFAT * countFATs + countReserved, countRDEs / 16, rootDirEntries);
read_sectors(countReserved, sectorsPerFAT, FAT1);
read_sectors(countReserved, sectorsPerFAT, (uint8_t*)FAT1);
}
void read_sector(uint32_t address, uint8_t* buffer) {
@ -101,7 +101,7 @@ uint16_t file_exists(char* filename) {
for (int i=0; i<countRDEs; i++) {
bool found = strcmp(rootDirEntries+(i*32), filename, 11);
if (found) {
uint16_t* correctEntry = (rootDirEntries+(i*32));
uint16_t* correctEntry = (uint16_t*)(rootDirEntries+(i*32));
return correctEntry[13];
}
}

View File

@ -3,10 +3,8 @@
gdt_entry gdt[] = {
(gdt_entry){ // Null Segment
.limit_lo = 0,
.limit_hi = 0,
.base_lo = 0,
.base_mid = 0,
.base_hi = 0,
.accessed = 0,
.read_write = 0,
.direction = 0,
@ -14,17 +12,16 @@ gdt_entry gdt[] = {
.system_segment = 0,
.privilege = 0,
.present = 0,
.limit_hi = 0,
.__ignored__ = 0,
.size = 0,
.granularity = 0,
.__ignored__ = 0,
.base_hi = 0,
},
(gdt_entry){ // Code Segment
.limit_lo = 0xffff,
.limit_hi = 0xf,
.base_lo = 0,
.base_mid = 0,
.base_hi = 0,
.accessed = 0,
.read_write = 1,
.direction = 0,
@ -32,17 +29,16 @@ gdt_entry gdt[] = {
.system_segment = 1,
.privilege = 0,
.present = 1,
.limit_hi = 0xf,
.__ignored__ = 0,
.size = 1,
.granularity = 1,
.__ignored__ = 0,
.base_hi = 0
},
(gdt_entry){ // Data Segment
.limit_lo = 0xffff,
.limit_hi = 0xf,
.base_lo = 0,
.base_mid = 0,
.base_hi = 0,
.accessed = 0,
.read_write = 1,
.direction = 0,
@ -50,11 +46,11 @@ gdt_entry gdt[] = {
.system_segment = 1,
.privilege = 0,
.present = 1,
.limit_hi = 0xf,
.__ignored__ = 0,
.size = 1,
.granularity = 1,
.__ignored__ = 0,
.base_hi = 0
}
};

View File

@ -3,7 +3,7 @@
#include "types.h"
typedef struct {
struct __attribute__((packed)) gdt_entry {
uint32_t limit_lo : 16;
uint32_t base_lo : 16;
@ -22,11 +22,13 @@ typedef struct {
uint32_t granularity : 1;
uint32_t base_hi : 8;
}__attribute__((packed)) gdt_entry;
};
typedef struct {
struct __attribute__((packed)) gdt_descr {
uint16_t size;
uint32_t offset;
}__attribute__((packed)) gdt_descr;
};
void init_gdt();
#endif

View File

@ -14,18 +14,18 @@ void set_entry(uint8_t interrupt_number, uint16_t code_segment, void* handler, u
};
}
__attribute__((interrupt)) void interrupt_20(struct interrupt_frame* frame) {
__attribute__((interrupt)) void interrupt_20(interrupt_frame* frame) {
// printf("Interrupt 20 received!!\n");
outb(0x20, 0x20);
}
__attribute__((interrupt)) void page_fault(struct interrupt_frame* frame, uint32_t err_code) {
__attribute__((interrupt)) void page_fault(interrupt_frame* frame, uint32_t err_code) {
uint32_t problem_address;
asm("mov %%cr2, %0" : "=a" (problem_address) :);
printf("Page Fault at %x\n", problem_address);
}
__attribute__((interrupt)) void ignore_interrupt(struct interrupt_frame* frame) {
__attribute__((interrupt)) void ignore_interrupt(interrupt_frame* frame) {
outb(0x20, 0x20);
}

View File

@ -16,17 +16,17 @@ void set_entry(uint8_t interrupt_number, uint16_t code_segment, void* handler, u
void init_idt();
void enable_idt();
typedef struct {
struct __attribute__((packed)) GateEntry{
uint16_t offset_low;
uint16_t selector;
uint8_t zero;
uint8_t type;
uint16_t offset_high;
}__attribute__((packed)) GateEntry;
} ;
typedef struct {
struct __attribute__((packed)) idt_desc {
uint16_t size;
uint32_t offset;
}__attribute__((packed)) idt_desc;
} ;
#endif

View File

@ -1,65 +1,62 @@
#include "paging.h"
typedef struct {
struct __attribute__((packed)) split_addr {
uint32_t page_offset : 12;
uint32_t pt_index : 10;
uint32_t pd_index : 10;
}__attribute__((packed)) split_addr;
};
void map_4k_phys_to_virt(uint32_t physical, uint32_t virtual, PDE* page_directory, PTE** page_tables) {
split_addr* split = (split_addr*)&virtual;
void map_4k_phys_to_virt(uint32_t physical, uint32_t virt, PDE* page_directory, PTE** page_tables) {
split_addr* split = (split_addr*)&virt;
page_directory[split->pd_index] = (PDE){
.address = (uint32_t)(page_tables[split->pd_index]) >> 12,
.available = 0,
.present = 1,
.read_write = 1,
.privilege = 0,
.write_through_cache = 0,
.disable_cache = 0,
.accessed = 0,
.ignored2 = 0,
.page_4mb = 0,
.accessed = 0,
.disable_cache = 0,
.write_through_cache = 0,
.privilege = 0,
.present = 1,
.read_write = 1,
.ignored = 0,
.ignored2 = 0
.available = 0,
.address = (uint32_t)(page_tables[split->pd_index]) >> 12
};
((PTE*)((uint32_t)page_tables[split->pd_index] + 0xbffe0000))[split->pt_index] = (PTE){
.address = physical >> 12,
.available = 0,
.global = 0,
.accessed = 0,
.disable_cache = 0,
.dirty = 0,
.write_through_cache = 0,
.privilege = 0,
.present = 1,
.read_write = 1,
.ignored = 0
.privilege = 0,
.write_through_cache = 0,
.disable_cache = 0,
.accessed = 0,
.dirty = 0,
.ignored = 0,
.global = 0,
.available = 0,
.address = physical >> 12
};
}
void map_many_4k_phys_to_virt(uint32_t physical, uint32_t virtual, PDE* page_directory, PTE** page_tables, uint32_t count) {
void map_many_4k_phys_to_virt(uint32_t physical, uint32_t virt, PDE* page_directory, PTE** page_tables, uint32_t count) {
for (int i=0; i<count; i++)
map_4k_phys_to_virt(physical + 4096*i, virtual + 4096*i, page_directory, page_tables);
map_4k_phys_to_virt(physical + 4096*i, virt + 4096*i, page_directory, page_tables);
}
void unmap_4k_virt(uint32_t virtual, PDE* page_directory, PTE** page_tables) {
split_addr* split = (split_addr*)&virtual;
void unmap_4k_virt(uint32_t virt, PDE* page_directory, PTE** page_tables) {
split_addr* split = (split_addr*)&virt;
((PTE*)((uint32_t)page_tables[split->pd_index] + 0xbffe0000))[split->pt_index] = (PTE){
.address = 0,
.available = 0,
.global = 0,
.accessed = 0,
.disable_cache = 0,
.dirty = 0,
.write_through_cache = 0,
.privilege = 0,
.present = 0,
.read_write = 0,
.ignored = 0
.privilege = 0,
.write_through_cache = 0,
.disable_cache = 0,
.accessed = 0,
.dirty = 0,
.ignored = 0,
.global = 0,
.available = 0,
.address = 0
};
}

View File

@ -4,7 +4,7 @@
#include <stdbool.h>
#include "types.h"
typedef struct {
struct __attribute__((packed)) PDE {
uint32_t present : 1;
uint32_t read_write : 1;
uint32_t privilege : 1;
@ -16,9 +16,9 @@ typedef struct {
uint32_t ignored : 1;
uint32_t available : 3;
uint32_t address : 20;
}__attribute__((packed)) PDE;
};
typedef struct {
struct __attribute__((packed)) PTE {
uint32_t present : 1;
uint32_t read_write : 1;
uint32_t privilege : 1;
@ -30,10 +30,10 @@ typedef struct {
uint32_t global : 1;
uint32_t available : 3;
uint32_t address : 20;
}__attribute__((packed)) PTE;
};
void map_4k_phys_to_virt(uint32_t physical, uint32_t virtual, PDE* page_directory, PTE** page_tables);
void map_many_4k_phys_to_virt(uint32_t physical, uint32_t virtual, PDE* page_directory, PTE** page_tables, uint32_t count);
void map_4k_phys_to_virt(uint32_t physical, uint32_t virt, PDE* page_directory, PTE** page_tables);
void map_many_4k_phys_to_virt(uint32_t physical, uint32_t virt, PDE* page_directory, PTE** page_tables, uint32_t count);
void unmap_4k_virt(uint32_t virtual, PDE* page_directory, PTE** page_tables);
void unmap_4k_virt(uint32_t virt, PDE* page_directory, PTE** page_tables);
#endif

View File

@ -69,7 +69,7 @@ int int_to_decimal(unsigned int number, char* string_buffer) {
return (index+1);
}
char dec_to_hex[16] = "0123456789abcdef";
char dec_to_hex[17] = "0123456789abcdef";
int int_to_hex(unsigned int number, char* string_buffer) {
for (int i=0; i<8; i++)
string_buffer[i] = '0';