xv6-----CPU alarm

本次实验也是整理自网络,,,

 

参考:

1.添加alarm系统调用(和第一次实验的题目二类似,将halt修改为alarm就行,函数sys_alarm的代码作业网页已给出 链接:  xv6之添加halt系统调用

 

2.添加_alarmtest 在makefile中 (和第一次实验的添加_halt\ 一样,详情见上面链接博客)

 

3.在proc.h 的

stuct proc结构体内添加如下代码

 

1 int alarmticks;          
2 void (*alarmhandler)();  
3 int curalarmtick;  

 

 

4.在trap.c文件中的函数

void
trap(struct trapframe *tf)中switch的第一个case修改如下:

 

 1 case T_IRQ0 + IRQ_TIMER:
 2     if(cpu->id == 0){
 3        acquire(&tickslock);
 4        ticks++;
 5 
 6       wakeup(&ticks);
 7       release(&tickslock);
 8     }
 9       if(proc && (tf->cs & 3) == 3){
10         proc->curalarmtick++;
11         if(proc->alarmticks == proc->curalarmtick){  // 到达了周期
12           proc->curalarmtick = 0;
13 
14     //下面两句将eip压栈
15           tf->esp -= 4;    
16           *((uint *)(tf->esp)) = tf->eip;
17     // 将alarmhandler复制给eip,准备执行
18           tf->eip =(uint) proc->alarmhandler;
19         }
20       }
21     lapiceoi();
22     break;

 

 

5.其余的都是按照网页上的提示来,基本都很简单

诸如在 user.h 中添加声明:

1 int alarm(int ticks, void (*handler)());

在第一步中所需的sys_alarm()函数代码:

 

 1 int
 2     sys_alarm(void)
 3     {
 4       int ticks;
 5       void (*handler)();
 6 
 7       if(argint(0, &ticks) < 0)
 8         return -1;
 9       if(argptr(1, (char**)&handler, 1) < 0)
10         return -1;
11       proc->alarmticks = ticks;
12       proc->alarmhandler = handler;
13       return 0;
14     }

 

 

完成以上步骤后,重新编译xv6并运行,输入alarmtest命令应该会出现下面的反应

 

$ alarmtest
alarmtest starting
.....alarm!
....alarm!
.....alarm!
......alarm!
.....alarm!
....alarm!
....alarm!
......alarm!
.....alarm!
...alarm!
...$ 

就这样,,,如果有什么问题就检查下哪一部忘做了,,其实作业网页上说的很详细的,,

 

posted @ 2015-11-27 19:48  马列神教  阅读(1330)  评论(0编辑  收藏  举报