diff --git a/kernel/debug/traceback/traceback.c b/kernel/debug/traceback/traceback.c index ba5e3154..eae80713 100644 --- a/kernel/debug/traceback/traceback.c +++ b/kernel/debug/traceback/traceback.c @@ -51,14 +51,16 @@ void traceback(struct pt_regs *regs) // 最大追踪10层调用栈 for (int i = 0; i < 10; ++i) { - printk_color(ORANGE, BLACK, "rbp:%#018lx,*rbp:%#018lx\n", rbp, *rbp); if (lookup_kallsyms(ret_addr, i) != 0) break; - // 由于内核栈大小32K,因此当前rbp的值为按照32K对齐时,表明调用栈已经到头了,追踪结束。 - if (((*rbp) & (~STACK_SIZE)) == 0) + // 当前栈帧的rbp的地址大于等于内核栈的rbp的时候,表明调用栈已经到头了,追踪结束。 + // 当前rbp的地址为用户空间时,直接退出 + if((uint64_t)(rbp) >= current_pcb->thread->rbp || ((uint64_t)rbprsp)) break; + printk_color(ORANGE, BLACK, "rbp:%#018lx,*rbp:%#018lx\n", rbp, *rbp); + // 由于x86处理器在执行call指令时,先将调用返回地址压入栈中,然后再把函数的rbp入栈,最后将rsp设为新的rbp。 // 因此,此处的rbp就是上一层的rsp,那么,*(rbp+1)得到的就是上一层函数的返回地址 ret_addr = *(rbp + 1); diff --git a/user/apps/shell/shell.c b/user/apps/shell/shell.c index 7d784256..c91be545 100644 --- a/user/apps/shell/shell.c +++ b/user/apps/shell/shell.c @@ -73,7 +73,7 @@ int main() int kb_fd = open(kb_file_path, 0); // printf("keyboard fd = %d\n", kb_fd); print_ascii_logo(); - int a = 1/0; + main_loop(kb_fd); while (1) ;