Files
KatauOS/src/mm/page_alloc.c
T

84 lines
2.9 KiB
C

#include "../include/paging.h"
#include <stdint.h>
#include "../include/stdio.h"
#include "../include/string.h"
// Битмап для отслеживания страниц
// Каждый бит представляет одну страницу: 0 = свободна, 1 = занята
uint8_t page_bitmap[BITMAP_SIZE];
// Установить бит (пометить страницу как занятую)
void set_bit(uint32_t page_index) {
uint32_t byte_index = page_index / 8; // Номер байта в битовой карте
uint8_t bit_offset = page_index % 8; // Смещение бита в байте
page_bitmap[byte_index] |= (1 << bit_offset); // Устанавливаем бит
}
// Сбросить бит (пометить страницу как свободную)
void clear_bit(uint32_t page_index) {
if (page_index >= PAGE_COUNT) {
printf("clear_bit: address out of range\n");
return;
}
uint32_t byte_index = page_index / 8;
uint8_t bit_offset = page_index % 8;
//check if this is needed at all except for debug purposes
if(!(page_bitmap[byte_index] & (1 << bit_offset)))
{
printf("clear_bit: page #0x%X already free\n", page_index);
return;
}
page_bitmap[byte_index] &= ~(1 << bit_offset); // Сбрасываем бит
}
// Инициализация аллокатора страниц
void init_allocator() {
int i;
memset(page_bitmap, 0x00, BITMAP_SIZE);
}
void* alloc_page() {
int i, j;
// Проходим по всему битмапу
for (i = 0; i < BITMAP_SIZE; i++) {
if (page_bitmap[i] != 0xFF) { // Если в этом байте есть свободная страница
//printf("!!!free page at 0x%X!!!\n", i);
for (j = 0; j < 8; j++) {
if (!(page_bitmap[i] & (1 << j))) { // Если этот бит = 0 (свободен)
page_bitmap[i] |= (1 << j); // Помечаем как занятый
// Вычисляем физический адрес страницы
uint32_t page_num = i * 8 + j;
void* addr = (void*)(page_num * PAGE_SIZE);
//printf("allocated page at 0x%X (page #0x%X)\n", addr, page_num);
return (void*)(page_num * PAGE_SIZE);
}
}
}
}
printf("no bitches? no free pages?\n");
return (void*)0; // Нет свободных страниц
}
void free_page(void* physaddr) {
uint32_t addr = (uint32_t)physaddr;
// Проверка выравнивания адреса
if (addr & 0xFFF) {
printf("free_page: address not page-aligned\n");
return;
}
// Вычисляем номер страницы
uint32_t page_num = addr / PAGE_SIZE;
clear_bit(page_num);
}