本次实验也是整理自网络,,,
参考:
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! ...$
就这样,,,如果有什么问题就检查下哪一部忘做了,,其实作业网页上说的很详细的,,