20210227-RISC-V进程地址空间切换交流 #
吴一凡介绍目前的代码状态 #
内核与用户进程各一个地址空间,共同有一个Trampoline(alltrap的代码)和TrapContext(alltrap的数据);Trampoline用于在用户地址空间和内核态时访问。
讨论 #
trampoline区域 #
trampoline区域的初始化在哪?
- trap_return, 链接时,把相关代码放到内核中;
- map_trampoline建立映射
- 用户态是不能访问的;
- 中断时,中断进入时硬件保存现场并不直接访问这个区域的内存,而是放在寄存器中;
- 这个区域只在内核态且是用户地址空间时访问;
- 这两个页表的设置是一样的,可以保证它只在内核态可以访问;
- 中断服务例程的地址在链接时得到;
这个思路的原始出处是哪?
XV6;MIT也没有维护X86的版本了。
内核进程中的用户进程页表 #
- 每个进程在内核中有一个页表数据结构;
- 用户页表项:在内核中是线性映射;
- 每个用户进程的页表逻辑地址是不同的;
用户进程的内核栈 #
- 目前每个用户进程在内核进程中有一个自己的内核栈;
- 陈老师认为,每个用户进程必须有自己的内核栈,向勇认为可以没有;有兴趣时,同学可以来讨论。
系统调用时用户进程与内核进程间的切换过程 #
有可能基于Trampoline完成整个切换过程吗?把内核中处理系统调用和调度的功能独立出来,形成两个或一个进程;这是有可能的;这个工作应该是hypervisor的功能;
用户进程切换 #
有可能进行进程间的切换吗?有可能;有时间时,再进入进一步的讨论;
内核态的中断处理 #
在内核态的中断的处理与用户态的有什么不同?没有地址空间切换了,服务一定是不一样的,可能还有其他区别;
建议 #
- 其他同学在看明白后,可以给出自己的理解和想法描述出来;
- 吴一凡:改异步方案文档;