wip: page_tables allocation

This commit is contained in:
2024-10-21 16:29:50 +02:00
parent 4337bc11c8
commit f5147e78f9
6 changed files with 67 additions and 42 deletions

View File

@ -7,26 +7,30 @@
#include "memory.h"
#include "utils.h"
#define PT_SIZE 1024
#define MAX_TLB_ENTRIES 32
extern uint32_t page_table1[PT_SIZE];
static uint32_t *current_page_table;
static int16_t find_next_block(size_t nb_pages)
{
for (uint16_t i = 1; i + nb_pages < PT_SIZE - 1; i++) {
uint16_t j;
for (j = 0; page_table1[i + j] >> 12 == i + j && j < nb_pages;
j++)
;
if (j == nb_pages)
return i;
i += j;
for (uint16_t pd_index = 0; pd_index < 768; pd_index++) {
current_page_table =
(uint32_t *)(page_directory[pd_index] >> 12);
for (uint16_t i = 0; i + nb_pages < PT_SIZE; i++) {
uint16_t j;
for (j = 0; current_page_table[i + j] >> 12 == i + j &&
j < nb_pages;
j++)
;
if (j == nb_pages)
return i;
i += j;
}
}
return -1;
}
void *alloc_pages(size_t size)
void *alloc_pages(size_t size, uint32_t **frame_ptr)
{
const uint32_t nb_pages = CEIL(size, PAGE_SIZE);
const int16_t index = find_next_block(nb_pages);
@ -39,15 +43,17 @@ void *alloc_pages(size_t size)
void *frame = alloc_frames(PAGE_SIZE);
if (!frame) {
for (size_t j = index; j < i; j++)
free_frames((void *)(page_table1[j] >> 12),
PAGE_SIZE);
free_frames(
(void *)(current_page_table[j] >> 12),
PAGE_SIZE);
return NULL;
}
/* assert(page_table1[i] >> 12 == i); */
page_table1[i] = ((uint32_t)frame & PAGE_MASK) | INIT_FLAGS;
if (frame_ptr)
*frame_ptr = frame;
current_page_table[i] =
((uint32_t)frame & PAGE_MASK) | INIT_FLAGS;
}
/* PRINT_PTR(page_table1[index]); */
return (void *)(index * PAGE_SIZE);
return (void *)((0 * 1024 + index) * PAGE_SIZE);
}
int free_pages(void *page_ptr, size_t size)
@ -66,8 +72,8 @@ int free_pages(void *page_ptr, size_t size)
return -1;
}
for (size_t i = page_index; i < page_index + nb_pages; i++) {
free_frames((void *)(page_table1[i] >> 12), PAGE_SIZE);
page_table1[i] = i << 12 | INIT_FLAGS;
free_frames((void *)(current_page_table[i] >> 12), PAGE_SIZE);
current_page_table[i] = i << 12 | INIT_FLAGS;
}
return 0;
}