操作系统xv6学习笔记-homework xv6 CPU alarm

博客分类: xv6 阅读次数: comments

操作系统xv6学习笔记-homework xv6 CPU alarm

操作系统作业 os03

CPU ALARM

第一处:

extern .......
extern .......
 .
 .
 .
extern int sys_alarm(void)    //new

第二处:

[SYS_...]   ....
 .
 .
 .
[SYS_alarm]     sys_akarm,      //new
#define SYS_...     1
 .                  .
 .                  .
 .                  .
#define SYS_alarm   23
int sys_alarm(void){
    int ticks;
    void (*handler)();

    if (argint(0,&ticks) < 0 ){
        return -1;
    }
    if (argptr(1,(char**)&handler,1) < 0 ){

        return -1;
    }
    proc -> alarmticks = ticks;
    proc -> alarmhandler = handler;
    return 0;
}
int ....
 .
 .
 .
int alarm(int ticks, void (*handler()));    //new

-在useys.S中,添加:

SYSCALL(...)
 .
 .
 .
SYSCALL(alarm)      //new
#include "types.h"
#include "stat.h"
#include "user.h"

void periodic();

int
main(int argc, char *argv[])
{
  int i;
  printf(1, "alarmtest starting\n");
  alarm(10, periodic);
  for(i = 0; i < 25*500000; i++){
    if((i % 250000) == 0)
      write(2, ".", 1);
  }
  exit();
}

void
periodic()
{
  printf(1, "alarm!\n");
}
_alarmtest/
int alarmticks;             //new
void (* alarmhandler)();    //new
int tickscount;             //new
 if(cpuid() == 0){
      acquire(&tickslock);
      ticks++;
      wakeup(&ticks);
      release(&tickslock);
    }
    //new-----------------------------------
    if(myproc() &&  (tf -> cs & 3) == 3){
      myproc() -> tickscount++;
      if (myproc() -> tickscount == myproc()->alarmticks){
        myproc() -> tickscount =0;
        tf->esp -= 4;
        *(uint *) tf -> esp = tf -> eip;
        tf -> eip = (uint) myproc() -> alarmhandler;
      }
    }