- Assembly code
;tr已经初始化,esp0已经赋值;时钟中断处理程序;8259A时钟中断处理程序 pushad push ds push es push fs push gs mov al , EOI out NIT_M_CTL,al ;中断处理结束;;;;;;;这里没有保存esp0,当发生下次时钟中断时候,使用的esp0是什么值?此时tss中的以前保存的esp0不能在使用么? pop gs pop fs pop es pop ds popad iretd
没有保存esp0,当发生下次时钟中断时候,使用的esp0是什么值?此时tss中的以前保存的esp0不能在使用么?不是没有改变tss中esp0的值么。
------解决方案--------------------------------------------------------
TSS中的静态字段只是用于发生了由外层向内层特权级变换的转移的时候,CPU会用静态字段也就是内层栈保存区的三组栈寄存器中的一组来初始化目标特权级层。
但是如果这个特权级变换的转移是由任务切换导致的,就不会使用那三组内层栈寄存器组,而是使用通用寄存器esp字段来初始化目标特权级层。