pid管理修正
This commit is contained in:
@@ -27,3 +27,4 @@ void task_init(task_t *task, ram_limit_t *ram, int is_knl);
|
|||||||
task_t *task_create(ram_limit_t *lim, 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);
|
int task_alloc_base_ram(task_t *tk, ram_limit_t *lim, size_t size);
|
||||||
void task_kill(task_t *tk);
|
void task_kill(task_t *tk);
|
||||||
|
int task_set_pid(task_t *task, pid_t pid);
|
||||||
|
|||||||
@@ -104,6 +104,20 @@ static int task_lock_2(spinlock_t *sp0, spinlock_t *sp1, int *st0, int *st1)
|
|||||||
}
|
}
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
int task_set_pid(task_t *task, pid_t pid)
|
||||||
|
{
|
||||||
|
task_t *cur_task = thread_get_current_task();
|
||||||
|
|
||||||
|
if (cur_task->pid == 0)
|
||||||
|
{
|
||||||
|
task->pid = pid;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
return -EACCES;
|
||||||
|
}
|
||||||
|
}
|
||||||
static void task_syscall_func(kobject_t *kobj, syscall_prot_t sys_p, msg_tag_t in_tag, entry_frame_t *f)
|
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 *cur_task = thread_get_current_task();
|
||||||
@@ -186,15 +200,7 @@ static void task_syscall_func(kobject_t *kobj, syscall_prot_t sys_p, msg_tag_t i
|
|||||||
break;
|
break;
|
||||||
case TASK_SET_PID:
|
case TASK_SET_PID:
|
||||||
{
|
{
|
||||||
if (tag_task->pid == (pid_t)(-1))
|
tag = msg_tag_init4(0, 0, 0, task_set_pid(tag_task, f->r[0]));
|
||||||
{
|
|
||||||
tag_task->pid = f->r[0];
|
|
||||||
tag = msg_tag_init4(0, 0, 0, 0);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
tag = msg_tag_init4(0, 0, 0, -EACCES);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case TASK_GET_PID:
|
case TASK_GET_PID:
|
||||||
|
|||||||
@@ -70,6 +70,7 @@ static void knl_init_2(void)
|
|||||||
void *sp_addr = (char *)init_task->mm_space.mm_block + app->i.stack_offset - app->i.data_offset;
|
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;
|
void *sp_addr_top = (char *)sp_addr + app->i.stack_size;
|
||||||
|
|
||||||
|
task_set_pid(&init_task, 0);
|
||||||
thread_set_msg_bug(init_thread, (char *)(init_task->mm_space.mm_block) + app->i.ram_size);
|
thread_set_msg_bug(init_thread, (char *)(init_task->mm_space.mm_block) + app->i.ram_size);
|
||||||
thread_bind(init_thread, &init_task->kobj);
|
thread_bind(init_thread, &init_task->kobj);
|
||||||
thread_user_pf_set(init_thread, (void *)(KNL_TEXT + INIT_OFFSET), (void *)((umword_t)sp_addr_top - 8),
|
thread_user_pf_set(init_thread, (void *)(KNL_TEXT + INIT_OFFSET), (void *)((umword_t)sp_addr_top - 8),
|
||||||
|
|||||||
@@ -61,7 +61,6 @@ int main(int argc, char *args[])
|
|||||||
|
|
||||||
ulog_write_str(LOG_PROT, "init..\n");
|
ulog_write_str(LOG_PROT, "init..\n");
|
||||||
test();
|
test();
|
||||||
task_set_pid(TASK_THIS, 0);
|
|
||||||
env = u_get_global_env();
|
env = u_get_global_env();
|
||||||
rpc_meta_init(THREAD_MAIN, &env->ns_hd);
|
rpc_meta_init(THREAD_MAIN, &env->ns_hd);
|
||||||
namespace_init();
|
namespace_init();
|
||||||
|
|||||||
Reference in New Issue
Block a user