Linux内核分析考试试题,linux内核分析第二周作业

#include #include "mypcb.h"

extern tPCB task[MAX_TASK_NUM];

extern tPCB * my_current_task;

extern volatile int my_need_sched;

volatile int time_count = 0; //时钟计数

/*

* Called by timer interrupt.

* it runs in the name of current running process,

* so it use kernel stack of current running process

*/

void my_timer_handler(void)

{

#if 1

if(time_count%1000 == 0 && my_need_sched != 1)//时钟终端1000次,且调度标识符不为1时输出提示,且将调度标识符变为1。

{

printk(KERN_NOTICE ">>>my_timer_handler here<

{

return;

}

printk(KERN_NOTICE ">>>my_schedule<

prev = my_current_task;

if(next->state == 0)//判断下一个进程是否为正在执行状态

{

/* switch to next process */

asm volatile(

"pushl %%ebp\n\t" //保存当前进程的ebp

"movl %%esp,%0\n\t" //将当前进程的esp保存在prev->thread.sp中

"movl %2,%%esp\n\t" //将下一个进程的esp(next->thread.sp)放在esp中

"movl $1f,%1\n\t" //将1:标志处的内存地址保存在prev->thread.ip中

"pushl %3\n\t" //将下一个进程的eip放入栈中

"ret\n\t" //释放下一个进程的eip,下一个进程开始执行

"1:\t" /* next process start here */

"popl %%ebp\n\t"

: "=m" (prev->thread.sp),"=m" (prev->thread.ip)

: "m" (next->thread.sp),"m" (next->thread.ip)

);

my_current_task = next;

printk(KERN_NOTICE ">>>switch %d to %d<pid);

}

else //对于还没有执行过的进程的处理

{

next->state = 0; //将进程状态转为执行状态

my_current_task = next;

printk(KERN_NOTICE ">>>switch %d to %d<pid);

/* switch to new process */

asm volatile(

"pushl %%ebp\n\t" /* save ebp */

"movl %%esp,%0\n\t" /* save esp */

"movl %2,%%esp\n\t" /* restore esp */

"movl %2,%%ebp\n\t" /* restore ebp */

"movl $1f,%1\n\t" /* save eip */

"pushl %3\n\t" //保存将当前进程的入口

"ret\n\t" /* restore eip */

: "=m" (prev->thread.sp),"=m" (prev->thread.ip)

: "m" (next->thread.sp),"m" (next->thread.ip)

);

}

return;

}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值