支持obj map & 与更多用户态接口支持

This commit is contained in:
zhangzheng
2023-08-28 23:54:33 +08:00
parent dadfda135c
commit 24ed049af7
16 changed files with 214 additions and 33 deletions

View File

@@ -110,7 +110,8 @@
"uio.h": "c",
"fs_backend.h": "c",
"mm_space.h": "c",
"mm_page.h": "c"
"mm_page.h": "c",
"u_task.h": "c"
},
"cortex-debug.showRTOS": false,
}

View File

@@ -84,14 +84,14 @@ void MemManage_Handler(void)
task_t *cur_task = thread_get_current_task();
// printk("%s\n", __FUNCTION__);
// if (SCB->CFSR & 0x1)
// {
// printk("指令访问错误\n");
// }
// if (SCB->CFSR & 2)
// {
// printk("数据访问错误\n");
// }
if (SCB->CFSR & 0x1)
{
printk("指令访问错误\n");
}
if (SCB->CFSR & 2)
{
printk("数据访问错误\n");
}
if (SCB->CFSR & 128)
{
fault_addr = (addr_t)(SCB->MMFAR);

View File

@@ -3,5 +3,6 @@
#include "kobject.h"
#include "obj_space.h"
bool_t obj_map_root(kobject_t *kobj, obj_space_t *obj_space, ram_limit_t *ram, obj_addr_t addr);
int obj_map(obj_space_t *obj_space, obj_handler_t inx, kobject_t *kobj, ram_limit_t *ram);
void obj_unmap(obj_space_t *obj_space, obj_handler_t inx, kobj_del_list_t *del_list);
void obj_unmap_all(obj_space_t *obj_space, kobj_del_list_t *del_list);

View File

@@ -13,13 +13,15 @@ typedef struct region_info
umword_t rbar; //!< mpu保护寄存器信息
umword_t rasr; //!< mpu保护寄存器信息
int16_t region_inx;
uint8_t region; //!< 区域禁止信息
uint8_t region; //!< 区域禁止信息
} region_info_t;
typedef struct mm_space
{
region_info_t pt_regions[REGION_NUM];
mm_pages_t mm_pages;
region_info_t pt_regions[REGION_NUM]; //!< mpu内存保护块
mm_pages_t mm_pages; //!< 模拟分页内存
void *mm_block; //!< task 的私有内存块
size_t mm_block_size; //!< 私有内存块的大小
} mm_space_t;
enum region_rights
@@ -33,4 +35,10 @@ region_info_t *mm_space_alloc_pt_region(mm_space_t *m_space);
void mm_space_free_pt_region(mm_space_t *m_space, region_info_t *ri);
void mm_space_init(mm_space_t *mm_space, int is_knl);
bool_t mm_space_add(mm_space_t *m_space, umword_t addr, umword_t size, uint8_t attrs);
bool_t mm_space_add(mm_space_t *m_space, umword_t addr, umword_t size, uint8_t attrs);
static inline void mm_space_set_ram_block(mm_space_t *mm_space, void *mem, size_t size)
{
mm_space->mm_block = mem;
mm_space->mm_block_size = size;
}

View File

@@ -21,3 +21,4 @@ typedef struct task
task_t *thread_get_current_task(void);
void task_init(task_t *task, ram_limit_t *ram, int is_knl);
task_t *task_create(ram_limit_t *lim, int is_knl);
int task_alloc_base_ram(task_t *tk, ram_limit_t *lim, size_t size);

View File

