merge branch memory-shit into higher-half
This commit is contained in:
+33
-50
@@ -1,61 +1,61 @@
|
||||
#include "../include/paging.h"
|
||||
#include <stdint.h>
|
||||
#include "../include/stdio.h"
|
||||
|
||||
#define PAGE_SIZE 0x1000 // 4 КБ
|
||||
|
||||
// Общий размер памяти
|
||||
#define MEMORY_SIZE 0x100000000 // 4 ГБ
|
||||
|
||||
// Количество страниц
|
||||
#define PAGE_COUNT (MEMORY_SIZE / PAGE_SIZE) // 1 048 576 страниц
|
||||
|
||||
// Размер битмапа в байтах (округлено вверх)
|
||||
#define BITMAP_SIZE (PAGE_COUNT / 8) // 131 072 байт
|
||||
#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;
|
||||
|
||||
// Помечаем все страницы как свободные (0)
|
||||
for (i = 0; i < BITMAP_SIZE; i++) {
|
||||
page_bitmap[i] = 0;
|
||||
}
|
||||
|
||||
// Резервируем первые 4 МБ для ядра (0x00000000-0x003FFFFF)
|
||||
// Это 1024 страницы или 128 байт битмапа
|
||||
for (i = 0; i < 1024 / 8; i++) {
|
||||
page_bitmap[i] = 0xFF; // Все биты = 1 (занято)
|
||||
}
|
||||
|
||||
// Если вы используете higher-half kernel, то нужно также
|
||||
// зарезервировать соответствующую область в верхней части памяти
|
||||
// Например, если ядро отображено начиная с 0xC0000000 (3 ГБ):
|
||||
uint32_t kernel_higher_start = 0xC0000000 / PAGE_SIZE / 8; // Индекс в битмапе
|
||||
for (i = kernel_higher_start; i < kernel_higher_start + 1024 / 8; i++) {
|
||||
page_bitmap[i] = 0xFF;
|
||||
}
|
||||
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);
|
||||
void* addr = (void*)(page_num * PAGE_SIZE);
|
||||
|
||||
printf("allocated page at 0x%X (page #0x%X)\n", addr, page_num);
|
||||
//printf("allocated page at 0x%X (page #0x%X)\n", addr, page_num);
|
||||
|
||||
return (void*)(page_num * PAGE_SIZE);
|
||||
}
|
||||
@@ -79,22 +79,5 @@ void free_page(void* physaddr) {
|
||||
// Вычисляем номер страницы
|
||||
uint32_t page_num = addr / PAGE_SIZE;
|
||||
|
||||
// Проверка границ
|
||||
if (page_num >= PAGE_COUNT) {
|
||||
printf("free_page: address out of range\n");
|
||||
return;
|
||||
}
|
||||
|
||||
// Вычисляем индекс байта и бита в битмапе
|
||||
uint32_t byte_idx = page_num / 8;
|
||||
uint32_t bit_idx = page_num % 8;
|
||||
|
||||
// Проверяем, не освобождаем ли уже свободную страницу
|
||||
if (!(page_bitmap[byte_idx] & (1 << bit_idx))) {
|
||||
printf("free_page: page already free\n");
|
||||
return;
|
||||
}
|
||||
|
||||
// Освобождаем страницу
|
||||
page_bitmap[byte_idx] &= ~(1 << bit_idx);
|
||||
clear_bit(page_num);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user