增加内存管理,但是还存在问题

This commit is contained in:
zhangzheng
2024-04-06 16:08:27 +00:00
parent 8a6213adf4
commit dd5886e642
62 changed files with 2597 additions and 116 deletions

View File

@@ -63,7 +63,7 @@ long be_ioctl(long fd, long req, void *args);
long be_set_tid_address(int *val);
long be_set_thread_area(void *p);
umword_t be_munmap(void *start, size_t len);
umword_t be_mmap2(void *start,
umword_t be_mmap(void *start,
size_t len,
long prot,
long flags,
@@ -71,7 +71,7 @@ umword_t be_mmap2(void *start,
long _offset);
long be_clock_gettime(clockid_t clk_id, struct timespec *tp);
long sys_mmap2(va_list ap);
long sys_mmap(va_list ap);
long sys_set_tid_address(va_list ap);
long sys_set_thread_area(va_list ap);
void sys_exit(va_list ap);

View File

@@ -0,0 +1,79 @@
#include "u_types.h"
#include "syscall_backend.h"
#include "u_prot.h"
#include "u_ipc.h"
#include "u_mm.h"
#include "u_app.h"
#include "cons_cli.h"
#include "u_arch.h"
#include "u_vmam.h"
#include <assert.h>
#undef hidden
#undef weak
#define hidden
#include <pthread_impl.h>
umword_t be_mmap(void *start,
size_t len,
long prot,
long flags,
long fd,
long _offset)
{
addr_t addr;
if (len == 0)
{
return 0;
}
len = ALIGN(len, PAGE_SIZE);
// if ((len & ((1UL << CONFIG_PAGE_SHIFT) - 1)) != 0)
// {
// return -EINVAL;
// }
if (fd != -1)
{
return -ENOSYS;
}
msg_tag_t tag;
tag = u_vmam_alloc(VMA_PROT, vma_addr_create(0xf /*TODO:*/, 0, 0),
len, 0, &addr);
if (msg_tag_get_val(tag) < 0)
{
return (umword_t)msg_tag_get_val(tag);
}
return addr;
}
long sys_mmap(va_list ap)
{
void *start;
size_t len;
long prot;
long flags;
long fd;
long _offset;
ARG_6_BE(ap, start, void *, len, size_t, prot, long, flags, long, fd, long, _offset, long);
return be_mmap(start, len, prot, flags, fd, _offset);
}
umword_t be_munmap(void *start, size_t len)
{
if ((len & (CONFIG_PAGE_SHIFT - 1)) != 0)
{
return -EINVAL;
}
msg_tag_t tag;
tag = u_vmam_free(VMA_PROT, (addr_t)start, len);
return msg_tag_get_val(tag);
}
long sys_munmap(va_list ap)
{
void *start;
size_t len;
ARG_2_BE(ap, len, size_t, start, void *);
return be_munmap(start, len);
}

View File

@@ -7,14 +7,14 @@ typedef long (*sys_call_func)(va_list ap);
static const sys_call_func sys_call_list[] = {
// TODO: add syscall func pointer.
// [SYS_munmap] = sys_munmap,
// [SYS_mmap2] = sys_mmap2,
[SYS_read] = sys_be_read, //
[SYS_write] = sys_be_write, //
[SYS_writev] = sys_be_writev, //
[SYS_ioctl] = sys_be_ioctl, //
[SYS_set_tid_address] = sys_set_tid_address, //
// [__ARM_NR_set_tls] = sys_set_thread_area, //
[SYS_munmap] = sys_munmap,
[SYS_mmap] = sys_mmap,
[SYS_read] = sys_be_read,
[SYS_write] = sys_be_write,
[SYS_writev] = sys_be_writev,
[SYS_ioctl] = sys_be_ioctl,
[SYS_set_tid_address] = sys_set_tid_address,
// [__ARM_NR_set_tls] = sys_set_thread_area,
// [SYS_exit] = be_exit,
};

View File

@@ -7,9 +7,6 @@
#include <fd_map.h>
#include <string.h>
// #define CONFIG_FD_MAP_ROW_CN 16
// #define CONFIG_FD_MAP_ROW_NR 16
#define FD_MAP_TOTAL (CONFIG_FD_MAP_ROW_CN * CONFIG_FD_MAP_ROW_NR)
typedef struct fd_map_row

View File

@@ -14,6 +14,7 @@
#include <u_util.h>
#include "fd_map.h"
#include "u_sleep.h"
// AUTO_CALL(101)
void fs_backend_init(void)
{
assert(fd_map_alloc(0, 0, FD_TTY) >= 0);

View File

@@ -1,6 +1,8 @@
#pragma once
#include "u_types.h"
#include "u_arch_hard.h"
#define MK_PAGE_SIZE (1UL << CONFIG_PAGE_SHIFT)
#define WORD_BYTES (sizeof(void *))
#define WORD_BITS (WORD_BYTES * 8)

View File

@@ -13,7 +13,8 @@ enum kobj_prot
SYS_PROT,
FUTEX_PROT,
IRQ_PROT,
SHARE_MEM_PROT,
SHARE_MEM_PROT, // 10
VMA_PROT,
MAX_PROT,
};

View File

@@ -0,0 +1,32 @@
#pragma once
#include <u_types.h>
#include <u_prot.h>
typedef union vma_addr
{
umword_t raw;
struct
{
umword_t prot : 4;
umword_t flags : 4;
umword_t resv : 4;
umword_t addr : (sizeof(void *) * 8 - CONFIG_PAGE_SHIFT);
};
} vma_addr_t;
static inline vma_addr_t vam_addr_create_raw(umword_t raw)
{
return (vma_addr_t){
.raw = raw,
};
}
static inline vma_addr_t vma_addr_create(uint8_t prot, uint8_t flags, umword_t addr)
{
return (vma_addr_t){
.prot = prot,
.flags = flags,
.resv = 0,
.addr = addr >> CONFIG_PAGE_SHIFT,
};
}
msg_tag_t u_vmam_alloc(obj_handler_t obj, vma_addr_t addr, size_t size, addr_t paddr, addr_t *vaddr);
msg_tag_t u_vmam_free(obj_handler_t obj, addr_t addr, size_t size);

View File

@@ -183,6 +183,10 @@ msg_tag_t thread_run(obj_handler_t obj, uint8_t prio)
0,
0,
0);
asm __volatile__(""
:
:
: ARCH_REG_0);
msg_tag_t tag = msg_tag_init(r0);
return tag;

View File

@@ -0,0 +1,52 @@
#include <u_types.h>
#include <u_prot.h>
#include <u_vmam.h>
enum
{
VMA_ALLOC,
VMA_FREE,
};
msg_tag_t u_vmam_alloc(obj_handler_t obj, vma_addr_t addr, size_t size, addr_t paddr, addr_t *vaddr)
{
register volatile umword_t r0 asm(ARCH_REG_0);
register volatile umword_t r1 asm(ARCH_REG_1);
mk_syscall(syscall_prot_create4(VMA_ALLOC, VMA_PROT, obj, FALSE).raw,
addr.raw,
size,
paddr,
0,
0,
0);
asm __volatile__(""
:
:
: ARCH_REG_0, ARCH_REG_1);
if (vaddr)
{
*vaddr = r1;
}
return msg_tag_init(r0);
}
msg_tag_t u_vmam_free(obj_handler_t obj, addr_t addr, size_t size)
{
register volatile umword_t r0 asm(ARCH_REG_0);
mk_syscall(syscall_prot_create4(VMA_ALLOC, VMA_PROT, obj, FALSE).raw,
addr,
size,
0,
0,
0,
0);
asm __volatile__(""
:
:
: ARCH_REG_0);
return msg_tag_init(r0);
}

View File

@@ -16,7 +16,7 @@
#include <u_thread_util.h>
#include <u_thread.h>
static ATTR_ALIGN(8) uint8_t cons_stack[512];
static ATTR_ALIGN(8) uint8_t cons_stack[4096];
// static uint8_t cons_msg_buf[MSG_BUG_LEN];
static cons_t cons_obj;
static obj_handler_t cons_th;
@@ -48,9 +48,9 @@ void console_init(void)
{
cons_svr_obj_init(&cons_obj);
meta_reg_svr_obj(&cons_obj.svr, CONS_PROT);
u_thread_create(&cons_th, (char *)cons_stack + sizeof(cons_stack), NULL, console_read_func);
u_thread_create(&cons_th, (char *)cons_stack + sizeof(cons_stack) - 8, NULL, console_read_func);
u_thread_run(cons_th, 3);
// printf("cons svr init...\n");
ulog_write_str(LOG_PROT, "cons svr init...\n");
}
/**
* @brief 向控制台写入数据

View File

@@ -35,8 +35,9 @@
static void test(void)
{
printf_test();
malloc_test();
#if 0
printf_test();
mpu_test();
sharea_mem_test();
ulog_test();
@@ -71,8 +72,8 @@ int main(int argc, char *args[])
test();
ret = parse_cfg(DEFAULT_INIT_CFG, env);
printf("run app num is %d.\n", ret);
// ret = parse_cfg(DEFAULT_INIT_CFG, env);
// printf("run app num is %d.\n", ret);
namespace_loop();
return 0;
}

View File

@@ -0,0 +1,13 @@
#include <malloc.h>
#include <string.h>
#include <assert.h>
void malloc_test(void)
{
#define TEST_MEM_SIZE 1024 * 1024 * 32
void *mem = malloc(TEST_MEM_SIZE);
assert(mem);
memset(mem, 0, TEST_MEM_SIZE);
free(mem);
#undef TEST_MEM_SIZE
}

View File

@@ -16,6 +16,4 @@ void mm_test(void)
mm_free_page(MM_PROT, mem1, 2);
mm_free_page(MM_PROT, mem, 2);
printf("mm test success.\n");
// memset(mem, 0, 512);
// memset(mem1, 0, 512);
}

View File

@@ -18,3 +18,4 @@ void pthread_lock_test(void);
int pthread_cond_lock_test(void);
void sharea_mem_test(void);
void ns_test(void);
void malloc_test(void);