mirror of
https://github.com/0Nera/BMOSP.git
synced 2024-11-22 08:31:23 +03:00
Compare commits
3 Commits
a93ca306ce
...
1c408d21d8
Author | SHA1 | Date | |
---|---|---|---|
|
1c408d21d8 | ||
|
d8fd702296 | ||
|
862e9b3328 |
@ -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);
|
||||||
|
14
kernel/mem.c
14
kernel/mem.c
@ -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,
|
||||||
|
Loading…
Reference in New Issue
Block a user