Merge into main the new state of the operating system/kernel #1
5
Makefile
5
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 -O2 -Wall -Wextra
|
CFLAGS = -ffreestanding -O2 -Wall -Wextra
|
||||||
|
|
||||||
OFILES =$(BUILD_DIR)/boot.o $(BUILD_DIR)/kterm.o $(BUILD_DIR)/kernel.o $(BUILD_DIR)/memory.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
|
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
|
||||||
|
|
||||||
SRC_DIR = src
|
SRC_DIR = src
|
||||||
BUILD_DIR = build
|
BUILD_DIR = build
|
||||||
@ -96,3 +96,6 @@ $(BUILD_DIR)/sv-terminal.o:
|
|||||||
|
|
||||||
$(BUILD_DIR)/memory.o:
|
$(BUILD_DIR)/memory.o:
|
||||||
$(CPP) -c $(SRC_DIR)/kernel/memory/memory.cpp -o $(BUILD_DIR)/memory.o $(CFLAGS) -fno-exceptions -fno-rtti
|
$(CPP) -c $(SRC_DIR)/kernel/memory/memory.cpp -o $(BUILD_DIR)/memory.o $(CFLAGS) -fno-exceptions -fno-rtti
|
||||||
|
|
||||||
|
$(BUILD_DIR)/paging.o:
|
||||||
|
$(CPP) -c $(SRC_DIR)/kernel/memory/paging.cpp -o $(BUILD_DIR)/paging.o $(CFLAGS) -fno-exceptions -fno-rtti
|
0
src/kernel/filesystems/FAT/FAT16.cpp
Normal file
0
src/kernel/filesystems/FAT/FAT16.cpp
Normal file
8
src/kernel/filesystems/FAT/FAT16.h
Normal file
8
src/kernel/filesystems/FAT/FAT16.h
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
#pragma once
|
||||||
|
#include "../../vfs/File.h"
|
||||||
|
|
||||||
|
|
||||||
|
class FAT16 : File {
|
||||||
|
public:
|
||||||
|
|
||||||
|
};
|
@ -4,6 +4,9 @@ extern "C" void kernel_main (BootInfo* bootinfo) {
|
|||||||
init_serial();
|
init_serial();
|
||||||
pit_initialise();
|
pit_initialise();
|
||||||
|
|
||||||
|
InitializePaging();
|
||||||
|
//Enable();
|
||||||
|
|
||||||
startSuperVisorTerminal(bootinfo);
|
startSuperVisorTerminal(bootinfo);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -14,6 +14,7 @@ extern "C"
|
|||||||
|
|
||||||
#include "memory/memory.h"
|
#include "memory/memory.h"
|
||||||
#include "memory/memoryinfo.h"
|
#include "memory/memoryinfo.h"
|
||||||
|
#include "memory/paging.h"
|
||||||
#include "bootcheck.h"
|
#include "bootcheck.h"
|
||||||
|
|
||||||
#include "gdt/gdtc.h"
|
#include "gdt/gdtc.h"
|
||||||
|
@ -1,43 +0,0 @@
|
|||||||
#include "PageDirectory.h"
|
|
||||||
|
|
||||||
void PageDirectory::enable()
|
|
||||||
{
|
|
||||||
|
|
||||||
|
|
||||||
// https://wiki.osdev.org/Setting_Up_Paging
|
|
||||||
//set each entry to not present
|
|
||||||
// int i;
|
|
||||||
// for(i = 0; i < 1024; i++)
|
|
||||||
// {
|
|
||||||
// // This sets the following flags to the pages:
|
|
||||||
// // Supervisor: Only kernel-mode can access them
|
|
||||||
// // Write Enabled: It can be both read from and written to
|
|
||||||
// // Not Present: The page table is not present
|
|
||||||
// this->page_directory[i] = 0x00000002;
|
|
||||||
// }
|
|
||||||
|
|
||||||
// // holds the physical address where we want to start mapping these pages to.
|
|
||||||
// // in this case, we want to map these pages to the very beginning of memory.
|
|
||||||
|
|
||||||
// //we will fill all 1024 entries in the table, mapping 4 megabytes
|
|
||||||
// for(unsigned int i = 0; i < 1024; i++)
|
|
||||||
// {
|
|
||||||
// // As the address is page aligned, it will always leave 12 bits zeroed.
|
|
||||||
// // Those bits are used by the attributes ;)
|
|
||||||
// first_page_table[i] = (i * 0x1000) | 3; // attributes: supervisor level, read/write, present.
|
|
||||||
// }
|
|
||||||
|
|
||||||
// // attributes: supervisor level, read/write, present
|
|
||||||
// this->page_directory[0] = ((unsigned int)first_page_table) | 3;
|
|
||||||
|
|
||||||
printf("Enable Paging!\n");
|
|
||||||
|
|
||||||
loadPageDirectory(this->page_directory);
|
|
||||||
enablePaging();
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void PageDirectory::MapPhysicalToVirtualAddress ( address_t PAddress , address_t VAddress, uint32_t size )
|
|
||||||
{
|
|
||||||
|
|
||||||
}
|
|
@ -1,31 +0,0 @@
|
|||||||
#pragma once
|
|
||||||
#include <stdint.h>
|
|
||||||
#include "./memory.h"
|
|
||||||
#include "./../tty/kterm.h"
|
|
||||||
#define KB 1024
|
|
||||||
|
|
||||||
|
|
||||||
typedef uintptr_t address_t;
|
|
||||||
|
|
||||||
static const int MAX_PAGES = 1024 * KB; // 4GB , 4kB/page
|
|
||||||
static volatile address_t pmem_stack[MAX_PAGES];
|
|
||||||
static volatile address_t pmem_stack_top = MAX_PAGES; // top down allocation
|
|
||||||
|
|
||||||
extern "C" void loadPageDirectory (uint32_t* addr );
|
|
||||||
extern "C" void enablePaging();
|
|
||||||
|
|
||||||
struct page_directory_entry {};
|
|
||||||
struct page_table_entry{};
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
class PageDirectory {
|
|
||||||
public:
|
|
||||||
void enable ();
|
|
||||||
void MapPhysicalToVirtualAddress ( address_t PAddress , address_t VAddress, uint32_t size );
|
|
||||||
|
|
||||||
private:
|
|
||||||
uint32_t page_directory[1024] __attribute__((aligned(4096))); // align on 4 kiloByte pages
|
|
||||||
uint32_t first_page_table[1024] __attribute__((aligned(4096))); // align on 4 kiloByte pages
|
|
||||||
|
|
||||||
};
|
|
49
src/kernel/memory/paging.cpp
Normal file
49
src/kernel/memory/paging.cpp
Normal file
@ -0,0 +1,49 @@
|
|||||||
|
#include "paging.h"
|
||||||
|
PageDirectoryEntry kernel_directory[MAX_DIRECTORY_ENTRIES];
|
||||||
|
|
||||||
|
void InitializePaging()
|
||||||
|
{
|
||||||
|
// Identity map the first 8MB ... Physical addresses 0x00000000 to 0x007A1200
|
||||||
|
|
||||||
|
|
||||||
|
// Identity map the kernel space || our map to 3GB space
|
||||||
|
|
||||||
|
|
||||||
|
// Identity map VGA memory
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void AllocatePage(VIRTUAL_ADDRESS vaddr, PageDirectoryEntry& page_directory)
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void FreePage(VIRTUAL_ADDRESS vaddr , PageDirectoryEntry& page_directory)
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void Map ( PHYSICAL_ADDRESS paddr, VIRTUAL_ADDRESS vaddr, PageDirectoryEntry& page_directory)
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
void Unmap(VIRTUAL_ADDRESS, PageDirectoryEntry& page_directory)
|
||||||
|
{
|
||||||
|
// NOTE: I will implement lazy unmapping for now
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void Enable()
|
||||||
|
{
|
||||||
|
printf("Load into CR3 address: 0x%x\n", (uint32_t)(&kernel_directory[0]));
|
||||||
|
loadPageDirectory(&kernel_directory[0]);
|
||||||
|
enablePaging();
|
||||||
|
|
||||||
|
printf("Paging enabled!\n");
|
||||||
|
}
|
55
src/kernel/memory/paging.definitions.h
Normal file
55
src/kernel/memory/paging.definitions.h
Normal file
@ -0,0 +1,55 @@
|
|||||||
|
#pragma once
|
||||||
|
#include <stdint.h>
|
||||||
|
/*
|
||||||
|
This file contains some handy definitions for different types
|
||||||
|
that have to do with paging in atleast 32 bit and maybe sometime in the future
|
||||||
|
also 64 bit mode.
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#define MAX_DIRECTORY_ENTRIES 1024
|
||||||
|
#define MAX_PAGE_TABLE_ENTRIES 1024
|
||||||
|
#define MAX_PAGES 1024
|
||||||
|
|
||||||
|
#define PHYSICAL_ADDRESS uint32_t
|
||||||
|
#define VIRTUAL_ADDRESS uint32_t
|
||||||
|
|
||||||
|
#define PageDirectoryEntry uint32_t
|
||||||
|
#define PageTableEntry uint32_t
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
// NOTE: FIXME: I am fairly certain these masks are off by one!
|
||||||
|
|
||||||
|
#define PD32_PRESENT_MASK (0x1 << 0)
|
||||||
|
#define PD32_READ_WRITE_MASK (0x1 << 1)
|
||||||
|
#define PD32_SUPERVISOR_MASK (0x1 << 2)
|
||||||
|
#define PD32_WRITE_THROUGH_MASK (0x1 << 3)
|
||||||
|
#define PD32_CACHE_DISABLE_MASK (0x1 << 4)
|
||||||
|
#define PD32_ACCESSED_MASK (0x1 << 5)
|
||||||
|
#define PD32_AVAILABLE_1_4KB_MASK (0x1 << 6)
|
||||||
|
#define PD32_DISABLE_4MB_MASK (0x1 << 6)
|
||||||
|
#define PD32_PAGE_SIZE_MASK (0x1 << 7)
|
||||||
|
#define PD32_GLOBAL_4MB_MASK (0x1 << 8)
|
||||||
|
#define PD32_AVAILABLE_2_4MB_MASK ( 14 << 9)
|
||||||
|
#define PD32_AVAILABLE_2_4KB_MASK ( 15 << 8)
|
||||||
|
#define PD32_ADDRESS_4KB_MASK (0x8FFFF << 12)
|
||||||
|
#define PD32_PAGE_ATTRIBUTE_TABLE_4MB_MASK (0x1 << 12)
|
||||||
|
#define PD32_HIGH_HALF_ADDRESS_4MB_MASK (0x7F<< 13)
|
||||||
|
#define PD32_RESERVED_4MB_MASK (0x1 << 21)
|
||||||
|
#define PD32_LOWER_HALF_ADDRESS_4MB_MASK (0x1FF << 22)
|
||||||
|
|
||||||
|
#define PT32_PRESENT_MASK (0x1 << 0)
|
||||||
|
#define PT32_READ_WRITE_MASK (0x1 << 1)
|
||||||
|
#define PT32_SUPERVISOR_MASK (0x1 << 2)
|
||||||
|
#define PT32_WRITE_THROUGH_MASK (0x1 << 3)
|
||||||
|
#define PT32_CACHE_DISABLE_MASK (0x1 << 4)
|
||||||
|
#define PT32_ACCESSED_MASK (0x1 << 5)
|
||||||
|
#define PT32_DIRTY_MASK (0x1 << 6)
|
||||||
|
#define PT32_PAGE_ATTRIBUTE_TABLE_MASK (0x1 << 7)
|
||||||
|
#define PT32_GLOBAL_MASK (0x1 << 8)
|
||||||
|
#define PT32_AVAILABLE_MASK (0x7 << 9)
|
||||||
|
#define PT32_CACHE_DISABLE_MASK (0x7FFFF << 12)
|
||||||
|
|
21
src/kernel/memory/paging.h
Normal file
21
src/kernel/memory/paging.h
Normal file
@ -0,0 +1,21 @@
|
|||||||
|
#pragma once
|
||||||
|
#include "./memory.h"
|
||||||
|
#include "./../tty/kterm.h"
|
||||||
|
#include "paging.definitions.h"
|
||||||
|
|
||||||
|
|
||||||
|
extern "C" void loadPageDirectory (uint32_t* addr );
|
||||||
|
extern "C" void enablePaging();
|
||||||
|
|
||||||
|
void InitializePaging();
|
||||||
|
|
||||||
|
void Enable();
|
||||||
|
|
||||||
|
void AllocatePage(VIRTUAL_ADDRESS, PageDirectoryEntry&);
|
||||||
|
|
||||||
|
|
||||||
|
void FreePage(VIRTUAL_ADDRESS, PageDirectoryEntry&);
|
||||||
|
|
||||||
|
|
||||||
|
void Map(PHYSICAL_ADDRESS, VIRTUAL_ADDRESS, PageDirectoryEntry&);
|
||||||
|
void Unmap (VIRTUAL_ADDRESS, PageDirectoryEntry&);
|
Loading…
Reference in New Issue
Block a user