2021 年 2 月

20210227-RISC-V进程地址空间切换交流 #

吴一凡介绍目前的代码状态 #

内核与用户进程各一个地址空间,共同有一个Trampoline(alltrap的代码)和TrapContext(alltrap的数据);Trampoline用于在用户地址空间和内核态时访问。

讨论 #

trampoline区域 #

trampoline区域的初始化在哪?

  1. trap_return, 链接时,把相关代码放到内核中;
  2. map_trampoline建立映射
    1. 用户态是不能访问的;
    2. 中断时,中断进入时硬件保存现场并不直接访问这个区域的内存,而是放在寄存器中;
    3. 这个区域只在内核态且是用户地址空间时访问;
    4. 这两个页表的设置是一样的,可以保证它只在内核态可以访问;
    5. 中断服务例程的地址在链接时得到;

这个思路的原始出处是哪?

XV6;MIT也没有维护X86的版本了。

内核进程中的用户进程页表 #

  1. 每个进程在内核中有一个页表数据结构;
  2. 用户页表项:在内核中是线性映射;
  3. 每个用户进程的页表逻辑地址是不同的;

用户进程的内核栈 #

  1. 目前每个用户进程在内核进程中有一个自己的内核栈;
  2. 陈老师认为,每个用户进程必须有自己的内核栈,向勇认为可以没有;有兴趣时,同学可以来讨论。

系统调用时用户进程与内核进程间的切换过程 #

有可能基于Trampoline完成整个切换过程吗?把内核中处理系统调用和调度的功能独立出来,形成两个或一个进程;这是有可能的;这个工作应该是hypervisor的功能;

用户进程切换 #

有可能进行进程间的切换吗?有可能;有时间时,再进入进一步的讨论;

内核态的中断处理 #

在内核态的中断的处理与用户态的有什么不同?没有地址空间切换了,服务一定是不一样的,可能还有其他区别;

建议 #

  1. 其他同学在看明白后,可以给出自己的理解和想法描述出来;
  2. 吴一凡:改异步方案文档