看不懂,能不能說清楚一點。
書上是不是說這兩個地方不一至。

解决方案 »

  1.   

    在中断产生的时候都要把当前正在运行的进程的寄存器值保存到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[]中与保护现场无关的内容冲掉了?