支持obj map & 与更多用户态接口支持
This commit is contained in:
3
.vscode/settings.json
vendored
3
.vscode/settings.json
vendored
@@ -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,
|
||||
}
|
||||
@@ -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);
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
@@ -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);
|
||||
|
||||
@@ -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:
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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)
|
||||
{
|
||||
|
||||
@@ -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(".");
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
@@ -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))
|
||||
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user