sched.h system.h

某任务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)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值