Compare commits

...

3 Commits

Author SHA1 Message Date
Aren Elchinyan
1c408d21d8 Небольшие исправления комментариев
В рамках ревью pull-а #15
2024-09-21 21:53:08 +03:00
Aren Elchinyan
d8fd702296
Merge pull request #15 from avadov/master
.
2024-09-21 21:46:55 +03:00
Konstantin Avadov
862e9b3328 . 2024-09-21 21:37:43 +03:00
2 changed files with 22 additions and 2 deletions

View File

@ -16,9 +16,15 @@
#define BLOCK_SIZE 4096 #define BLOCK_SIZE 4096
#define HHDM_OFFSET (hhdm_request.response->offset) #define HHDM_OFFSET (hhdm_request.response->offset)
// Вывод состояния всех блоков памяти
void mem_dump_memory( ); void mem_dump_memory( );
// Вывод размеров занятой и освобожденной памяти
void mem_get_stat( ); void mem_get_stat( );
// Инициализация менеджера памяти
void mem_init( ); void mem_init( );
void *mem_alloc(size_t size); void *mem_alloc(size_t size);
void mem_add_block(void *addr, size_t size); void mem_add_block(void *addr, size_t size);
void mem_free(void *addr); void mem_free(void *addr);
@ -28,4 +34,4 @@ void mem_frame_free(void *ptr, uint64_t frames);
void *mem_frame_calloc(uint64_t frames); void *mem_frame_calloc(uint64_t frames);
void mem_merge_all_blocks( ); void mem_merge_all_blocks( );
#endif // mem.h #endif // mem.h

View File

@ -14,18 +14,29 @@
#include <stdbool.h> #include <stdbool.h>
#include <tool.h> #include <tool.h>
// Запрос карты памяти от загрузчика
static volatile struct limine_memmap_request memmap_request = { .id = LIMINE_MEMMAP_REQUEST, static volatile struct limine_memmap_request memmap_request = { .id = LIMINE_MEMMAP_REQUEST,
.revision = 0, .revision = 0,
.response = (struct limine_memmap_response *)0 }; .response = (struct limine_memmap_response *)0 };
// Запрос к загрузчику Limine о виртуальном адресе Higher Half
static volatile struct limine_hhdm_request hhdm_request = { .id = LIMINE_HHDM_REQUEST, static volatile struct limine_hhdm_request hhdm_request = { .id = LIMINE_HHDM_REQUEST,
.revision = 0, .revision = 0,
.response = (struct limine_hhdm_response *)0 }; .response = (struct limine_hhdm_response *)0 };
// Менеджер памяти выделяет память отдельными участками (блоками). Информация обо
// всех выделенных блоках хранится в виде односвязного списка структур mem_entry_t.
// Каждая mem_entry_t содержит информацию об отдельном выделенном блоке памяти
struct mem_entry { struct mem_entry {
// Ссылка на следующий элемент списка
struct mem_entry *next; struct mem_entry *next;
// Флаг, помечающий память как освобожденную
bool free; bool free;
// Поток, владеющий памятью
uint64_t task_id; uint64_t task_id;
// Размер блока
uint64_t size; uint64_t size;
// Адрес блока
uint8_t data[0]; uint8_t data[0];
}; };
@ -55,13 +66,16 @@ static const char memory_types[8][82] = { "Доступно", "Зарезе
"ACPI NVS", "Плохая память", "Загрузчик, можно освободить", "ACPI NVS", "Плохая память", "Загрузчик, можно освободить",
"Ядро и модули", "Буфер кадра" }; "Ядро и модули", "Буфер кадра" };
// Ответ от загрузчика Limine о состоянии памяти
static struct limine_memmap_response *memmap_response; static struct limine_memmap_response *memmap_response;
// Описание перого выделенного блока памяти - начало списка с данными о памяти
static mem_entry_t *first_node; static mem_entry_t *first_node;
void mem_dump_memory( ) { void mem_dump_memory( ) {
mem_entry_t *curr = first_node; mem_entry_t *curr = first_node;
// Проход по всему списку записей о выделенных блоках памяти
while (curr) { while (curr) {
if (curr->next) { if (curr->next) {
LOG("->0x%x | %u килобайт | %s | 0x%x | поток %u\n", &curr->data, (curr->size) / 1024, LOG("->0x%x | %u килобайт | %s | 0x%x | поток %u\n", &curr->data, (curr->size) / 1024,
@ -355,4 +369,4 @@ void mem_init( ) {
LOG("%u / %u блоков доступно\n", bitmap_available, bitmap_limit); LOG("%u / %u блоков доступно\n", bitmap_available, bitmap_limit);
#endif #endif
} }