MIT6.828_HW5_ XV6 CPU Alarm

Homework: xv6 CPU alarm

本次练习将向xv6添加一项功能,该功能会在使用CPU时间的情况下定期向进程发出警报。 这对于想要限制消耗CPU时间的计算密集型进程很有用,或者对于想要占用CPU但还想采取一些定期操作的进程很有用。 更一般的说,本练习将实现用户级中断/故障处理程序的原始形式。

首先应该添加一个新的alarm(interval, handler)系统调用。 如果应用程序调用alarm(n,fn),则在
程序消耗的CPU时间每到达n次“tick”之后,内核将导致应用程序函数fn被调用。 当fn返回时,应用程
序将从上次停止的地方继续。 tick由硬件计时器产生中断的频率决定。
一(创建测试代码):创建alarmtest.c,源代码在课程中已经给出
二(预期输出结果):如下
MIT6.828_HW5_ XV6 CPU Alarm
三(根据提示设计该系统调用):
提示1:修改Makefile,使alarmtest.c能够被编译成xv6用户程序
提示2:记得在user.h中声明alarm函数原型:int alarm(int ticks, void (*handler)());
提示3:记得更新syscall.h,usys.s将alarm注册为系统调用
提示4:sys_alarm()函数应该保存interval和handler的函数指针到proc结构体中,以便在发生时钟中断进
入trap()时使用
提示5:课程中给出了sys_alarm()代码,记得加到syscall.c里,还有记得把SYS_ALARM加入syscalls数组。
提示6:在proc中增加一个新字段,以记录过去了多少个tick,在allocproc()中初始化该字段
提示7:每次tick,硬件时钟都会产生一个中断,该中断在trap()中的case T_IRQ0+IRQ_TIMER下处理,应当在此添加一些代码
提示8:应当在进程正在运行且计数器中断来自用户态时进行处理,课程中给出了判断该条件的代码
提示9:在IRQ_TIMER代码中,当进程的interval到期时,要使其执行其处理程序。
提示10:进程在处理程序返回后应从上次中断的地方继续执行。
提示11:你可以在alarmtest.asm中看看alarmtest程序的汇编代码
提示12:make CPUS=1 qemu该指令告诉qemu仅使用一个CPU,此时使用gdb查看陷入将更容易。
实际上根据提示一步步来,我们自己要完成的部分只有trap.c中对时钟中断的处理有些难度:
trap.c代码:MIT6.828_HW5_ XV6 CPU Alarm
开始想要执行handler()函数时,是直接写的myproc()->alarmhandler(),但是并没有打印出警告信息,后面反应过来处在内核态是不能执行用户态代码的,参考了大佬孟永康的文章后,改成上图红框这种形式,但xv6陷入处理时钟中断,执行alarmhandler函数后,是如何返回oldeip指向的地址的,这个问题花了一晚上还是搞不太清楚,可能得整理到以后再慢慢解决,另外查资料时发现了一篇挺有帮助的文章xv6源码分析(五):异常、中断、系统调用机制,。