kernel/os_paging.c (view raw)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54
#include "os_paging.h"
#include "linker.h"
#include "os_page_allocator.h"
//#define MAKE_PAGE_ENTRY(addr, flags) (uint32_t)(((uint32_t)(addr) & 0xFFFFF000) | (flags))
#define PAGE_DIRECTORY (PAGE_DIR_ENTRY[PAGE_ENTRY_COUNT])
#define PAGE_TABLE (PAGE_TABLE_ENTRY[PAGE_ENTRY_COUNT])
#define PAGE_DIR_INDEX(addr) (((uint32_t)(addr) >> 22) % PAGE_ENTRY_COUNT)
#define PAGE_TABLE_INDEX(addr) (((uint32_t)(addr) >> 12) % PAGE_ENTRY_COUNT)
#define PAGE_TABLE_MAPPED_ADDR(index) ((PAGE_TABLE_ENTRY*)(PAGE_SIZE * PAGE_ENTRY_COUNT * (PAGE_ENTRY_COUNT - 1) + PAGE_SIZE * index))
#define PAGE_DIR_MAPPED_ADDR ((PAGE_DIR_ENTRY*)(PAGE_TABLE_MAPPED_ADDR(PAGE_ENTRY_COUNT - 1)))
/*
int map_page_to(void* page_addr, uint32_t dir_index, uint32_t table_index) {
PAGE_DIR_ENTRY* page_dir = PAGE_DIR_MAPPED_ADDR;
if (!(page_dir[dir_index].present)) {
#warning implement this
// acquire new page table
}
PAGE_TABLE_ENTRY* page_table = PAGE_TABLE_MAPPED_ADDR(dir_index);
if (!(page_table[table_index].present)) {
#warning implement this
// map page
} else {
// didn't works
return -1;
}
}
void* map_first_free(void* page_dir, void* search_start, void* page) {
uint32_t table_start_i = PAGE_TABLE_INDEX(search_start);
for (uint32_t dir_i = PAGE_DIR_INDEX(search_start); dir_i < (PAGE_ENTRY_COUNT - 1); dir_i++) {
for (uint32_t table_i = table_start_i; table_i < (PAGE_ENTRY_COUNT - 1); table_i++) {
if (map_page_to(page, ))
}
table_start_i = 0;
}
return 0;
}
void* create_empty_page_dir(void) {
return 0;
#warning IMPLEMENT STH.
}
*/