@@ -82,6 +82,7 @@ factory_syscall(kobject_t *kobj, ram_limit_t *ram, entry_frame_t *f)
{
return msg_tag_init3(0, 0, -EPROTO);
}
ram = task->lim;
switch (tag.type)
{
case FACTORY_CREATE_KOBJ:

View File

@@ -16,7 +16,29 @@ bool_t obj_map_root(kobject_t *kobj, obj_space_t *obj_space, ram_limit_t *ram, o
slist_add(&kobj->mappable.node, &map->node);
return TRUE;
}
int obj_map(obj_space_t *obj_space, obj_handler_t inx, kobject_t *insert_kobj, ram_limit_t *ram)
{
obj_map_entry_t *entry = NULL;
entry = obj_space_lookup(obj_space, inx);
if (entry)
{
if (obj_map_kobj_get(entry->obj))
{
return -EACCES;
}
}
obj_map_entry_t *map = obj_space_insert(obj_space, ram, insert_kobj, inx);
if (!map)
{
return -ENOMEM;
}
insert_kobj->mappable.map_cnt++;
slist_add(&insert_kobj->mappable.node, &map->node);
return 0;
}
void obj_unmap(obj_space_t *obj_space, obj_handler_t inx, kobj_del_list_t *del_list)
{
obj_map_entry_t *entry = NULL;

View File

@@ -4,14 +4,34 @@
#include "init.h"
#include "map.h"
#include "thread.h"
#include "misc.h"
enum task_op_code
{
TASK_OBJ_MAP,
TASK_OBJ_UNMAP,
TASK_ALLOC_RAM_BASE,
};
static bool_t task_put(kobject_t *kobj);
static void task_release_stage1(kobject_t *kobj);
static void task_release_stage2(kobject_t *kobj);
int task_alloc_base_ram(task_t *tk, ram_limit_t *lim, size_t size)
{
if (tk->mm_space.mm_block)
{
return -EACCES;
}
// 申请init的ram内存
void *ram = mpu_ram_alloc(&tk->mm_space, lim, size);
if (!ram)
{
printk("申请进程内存失败.\n");
return -ENOMEM;
}
mm_space_set_ram_block(&tk->mm_space, ram, size);
return 0;
}
static msg_tag_t task_syscall_func(kobject_t *kobj, ram_limit_t *ram, entry_frame_t *f)
{
task_t *cur_task = thread_get_current_task();
@@ -26,8 +46,20 @@ static msg_tag_t task_syscall_func(kobject_t *kobj, ram_limit_t *ram, entry_fram
switch (tag.type)
{
case TASK_OBJ_MAP:
/* code */
break;
{
kobject_t *source_kobj = obj_space_lookup_kobj(&cur_task->obj_space, f->r[1]);
if (!kobj)
{
tag = msg_tag_init3(0, 0, -ENOENT);
break;
}
int ret = obj_map(&tag_task->obj_space, f->r[2], source_kobj, ram);
tag = msg_tag_init3(0, 0, ret);
}
break;
case TASK_OBJ_UNMAP:
{
kobject_t *del_kobj;
@@ -41,6 +73,12 @@ static msg_tag_t task_syscall_func(kobject_t *kobj, ram_limit_t *ram, entry_fram
cpulock_set(status);
}
break;
case TASK_ALLOC_RAM_BASE:
{
tag = msg_tag_init3(0, 0, task_alloc_base_ram(tag_task, tag_task->lim, f->r[1]));
f->r[1] = (umword_t)(tag_task->mm_space.mm_block);
}
break;
default:
break;
}
@@ -63,6 +101,8 @@ void task_init(task_t *task, ram_limit_t *ram, int is_knl)
task->kobj.put_func = task_put;
task->kobj.stage_1_func = task_release_stage1;
task->kobj.stage_2_func = task_release_stage2;
mm_space_add(&task->mm_space, KNL_TEXT, 64 * 1024 * 1024, REGION_RO); // TODO:
}
static bool_t task_put(kobject_t *kobj)
@@ -85,6 +125,7 @@ static void task_release_stage2(kobject_t *kobj)
kobj_del_list_t kobj_list;
task_t *cur_tk = thread_get_current_task();
mm_limit_free_align(tk->lim, tk->mm_space.mm_block, tk->mm_space.mm_block_size);
mm_limit_free(tk->lim, tk);
if (cur_tk == tk)
{

View File

@@ -54,18 +54,12 @@ static void knl_init_2(void)
app_info_t *app = app_info_get((void *)(KNL_TEXT + INIT_OFFSET));
// 申请init的ram内存
void *ram = mpu_ram_alloc(&init_task->mm_space, &root_factory_get()->limit, app->i.ram_size);
if (!ram)
{
printk("申请init进程内存失败.\n");
assert(ram);
}
mm_space_add(&init_task->mm_space, KNL_TEXT, 64*1024*1024, REGION_RO);
void *sp_addr = (char *)ram + app->i.stack_offset - app->i.data_offset;
assert(task_alloc_base_ram(init_task, &root_factory_get()->limit, app->i.ram_size) >= 0);
void *sp_addr = (char *)init_task->mm_space.mm_block + app->i.stack_offset - app->i.data_offset;
void *sp_addr_top = (char *)sp_addr + app->i.stack_size;
thread_bind(init_thread, &init_task->kobj);
thread_user_pf_set(init_thread, (void *)(KNL_TEXT + INIT_OFFSET), sp_addr_top, ram);
thread_user_pf_set(init_thread, (void *)(KNL_TEXT + INIT_OFFSET), sp_addr_top, init_task->mm_space.mm_block);
assert(obj_map_root(&init_thread->kobj, &init_task->obj_space, &root_factory_get()->limit, THREAD_PROT));
assert(obj_map_root(&init_task->kobj, &init_task->obj_space, &root_factory_get()->limit, TASK_PROT));
for (int i = FACTORY_PORT_START; i < FACTORY_PORT_END; i++)
@@ -112,6 +106,7 @@ void start_kernel(void)
thread_sched();
cli();
while (1);
// printk(".");
while (1)
;
// printk(".");
}

View File

@@ -2,4 +2,5 @@
#include "u_types.h"
msg_tag_t factory_create_thread(obj_handler_t obj, obj_handler_t tgt_obj_handler);
msg_tag_t factory_create_thread(obj_handler_t obj, obj_handler_t tgt_obj_handler);
msg_tag_t factory_create_task(obj_handler_t obj, obj_handler_t tgt_obj_handler);

View File

@@ -30,5 +30,5 @@ typedef struct msg_tag
msg_tag_init(((umword_t)(t)&0xf) | (((umword_t)(t2)&0xff) << 4) | (((umword_t)(p)) << 12))
#define msg_tag_get_prot(tag) \
((mword_t)((tag).prot))
((int16_t)((tag).prot))

View File

@@ -2,4 +2,6 @@
#include "u_prot.h"
#include "u_types.h"
msg_tag_t task_map(obj_handler_t dst_task, obj_handler_t src_obj, obj_handler_t dst_obj);
msg_tag_t task_unmap(obj_handler_t task_han, obj_handler_t obj);
msg_tag_t task_alloc_ram_base(obj_handler_t task_han, umword_t size, addr_t *alloc_addr);

View File

@@ -10,6 +10,7 @@ typedef umword_t ptr_t;
typedef char bool_t;
typedef unsigned long obj_addr_t;
typedef unsigned long obj_handler_t;
typedef umword_t addr_t;
#ifndef NULL
#define NULL ((void *)0)
#endif

View File

@@ -13,5 +13,19 @@ msg_tag_t factory_create_thread(obj_handler_t obj, obj_handler_t tgt_obj_handler
0);
msg_tag_t tag = msg_tag_init(r0);
return tag;
}
msg_tag_t factory_create_task(obj_handler_t obj, obj_handler_t tgt_obj_handler)
{
register volatile umword_t r0 asm("r0");
syscall(obj, msg_tag_init3(0, 2, FACTORY_PROT).raw,
TASK_PROT,
tgt_obj_handler,
0,
0,
0);
msg_tag_t tag = msg_tag_init(r0);
return tag;
}

View File

@@ -1,12 +1,28 @@
#include "u_types.h"
#include "u_prot.h"
#include "u_task.h"
enum task_op_code
{
TASK_OBJ_MAP,
TASK_OBJ_UNMAP,
TASK_ALLOC_RAM_BASE,
};
msg_tag_t task_map(obj_handler_t dst_task, obj_handler_t src_obj, obj_handler_t dst_obj)
{
register volatile umword_t r0 asm("r0");
syscall(dst_task, msg_tag_init3(TASK_OBJ_MAP, 2, TASK_PROT).raw,
src_obj,
dst_obj,
0,
0,
0);
msg_tag_t tag = msg_tag_init(r0);
return tag;
}
msg_tag_t task_unmap(obj_handler_t task_han, obj_handler_t obj)
{
register volatile umword_t r0 asm("r0");
@@ -21,3 +37,21 @@ msg_tag_t task_unmap(obj_handler_t task_han, obj_handler_t obj)
return tag;
}
msg_tag_t task_alloc_ram_base(obj_handler_t task_han, umword_t size, addr_t *alloc_addr)
{
register volatile umword_t r0 asm("r0");
register volatile umword_t r1 asm("r1");
syscall(task_han, msg_tag_init3(TASK_ALLOC_RAM_BASE, 1, TASK_PROT).raw,
size,
0,
0,
0,
0);
if (alloc_addr)
{
*alloc_addr = r1;
}
return msg_tag_init(r0);
}

View File

@@ -40,21 +40,75 @@ void thread_test_func2(void)
}
static __attribute__((aligned(8))) uint8_t val[1024];
static __attribute__((aligned(8))) uint8_t val1[1024];
typedef struct app_info
{
const char d[32];
const char magic[8];
union
{
struct exec_head_info
{
umword_t ram_size;
umword_t heap_offset;
umword_t stack_offset;
umword_t heap_size;
umword_t stack_size;
umword_t data_offset;
umword_t bss_offset;
umword_t got_start;
umword_t got_end;
umword_t rel_start;
umword_t rel_end;
umword_t text_start;
} i;
const char d1[128];
};
const char dot_text[];
} app_info_t;
void factory_test(void)
{
// void *mem = mm_alloc_page(MM_PROT, 4, REGION_RWX);
// assert(mem);
// memset(mem, 0, 2048);
factory_create_thread(FACTORY_PROT, 11);
msg_tag_t tag = factory_create_thread(FACTORY_PROT, 11);
if (msg_tag_get_prot(tag) < 0)
{
printf("factory_create_thread no memory\n");
return;
}
#if 0
thread_exec_regs(11, (umword_t)thread_test_func, (umword_t)val + 1024, RAM_BASE());
thread_bind_task(11, TASK_PROT);
thread_run(11);
#if 1
factory_create_thread(FACTORY_PROT, 10);
thread_exec_regs(10, (umword_t)thread_test_func2, (umword_t)val1 + 1024, RAM_BASE());
thread_bind_task(10, TASK_PROT);
thread_run(10);
#else
app_info_t *app = (app_info_t *)0x8014000;
umword_t ram_base;
tag = factory_create_task(FACTORY_PROT, 10);
if (msg_tag_get_prot(tag) < 0)
{
printf("factory_create_task no memory\n");
return;
}
tag = task_alloc_ram_base(10, app->i.ram_size, &ram_base);
if (msg_tag_get_prot(tag) < 0)
{
printf("task_alloc_ram_base no memory\n");
return;
}
task_map(10, LOG_PROT, LOG_PROT);
void *sp_addr = (char *)ram_base + app->i.stack_offset - app->i.data_offset;
void *sp_addr_top = (char *)sp_addr + app->i.stack_size;
thread_exec_regs(11, (umword_t)0x8014000, (umword_t)sp_addr_top, ram_base);
thread_bind_task(11, 10);
thread_run(11);
#endif
}
void mpu_test(void)
@@ -75,18 +129,23 @@ void printf_test(void)
float a = 1.1;
float b = 1.2;
float c = a + b;
printf("%c %d %f\n", 'a', 1234, 1.1);
// printf("%c %d %f\n", 'a', 1234, 1.1);
// c = c;
// printf("%c %d %lf\n", 'a', 1234, 1.1); 浮点打印有问题
}
int main(int argc, char *args[])
{
ulog_write_str(LOG_PROT, "init..\n");
factory_test();
#if 0
mm_test();
mpu_test();
ulog_test();
#endif
printf_test();
printf("exit init.\n");
task_unmap(TASK_PROT, TASK_PROT);
while (1)
;
// task_unmap(TASK_PROT, TASK_PROT);
return 0;
}