各个进程的数据放在数组proc[]. 每个数组元都有一个部分用于在中断产生时保护寄存器
09411      struct stackframe_s p_reg;
所以这部分内存单元散落在proc[]中,并不连续。但各个进程为中断所分配的内层堆栈却是连续的,都在t_stack[]中。
21871    ktsb += ttp->stksize;
21872    rp->p_reg.sp = ktsb;
这样岂不是相互矛盾?如果两者一致,中断后自动切换到各个进程的内层堆栈sp,寄存器值可以直接用push就保存到proc[i].p_reg中。这就是:
"the stack already points into the process table"所以我不明白为什么两个地方会不一致在中断产生的时候都要把当前正在运行的进程的寄存器值保存到process table中,也就是proc[]中的某一个数组元。当前进程如果是用户级,中断产生以后将自动切换内层堆栈。
如果内层堆栈指针恰好指向每一个进程的process table中用于保护现场的那部分数据块,具体说就是proc[i].p_reg,那么中断产生后保护现场的过程就很简单,就用几个push就结了。实际上save()35854    !*    save    *就是这样做的。那么每一个进程的内层堆栈开头那一部分,应该分别映射到数组proc[]中各个不同地方,而不可能是连续的。
但是每一个进程所对应的内层堆栈都不同:tss.ss0是一样的,只是sp值不一样。所有进程的内层堆栈都从t_stack开始连续分配,而且每个进程的内层堆栈大小ttp->stksize也是不一样的。
proc[].p_reg是离散,不连续的,大小也是固定的;t_stack[]却是连续的,每个进程所占用的大小也是不一样的。两者是相互矛盾的。
再有一点,内层堆栈除了用来保护现场,剩余部分要给中断程序使用,如果process table和内层堆栈是结合在一起的,这样岂不是会把proc[]中与保护现场无关的内容冲掉了?