🐛 解决了无法进入用户态的bug

This commit is contained in:
fslongjin 2022-04-11 17:15:24 +08:00
parent dacc29310f
commit 011246281a
2 changed files with 26 additions and 21 deletions

View File

@ -25,18 +25,19 @@ void __switch_to(struct process_control_block *prev, struct process_control_bloc
initial_tss[0].ist2, initial_tss[0].ist3, initial_tss[0].ist4, initial_tss[0].ist5, initial_tss[0].ist6, initial_tss[0].ist7); initial_tss[0].ist2, initial_tss[0].ist3, initial_tss[0].ist4, initial_tss[0].ist5, initial_tss[0].ist6, initial_tss[0].ist7);
__asm__ __volatile__("movq %%fs, %0 \n\t" __asm__ __volatile__("movq %%fs, %0 \n\t"
: "=a"(prev->thread->fs)::"memory"); : "=a"(prev->thread->fs));
__asm__ __volatile__("movq %%gs, %0 \n\t" __asm__ __volatile__("movq %%gs, %0 \n\t"
: "=a"(prev->thread->gs)::"memory"); : "=a"(prev->thread->gs));
__asm__ __volatile__("movq %0, %%fs \n\t" ::"a"(next->thread->fs) __asm__ __volatile__("movq %0, %%fs \n\t" ::"a"(next->thread->fs));
: "memory"); __asm__ __volatile__("movq %0, %%gs \n\t" ::"a"(next->thread->gs));
__asm__ __volatile__("movq %0, %%gs \n\t" ::"a"(next->thread->gs)
: "memory");
wrmsr(0x175, next->thread->rbp); wrmsr(0x175, next->thread->rbp);
kdebug("next=%#018lx", next);
kdebug("initial_tss[0].rsp1=%#018lx", initial_tss[0].rsp1);
kdebug("prev->thread->rsp0:%#018lx\n", prev->thread->rbp); kdebug("prev->thread->rsp0:%#018lx\n", prev->thread->rbp);
kdebug("next->thread->rsp0:%#018lx\n", next->thread->rbp); kdebug("next->thread->rsp0:%#018lx\n", next->thread->rbp);
kdebug("next->thread->rip:%#018lx\n", next->thread->rip);
} }
/** /**
@ -50,9 +51,10 @@ void user_level_function()
// enter_syscall(15, 0, 0, 0, 0, 0, 0, 0, 0); // enter_syscall(15, 0, 0, 0, 0, 0, 0, 0, 0);
// enter_syscall(SYS_PRINTF, (ul) "test_sys_printf\n", 0, 0, 0, 0, 0, 0, 0); // enter_syscall(SYS_PRINTF, (ul) "test_sys_printf\n", 0, 0, 0, 0, 0, 0, 0);
long ret = 0; long ret = 0;
// color_printk(RED,BLACK,"user_level_function task is running\n"); // color_printk(RED,BLACK,"user_level_function task is running\n");
while(1);
char string[] = "Hello World!\n"; char string[] = "Hello World!\n";
__asm__ __volatile__("leaq sysexit_return_address(%%rip), %%rdx \n\t" __asm__ __volatile__("leaq sysexit_return_address(%%rip), %%rdx \n\t"
@ -134,6 +136,7 @@ ul initial_kernel_thread(ul arg)
// memset((void*)current_pcb->mm->pgd, 0, PAGE_4K_SIZE); // memset((void*)current_pcb->mm->pgd, 0, PAGE_4K_SIZE);
regs = (struct pt_regs *)current_pcb->thread->rsp; regs = (struct pt_regs *)current_pcb->thread->rsp;
kdebug("current_pcb->thread->rsp=%#018lx", current_pcb->thread->rsp);
current_pcb->flags = 0; current_pcb->flags = 0;
// 将返回用户层的代码压入堆栈向rdx传入regs的地址然后jmp到do_execve这个系统调用api的处理函数 这里的设计思路和switch_proc类似 // 将返回用户层的代码压入堆栈向rdx传入regs的地址然后jmp到do_execve这个系统调用api的处理函数 这里的设计思路和switch_proc类似
__asm__ __volatile__("movq %1, %%rsp \n\t" __asm__ __volatile__("movq %1, %%rsp \n\t"
@ -223,6 +226,8 @@ int kernel_thread(unsigned long (*fn)(unsigned long), unsigned long arg, unsigne
// rip寄存器指向内核线程的引导程序 // rip寄存器指向内核线程的引导程序
regs.rip = (ul)kernel_thread_func; regs.rip = (ul)kernel_thread_func;
kdebug("kernel_thread_func=%#018lx", kernel_thread_func);
kdebug("&kernel_thread_func=%#018lx", &kernel_thread_func);
return do_fork(&regs, flags, 0, 0); return do_fork(&regs, flags, 0, 0);
} }
@ -268,7 +273,6 @@ void process_init()
*/ */
// 初始化进程的循环链表 // 初始化进程的循环链表
list_init(&initial_proc_union.pcb.list); list_init(&initial_proc_union.pcb.list);
current_pcb->flags=0;
kernel_thread(initial_kernel_thread, 10, CLONE_FS | CLONE_FILES | CLONE_SIGNAL); // 初始化内核进程 kernel_thread(initial_kernel_thread, 10, CLONE_FS | CLONE_FILES | CLONE_SIGNAL); // 初始化内核进程
initial_proc_union.pcb.state = PROC_RUNNING; initial_proc_union.pcb.state = PROC_RUNNING;
@ -329,6 +333,8 @@ unsigned long do_fork(struct pt_regs *regs, unsigned long clone_flags, unsigned
thd->fs = KERNEL_DS; thd->fs = KERNEL_DS;
thd->gs = KERNEL_DS; thd->gs = KERNEL_DS;
kdebug("do_fork() thd->rsp=%#018lx", thd->rsp);
// 若进程不是内核层的进程则跳转到ret from system call // 若进程不是内核层的进程则跳转到ret from system call
if (!(tsk->flags & PF_KTHREAD)) if (!(tsk->flags & PF_KTHREAD))
thd->rip = regs->rip = (ul)ret_from_system_call; thd->rip = regs->rip = (ul)ret_from_system_call;

View File

@ -231,18 +231,17 @@ struct process_control_block *get_current_pcb()
#define switch_proc(prev, next) \ #define switch_proc(prev, next) \
do \ do \
{ \ { \
\ __asm__ __volatile__("pushq %%rbp \n\t" \
__asm__ __volatile__("pushq %%rbp \n\t" \ "pushq %%rax \n\t" \
"pushq %%rax \n\t" \ "movq %%rsp, %0 \n\t" \
"movq %%rsp, %0 \n\t" \ "movq %2, %%rsp \n\t" \
"movq %2, %%rsp \n\t" \ "leaq 1f(%%rip), %%rax \n\t" \
"leaq 1f(%%rip), %%rax \n\t" \ "movq %%rax, %1 \n\t" \
"movq %%rax, %1 \n\t" \ "pushq %3 \n\t" \
"pushq %3 \n\t" \ "jmp __switch_to \n\t" \
"jmp __switch_to \n\t" \ "1: \n\t" \
"1: \n\t" \ "popq %%rax \n\t" \
"popq %%rax \n\t" \ "popq %%rbp \n\t" \
"popq %%rbp \n\t" \
: "=m"(prev->thread->rsp), "=m"(prev->thread->rip) \ : "=m"(prev->thread->rsp), "=m"(prev->thread->rip) \
: "m"(next->thread->rsp), "m"(next->thread->rip), "D"(prev), "S"(next) \ : "m"(next->thread->rsp), "m"(next->thread->rip), "D"(prev), "S"(next) \
: "memory"); \ : "memory"); \