diff --git a/kernel/process/proc.S b/kernel/process/proc.S index 0100be6f..73835c34 100644 --- a/kernel/process/proc.S +++ b/kernel/process/proc.S @@ -27,8 +27,10 @@ ENTRY(kernel_thread_func) popq %rax movq %rax, %es popq %rax - addq $0x38, %rsp - movq %rdx, %rdi + addq $0x20, %rsp + popfq + addq $0x10, %rsp + movq %rdx, %rdi callq *%rbx movq %rax, %rdi callq process_do_exit \ No newline at end of file diff --git a/kernel/process/process.c b/kernel/process/process.c index 508db515..940ec118 100644 --- a/kernel/process/process.c +++ b/kernel/process/process.c @@ -422,6 +422,8 @@ ul initial_kernel_thread(ul arg) // 准备切换到用户态 struct pt_regs *regs; + // 若在后面这段代码中触发中断,return时会导致段选择子错误,从而触发#GP,因此这里需要cli + cli(); current_pcb->thread->rip = (ul)ret_from_system_call; current_pcb->thread->rsp = (ul)current_pcb + STACK_SIZE - sizeof(struct pt_regs); current_pcb->thread->fs = USER_DS | 0x3;