某任务A发生中断,进入特权级0中断处理程序,3级的ss,esp,eflag,cs,eip,error_num都被压入0级堆栈,
在中断处理程序中又开启中断,允许被其他中断再次中断,在A的中断处理程序再次关闭中断前,
又发生了时钟中断,并切换任务,这时候任务A的所有寄存器都被存入它的TSS段中....
等到任务A再次被调度时,装入A的TSS段中的寄存器值,A恢复到0特权级,0特权级的堆栈中还保存有切换前压入的值.
以上适合抢占式内核,linux属于非抢占式内核.
我知道假如A从特权级0切换到特权级3,然后再切换到0,那么先前在0下压入的堆栈值都不会再有,就是说堆栈重新为空堆栈.
/***************
*system.h
**************/
#define switch_to(prev,next,last) do { /
asm volatile("pushl %%esi/n/t" /
"pushl %%edi/n/t" /
"pushl %%ebp/n/t" /
"movl %%esp,%0/n/t" /* save ESP */ /
"movl %3,%%esp/n/t" /* restore ESP */ /
"movl $1f,%1/n/t" /* save EIP */ /
"pushl %4/n/t" /* restore EIP */ /
"jmp __switch_to/n" /
"1:/t" /
"popl %%ebp/n/t" /
"popl %%edi/n/t" /
"popl %%esi/n/t" /
:"=m" (prev->thread.esp),"=m" (prev->thread.eip), /
"=b" (last) /
:"m" (next->thread.esp),"m" (next->thread.eip), /
"a" (prev), "d" (next), /
"b" (prev)); /
} while (0)
/**************************
*sched.h
**************************/
#define __set_task_state(tsk, state_value) /
do { (tsk)->state = (state_value); } while (0)
/***********************************
*
***********************************/
pidhash定义的宏函数看了看不明白它为什么这样来散列,有谁知道的?
#define PIDHASH_SZ 1024
#define pid_hashfn(x) (((x)>>8)^(x))&(PIDHASH_SZ-1)