能够启动到init

This commit is contained in:
zhangzheng
2024-04-04 16:51:29 +00:00
parent 436c88f8ca
commit 8a6213adf4
99 changed files with 1211 additions and 632 deletions

View File

@@ -122,37 +122,47 @@ static void knl_init_2(void)
extern mword_t cpio_images;
umword_t ret_addr;
size_t size;
ret_addr = cpio_find_file(cpio_images, (umword_t)(-1), "init.elf");
init_thread = thread_create(&root_factory_get()->limit);
assert(init_thread);
init_task = task_create(&root_factory_get()->limit, FALSE);
assert(init_task);
#if IS_ENABLED(CONFIG_ELF_LAUNCH)
addr_t entry;
ret_addr = cpio_find_file(cpio_images, (umword_t)(-1), "init.elf", &size);
assert(ret_addr);
elf_load(ret_addr);
// init_thread = thread_create(&root_factory_get()->limit);
// assert(init_thread);
// init_task = task_create(&root_factory_get()->limit, FALSE);
// assert(init_task);
// app_info_t *app = app_info_get((void *)(CONFIG_KNL_TEXT_ADDR + CONFIG_INIT_TASK_OFFSET));
// // 申请init的ram内存
// assert(task_alloc_base_ram(init_task, &root_factory_get()->limit, app->i.ram_size + THREAD_MSG_BUG_LEN) >= 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;
elf_load(init_task, ret_addr, size, &entry);
thread_set_msg_bug(init_thread, NULL /*TODO:*/);
thread_user_pf_set(init_thread, (void *)(entry), NULL,
NULL, 0);
#else
app_info_t *app = app_info_get((void *)(CONFIG_KNL_TEXT_ADDR + CONFIG_INIT_TASK_OFFSET));
// 申请init的ram内存
assert(task_alloc_base_ram(init_task, &root_factory_get()->limit, app->i.ram_size + THREAD_MSG_BUG_LEN) >= 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_set_msg_bug(init_thread, (char *)(init_task->mm_space.mm_block) + app->i.ram_size);
// thread_bind(init_thread, &init_task->kobj);
// thread_user_pf_set(init_thread, (void *)(CONFIG_KNL_TEXT_ADDR + CONFIG_INIT_TASK_OFFSET), (void *)((umword_t)sp_addr_top - 8),
// init_task->mm_space.mm_block, 0);
// assert(obj_map_root(&init_thread->kobj, &init_task->obj_space, &root_factory_get()->limit, vpage_create3(KOBJ_ALL_RIGHTS, 0, THREAD_PROT)));
// assert(obj_map_root(&init_task->kobj, &init_task->obj_space, &root_factory_get()->limit, vpage_create3(KOBJ_ALL_RIGHTS, 0, TASK_PROT)));
// for (int i = FACTORY_PORT_START; i < FACTORY_PORT_END; i++)
// {
// kobject_t *kobj = global_get_kobj(i);
// if (kobj)
// {
// assert(obj_map_root(kobj, &init_task->obj_space, &root_factory_get()->limit, vpage_create3(KOBJ_ALL_RIGHTS, 0, i)));
// }
// }
// init_thread->sche.prio = 2;
// init_task->pid = 0;
// thread_ready(init_thread, FALSE);
thread_set_msg_bug(init_thread, (char *)(init_task->mm_space.mm_block) + app->i.ram_size);
thread_user_pf_set(init_thread, (void *)(CONFIG_KNL_TEXT_ADDR + CONFIG_INIT_TASK_OFFSET), (void *)((umword_t)sp_addr_top - 8),
init_task->mm_space.mm_block, 0);
#endif
thread_bind(init_thread, &init_task->kobj);
assert(obj_map_root(&init_thread->kobj, &init_task->obj_space, &root_factory_get()->limit, vpage_create3(KOBJ_ALL_RIGHTS, 0, THREAD_PROT)));
assert(obj_map_root(&init_task->kobj, &init_task->obj_space, &root_factory_get()->limit, vpage_create3(KOBJ_ALL_RIGHTS, 0, TASK_PROT)));
for (int i = FACTORY_PORT_START; i < FACTORY_PORT_END; i++)
{
kobject_t *kobj = global_get_kobj(i);
if (kobj)
{
assert(obj_map_root(kobj, &init_task->obj_space, &root_factory_get()->limit, vpage_create3(KOBJ_ALL_RIGHTS, 0, i)));
}
}
init_thread->sche.prio = 2;
init_task->pid = 0;
thread_ready(init_thread, FALSE);
#endif
}
INIT_STAGE2(knl_init_2);