本次实验也是整理自网络,,,
参考:
1.添加alarm系统调用(和第一次实验的题目二类似,将halt修改为alarm就行,函数sys_alarm的代码作业网页已给出 链接: )
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命令应该会出现下面的反应
$ alarmtestalarmtest starting.....alarm!....alarm!.....alarm!......alarm!.....alarm!....alarm!....alarm!......alarm!.....alarm!...alarm!...$ 就这样,,,如果有什么问题就检查下哪一部忘做了,,其实作业网页上说的很详细的,,