added origin program
This commit is contained in:
@@ -1,4 +1,4 @@
|
||||
#include "lib/print.h"
|
||||
#include "memory/mm.h"
|
||||
#include "multiboot.h"
|
||||
|
||||
#include <stddef.h>
|
||||
@@ -19,10 +19,6 @@ extern void disable_pae();
|
||||
|
||||
#define TEMP_MAPPING_VADDR 0xE0000000
|
||||
|
||||
#define PAGE_PRESENT 0x1
|
||||
#define PAGE_WRITABLE 0x2
|
||||
#define PAGE_USER 0x4
|
||||
|
||||
static uint32_t max_address = 0;
|
||||
static uint32_t total_available_memory = 0;
|
||||
static uint8_t memory_bitmap[BITMAP_SIZE];
|
||||
@@ -92,7 +88,7 @@ static void parse_multiboot_mmap(void* base, uint32_t limit) {
|
||||
}
|
||||
}
|
||||
|
||||
static void* p_alloc_frame() {
|
||||
void* p_alloc_frame() {
|
||||
for (uint32_t i = 0; i < BITMAP_SIZE; i++) {
|
||||
uint8_t b = memory_bitmap[i];
|
||||
if (b == 0xFF) {
|
||||
@@ -116,7 +112,7 @@ static void p_free_frame(void* addr) {
|
||||
}
|
||||
|
||||
// MODIFIES THE ACTIVE PAGE TABLE AT THE PHYSICAL ADDRESS LOADED INTO CR3 VIA RECURSIVE MAPPING
|
||||
static void map_page(uint32_t vaddr, uint32_t paddr, uint32_t flags) {
|
||||
void map_page(uint32_t vaddr, uint32_t paddr, uint32_t flags) {
|
||||
uint32_t pde_entry = vaddr >> 22;
|
||||
uint32_t pte_entry = (vaddr >> 12) & 0x3FF;
|
||||
uint32_t* pd = (uint32_t*)PAGE_DIRECTORY;
|
||||
@@ -124,7 +120,7 @@ static void map_page(uint32_t vaddr, uint32_t paddr, uint32_t flags) {
|
||||
|
||||
if ((pd[pde_entry] & PAGE_PRESENT) == 0) {
|
||||
uint32_t new_table = (uint32_t)p_alloc_frame();
|
||||
pd[pde_entry] = new_table | PAGE_PRESENT | PAGE_WRITABLE;
|
||||
pd[pde_entry] = new_table | flags;
|
||||
flush_tlb();
|
||||
for (int i = 0; i < 1024; i++) {
|
||||
tablev[i] = 0;
|
||||
@@ -146,11 +142,16 @@ void init_pmm(void* mmap_base, uint32_t mmap_limit) {
|
||||
}
|
||||
|
||||
void init_page_tables() {
|
||||
uint32_t* kernel_table = p_alloc_frame();
|
||||
for (int i = 0; i < 1024; i++) {
|
||||
kernel_table[i] = (i * PAGE_SIZE) | 0x3;
|
||||
uint32_t kernel_size = (uint32_t)&__kernel_end - (uint32_t)&__kernel_start;
|
||||
uint32_t num_pages = kernel_size / PAGE_SIZE + 1;
|
||||
uint32_t num_page_tables = (num_pages + 1023) / 1024;
|
||||
for (uint32_t table = 0; table < num_page_tables; table++) {
|
||||
uint32_t* kernel_table = p_alloc_frame();
|
||||
for (int i = 0; i < 1024; i++) {
|
||||
kernel_table[i] = (i * PAGE_SIZE) | 0x3;
|
||||
}
|
||||
page_directory[768 + table] = (uint32_t)(kernel_table) | 0x3;
|
||||
}
|
||||
page_directory[768] = (uint32_t)(kernel_table) | 0x3;
|
||||
page_directory[0] = 0;
|
||||
disable_pae();
|
||||
flush_tlb();
|
||||
@@ -171,17 +172,19 @@ void* create_user_pd() {
|
||||
uint32_t* user_pd = (uint32_t*)TEMP_MAPPING_VADDR;
|
||||
uint32_t* kernel_pd = (uint32_t*)PAGE_DIRECTORY;
|
||||
|
||||
for(int i = 0; i < 1024; i++) {
|
||||
for(int i = 0; i < 768; i++) {
|
||||
user_pd[i] = 0;
|
||||
}
|
||||
|
||||
user_pd[768] = kernel_pd[768];
|
||||
for(int i = 768; i < 1023; i++) {
|
||||
user_pd[i] = kernel_pd[i];
|
||||
}
|
||||
|
||||
user_pd[1023] = (uint32_t)pd_address | PAGE_PRESENT | PAGE_WRITABLE;
|
||||
|
||||
uint32_t pde = TEMP_MAPPING_VADDR >> 22;
|
||||
uint32_t pte = (TEMP_MAPPING_VADDR >> 12) & 0x3FF;
|
||||
uint32_t* kernel_pt = (uint32_t*)(PAGE_TABLES + (pde * PAGE_SIZE));
|
||||
kernel_pt[pte] = 0;
|
||||
flush_tlb();
|
||||
return (void*)pd_address;
|
||||
}
|
||||
Reference in New Issue
Block a user