增加内存管理,但是还存在问题
This commit is contained in:
@@ -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);
|
||||
|
||||
79
mkrtos_user/lib/libc_backend/src/aarch64/mm_backend.c
Normal file
79
mkrtos_user/lib/libc_backend/src/aarch64/mm_backend.c
Normal 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);
|
||||
}
|
||||
@@ -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,
|
||||
};
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -13,7 +13,8 @@ enum kobj_prot
|
||||
SYS_PROT,
|
||||
FUTEX_PROT,
|
||||
IRQ_PROT,
|
||||
SHARE_MEM_PROT,
|
||||
SHARE_MEM_PROT, // 10
|
||||
VMA_PROT,
|
||||
MAX_PROT,
|
||||
};
|
||||
|
||||
|
||||
32
mkrtos_user/lib/sys/inc/u_vmam.h
Normal file
32
mkrtos_user/lib/sys/inc/u_vmam.h
Normal 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);
|
||||
@@ -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;
|
||||
|
||||
52
mkrtos_user/lib/sys/src/u_vmam.c
Normal file
52
mkrtos_user/lib/sys/src/u_vmam.c
Normal 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);
|
||||
}
|
||||
@@ -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 向控制台写入数据
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
13
mkrtos_user/server/init/src/test/malloc_test.c
Normal file
13
mkrtos_user/server/init/src/test/malloc_test.c
Normal 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
|
||||
}
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user