#include "../include/paging.h" #include #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); }