finish exec3.2
This commit is contained in:
parent
b83368fb1f
commit
61fad2c531
@ -247,17 +247,21 @@ void process_create_root(char *bin_name)
|
|||||||
char *binary = NULL;
|
char *binary = NULL;
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
|
// 从内存硬盘读取相关文件,使用 CPIO 格式
|
||||||
ret = ramdisk_read_file(bin_name, &binary);
|
ret = ramdisk_read_file(bin_name, &binary);
|
||||||
BUG_ON(ret < 0);
|
BUG_ON(ret < 0);
|
||||||
BUG_ON(binary == NULL);
|
BUG_ON(binary == NULL);
|
||||||
|
|
||||||
|
// 创建 PCB 并设置自身 Cap
|
||||||
root_process = process_create();
|
root_process = process_create();
|
||||||
|
|
||||||
|
// 创建主线程与其 Cap
|
||||||
thread_cap = thread_create_main(root_process, ROOT_THREAD_STACK_BASE,
|
thread_cap = thread_create_main(root_process, ROOT_THREAD_STACK_BASE,
|
||||||
ROOT_THREAD_STACK_SIZE,
|
ROOT_THREAD_STACK_SIZE,
|
||||||
ROOT_THREAD_PRIO, TYPE_ROOT,
|
ROOT_THREAD_PRIO, TYPE_ROOT,
|
||||||
0, binary, bin_name);
|
0, binary, bin_name);
|
||||||
|
|
||||||
|
// 将主线程 Cap 加入进程
|
||||||
root_thread = obj_get(root_process, thread_cap, TYPE_THREAD);
|
root_thread = obj_get(root_process, thread_cap, TYPE_THREAD);
|
||||||
/* Enqueue: put init thread into the ready queue */
|
/* Enqueue: put init thread into the ready queue */
|
||||||
obj_put(root_thread);
|
obj_put(root_thread);
|
||||||
|
@ -256,10 +256,12 @@ int thread_create_main(struct process *process, u64 stack_base,
|
|||||||
u64 stack;
|
u64 stack;
|
||||||
u64 pc;
|
u64 pc;
|
||||||
|
|
||||||
|
// 创建虚拟地址空间
|
||||||
init_vmspace = obj_get(process, VMSPACE_OBJ_ID, TYPE_VMSPACE);
|
init_vmspace = obj_get(process, VMSPACE_OBJ_ID, TYPE_VMSPACE);
|
||||||
obj_put(init_vmspace);
|
obj_put(init_vmspace);
|
||||||
|
|
||||||
/* Allocate and setup a user stack for the init thread */
|
/* Allocate and setup a user stack for the init thread */
|
||||||
|
// 创建用户栈 PMO 对象,并设置 Cap
|
||||||
stack_pmo = obj_alloc(TYPE_PMO, sizeof(*stack_pmo));
|
stack_pmo = obj_alloc(TYPE_PMO, sizeof(*stack_pmo));
|
||||||
if (!stack_pmo) {
|
if (!stack_pmo) {
|
||||||
ret = -ENOMEM;
|
ret = -ENOMEM;
|
||||||
@ -272,11 +274,13 @@ int thread_create_main(struct process *process, u64 stack_base,
|
|||||||
goto out_free_obj_pmo;
|
goto out_free_obj_pmo;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 映射线程用户栈
|
||||||
ret = vmspace_map_range(init_vmspace, stack_base, stack_size,
|
ret = vmspace_map_range(init_vmspace, stack_base, stack_size,
|
||||||
VMR_READ | VMR_WRITE, stack_pmo);
|
VMR_READ | VMR_WRITE, stack_pmo);
|
||||||
BUG_ON(ret != 0);
|
BUG_ON(ret != 0);
|
||||||
|
|
||||||
/* init thread */
|
/* init thread */
|
||||||
|
// 初始化线程对象
|
||||||
thread = obj_alloc(TYPE_THREAD, sizeof(*thread));
|
thread = obj_alloc(TYPE_THREAD, sizeof(*thread));
|
||||||
if (!thread) {
|
if (!thread) {
|
||||||
ret = -ENOMEM;
|
ret = -ENOMEM;
|
||||||
@ -286,15 +290,19 @@ int thread_create_main(struct process *process, u64 stack_base,
|
|||||||
/* Fill the parameter of the thread struct */
|
/* Fill the parameter of the thread struct */
|
||||||
stack = stack_base + stack_size;
|
stack = stack_base + stack_size;
|
||||||
|
|
||||||
|
// 加载程序各 ELF 段
|
||||||
pc = load_binary(process, init_vmspace, bin_start, &meta);
|
pc = load_binary(process, init_vmspace, bin_start, &meta);
|
||||||
|
|
||||||
|
// 设置栈
|
||||||
prepare_env((char *)phys_to_virt(stack_pmo->start) + stack_size,
|
prepare_env((char *)phys_to_virt(stack_pmo->start) + stack_size,
|
||||||
stack, &meta, bin_name);
|
stack, &meta, bin_name);
|
||||||
stack -= ENV_SIZE_ON_STACK;
|
stack -= ENV_SIZE_ON_STACK;
|
||||||
|
|
||||||
|
// 创建线程上下文
|
||||||
ret = thread_init(thread, process, stack, pc, prio, type, aff);
|
ret = thread_init(thread, process, stack, pc, prio, type, aff);
|
||||||
BUG_ON(ret != 0);
|
BUG_ON(ret != 0);
|
||||||
|
|
||||||
|
// 取得线程 Cap
|
||||||
thread_cap = cap_alloc(process, thread, 0);
|
thread_cap = cap_alloc(process, thread, 0);
|
||||||
if (thread_cap < 0) {
|
if (thread_cap < 0) {
|
||||||
ret = thread_cap;
|
ret = thread_cap;
|
||||||
@ -302,6 +310,7 @@ int thread_create_main(struct process *process, u64 stack_base,
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* L1 icache & dcache have no coherence */
|
/* L1 icache & dcache have no coherence */
|
||||||
|
// 清空 L1 缓存
|
||||||
flush_idcache();
|
flush_idcache();
|
||||||
|
|
||||||
// return thread;
|
// return thread;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user