DragonOS内核态向用户态进行切换
DragonOS内核态向用户态进行切换
关键函数: switch_to_user()
(粗略版)步骤:
- 删除当前进程的kthread的标志
- 读取指定路径下的trap_frame,执行init进程
- 这里要用try_to_run_init_process进行封装,因为要判断执行进程失败的原因是无法加载初始化程序还是其他 原因
- 调用do_execve函数执行init程序
- 执行arch下的用户态切换,先获取trap_frame的虚存地址,使用assert!判断当前堆栈指针是否小于trap_frame的地址,如果堆栈指针大于等于它,终止进程,说明出现堆栈溢出。切换archpcb的fs和gs为用户态的fs和gs,储存内核的gs数据,切换fs和gs寄存器。
- 更新rip指针
- 释放上面申请的所有守卫和引用计数变量,否则会导致内存错误
- 进入ready状态,执行user态的切换,把进程的trap_frame指针指向trap_frame。
- 执行一段汇编代码(rust的内联汇编技术):交换当前的 GS 基址寄存器和内核的 GS 基址寄存器。将
trapframe_vaddr
的值移动到 RSP 寄存器(Stack Pointer)。这将改变当前的堆栈指针。将new_rip
的值压入堆栈。在 x86 架构中,RIP 寄存器(Instruction Pointer)存储了下一条要执行的指令的地址。这条指令从堆栈中弹出一个值,并跳转到这个地址。这通常用于从函数返回。
This post is licensed under CC BY 4.0 by the author.