优化系统调用

This commit is contained in:
zhangzheng
2023-09-03 15:55:06 +08:00
parent a9969d7762
commit ad72f5e0da
28 changed files with 355 additions and 146 deletions

View File

@@ -23,41 +23,45 @@ int task_alloc_base_ram(task_t *tk, ram_limit_t *lim, size_t size)
return -EACCES;
}
// 申请init的ram内存
void *ram = mpu_ram_alloc(&tk->mm_space, lim, size);
void *ram = mpu_ram_alloc(&tk->mm_space, lim, size + THREAD_MSG_BUG_LEN);
if (!ram)
{
printk("申请进程内存失败.\n");
return -ENOMEM;
}
mm_space_set_ram_block(&tk->mm_space, ram, size);
printk("task alloc size is %d, base is 0x%x\n", size, ram);
mm_space_set_ram_block(&tk->mm_space, ram, size + THREAD_MSG_BUG_LEN);
printk("task alloc size is %d, base is 0x%x\n", size + THREAD_MSG_BUG_LEN, ram);
return 0;
}
static msg_tag_t task_syscall_func(kobject_t *kobj, ram_limit_t *ram, entry_frame_t *f)
task_t *thread_get_bind_task(thread_t *th)
{
return container_of(th->task, task_t, kobj);
}
static void task_syscall_func(kobject_t *kobj, syscall_prot_t sys_p, msg_tag_t in_tag, entry_frame_t *f)
{
task_t *cur_task = thread_get_current_task();
task_t *tag_task = container_of(kobj, task_t, kobj);
msg_tag_t tag = msg_tag_init(f->r[0]);
msg_tag_t tag = msg_tag_init3(0, 0, -EINVAL);
if (tag.prot != TASK_PROT)
if (sys_p.prot != TASK_PROT)
{
return msg_tag_init3(0, 0, -EINVAL);
f->r[0] = msg_tag_init3(0, 0, -EINVAL).raw;
return;
}
switch (tag.type)
switch (sys_p.op)
{
case TASK_OBJ_MAP:
{
kobject_t *source_kobj = obj_space_lookup_kobj(&cur_task->obj_space, f->r[1]);
if (!kobj)
if (!source_kobj)
{
tag = msg_tag_init3(0, 0, -ENOENT);
break;
}
int ret = obj_map(&tag_task->obj_space, f->r[2], source_kobj, ram);
int ret = obj_map(&tag_task->obj_space, f->r[2], source_kobj, tag_task->lim);
tag = msg_tag_init3(0, 0, ret);
}
@@ -89,7 +93,7 @@ static msg_tag_t task_syscall_func(kobject_t *kobj, ram_limit_t *ram, entry_fram
}
int ret = task_alloc_base_ram(tag_task, tag_task->lim, f->r[1]);
tag = msg_tag_init3(0, 0, ret);
f->r[1] = (umword_t)(tag_task->mm_space.mm_block);
f->r[1] = (umword_t)(tag_task->mm_space.mm_block);
spinlock_set(&tag_task->kobj.lock, status);
}
break;
@@ -97,7 +101,7 @@ static msg_tag_t task_syscall_func(kobject_t *kobj, ram_limit_t *ram, entry_fram
break;
}
return tag;
f->r[0] = tag.raw;
}
void task_init(task_t *task, ram_limit_t *ram, int is_knl)