From 2aaa5926366ff85366c131911433ff55733f210e Mon Sep 17 00:00:00 2001 From: pointer-to-bios Date: Mon, 19 Feb 2024 01:47:16 +0800 Subject: [PATCH] =?UTF-8?q?=E8=B0=83=E6=95=B4=E5=88=86=E9=85=8D=E5=99=A8?= =?UTF-8?q?=E6=88=90=E5=91=98=EF=BC=9A=20=E7=A7=BB=E9=99=A4initialized?= =?UTF-8?q?=EF=BC=8C=E5=A2=9E=E5=8A=A0userspace?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- include/kernel/memm.h | 30 +++++++++++++++++++++--------- src/kernel/memm/memm.c | 9 ++++----- 2 files changed, 25 insertions(+), 14 deletions(-) diff --git a/include/kernel/memm.h b/include/kernel/memm.h index f522507..e83bbaa 100644 --- a/include/kernel/memm.h +++ b/include/kernel/memm.h @@ -35,9 +35,9 @@ * * 分配器的一对`分配`、`释放`函数指针。内核中可以根据情况使用多种不同的分配器来分配内存,`allocator`中提供一对此类型的变量,用于 * 动态绑定不同的分配器。 - * + * * 分配器在`kernel/memm/allocator/`中定义。 - * + * * 分配器**必须**实现的行为: * * **`memm_allocate_t`**: @@ -78,7 +78,11 @@ typedef void (*memm_free_t)(void *allocator, void *mem); * 在**内核镜像结尾**至`MEMM_ALLOC_ONLY_MEMORY`空间中,包含一个分配器`内核大分配器`。 * * 分配器指针**必须**使用内核地址。 - * + * + * @internal magic + * + * 分配器有效性由此检验,不为`MEMM_ALLOCATOR_MAGIC_NUM`说明获得了一个错误的分配器地址。 + * * @internal full * * 调用分配器的`allocate`方法后,在返回`nullptr`时会设为`true`。 @@ -88,6 +92,10 @@ typedef void (*memm_free_t)(void *allocator, void *mem); * * 进程标志服,表示此分配器所属的进程,为0代表属于内核。 * + * @internal userspace + * + * 若分配器不属于内核,此成员储存此分配器的用户空间地址。 + * * @internal type * * 分配器类型。在目录`include/kernel/memm/allocator`中对每个分配器分别定义一个唯一值。 @@ -107,17 +115,21 @@ typedef void (*memm_free_t)(void *allocator, void *mem); */ typedef struct __allocator_t { -#define MEMM_ALLOCATOR_MAGIC_NUM 0x271fe441 +#ifndef MEMM_ALLOCATOR_MAGIC +#define MEMM_ALLOCATOR_MAGIC 0x271fe441 +#endif + // 分配器有效性由此检验,不为`MEMM_ALLOCATOR_MAGIC_NUM`说明获得了一个错误的分配器地址。 + // 此值在编译时通过各种方式确定,若 u32 magic; - bool initialized; - // 调用分配器的`allocate`方法后,在返回`nullptr`时会设为`true`。 // 调用分配器的`free`方法时设为`false`。 bool full; // 进程标志服,表示此分配器所属的进程,为0代表属于内核。 usize pid; + // 若分配器不属于内核,此成员储存此分配器的用户空间地址。 + void *userspace; // 分配器类型。在目录`include/kernel/memm/allocator`中对每个分配器分别定义一个唯一值。 usize type; usize size; @@ -290,18 +302,18 @@ void *memm_user_allocate(usize size, usize pid); /** * @name memm_free - * + * * ```c * void memm_free(void *mem); * ``` - * + * * 释放内存。 */ void memm_free(void *mem); /** * @name find_fitable_pages - * + * * ```c * usize find_fitable_pages(usize page_count); * ``` diff --git a/src/kernel/memm/memm.c b/src/kernel/memm/memm.c index f2cbf71..513a7f5 100644 --- a/src/kernel/memm/memm.c +++ b/src/kernel/memm/memm.c @@ -77,8 +77,7 @@ memory_manager_t *memm_get_manager() allocator_t *memm_allocator_new(void *start, usize length, usize type, usize pid) { allocator_t *allocator = start; - allocator->magic = MEMM_ALLOCATOR_MAGIC_NUM; - allocator->initialized = true; + allocator->magic = MEMM_ALLOCATOR_MAGIC; allocator->full = false; allocator->pid = 0; allocator->size = length; @@ -91,14 +90,14 @@ allocator_t *memm_allocator_new(void *start, usize length, usize type, usize pid allocator->free = (memm_free_t)raw_allocator_free; break; default: - allocator->initialized = false; + allocator->magic = 0; break; } } void memm_allocator_destruct(allocator_t *allocator) { - allocator->initialized = false; + allocator->magic = 0; // TODO 从分配器树中删除这个分配器 KERNEL_TODO(); } @@ -226,7 +225,7 @@ void *memm_user_allocate(usize size, usize pid) void memm_free(void *mem) { allocator_t *allocator = memm_addr_get_allocator(mem); - if (allocator->magic != MEMM_ALLOCATOR_MAGIC_NUM) + if (allocator->magic != MEMM_ALLOCATOR_MAGIC) return; if (is_user_address((u64)mem)) { // TODO 对于用户空间的地址需要先转换到内核地址后释放