欢迎来到天天文库
浏览记录
ID:38099132
大小:601.69 KB
页数:5页
时间:2019-05-24
《UNIX时钟中断设备处理子程序(clock)源代码分析》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库。
1、同济大学计算机软件教研室《操作系统》UNIX时钟中断设备处理子程序源代码分析1.基本概念1.1.相关全局变量/unix/systm.h0212intlbolt;/*timeofdayin60thnotintime记录当前的时钟滴答,一般每到HZ就清零*/0213inttime[2];/*timeinsecfrom1970记录系统时间,从1970.1.1以来的秒*//unix/param.h0147#defineHZ60/*Ticks/secondoftheclock,每秒钟时钟中断的次数*/1.2.函数定义时钟中
2、断的设备处理子程序为clock,是C语言编写的,位于clock.c文件中。函数原型:voidclock(intdev,intsp,intr1,intnps,intr0,intpc,intps)功能描述:时钟中断的C语言处理函数。它的主要功能包括:(1)调度、触发内核定时器;(2)系统计时;(3)如果睡眠时间已到,唤醒调用sleep进入睡眠的进程;(4)每隔4秒,设置调度标志runrun,并且唤醒挂起在lbolt上的进程,实际就是调用纸带打孔机初始化函数而没有完成的进程;(5)更新进程驻留在内存或磁盘上的时间;(6
3、)更新进程执行时间;(7)调整进程优先数p_pri,如果有进程优先数被调后低于当前进程优先数,则设置调度标志runrun;(8)更新进程统计直方图中的CPU使用信息;(9)最后判断进程是否接收到信号signal,如果接收到,则处理该信号。参数说明:(1)dev:当前ps的最后5位,它主要在trap函数中标识自陷类型。对于本中断并没有作用。(2)sp:先前态下的栈指针。(3)r1:进入中断函数前寄存器r1的值。(4)nps:当前ps寄存器的值(5)r0:进入中断函数前寄存器r0的值;(6)pc:中断函数的返回地址(
4、7)ps:中断前ps寄存器的值2.代码分析3700#3701#include"../param.h"3702#include"../systm.h"3703#include"../user.h"3704#include"../proc.h"3705同济大学计算机软件教研室《操作系统》3706#defineUMODE01700003707#defineSCHMAG1037083709/*3710*clockiscalledstraightfrom3711*therealtimeclockinterrupt.3712
5、*3713*Functions:3714*reprimeclock3715*copy*switchestodisplay3716*implementcallouts3717*maintainuser/systemtimes3718*maintaindate3719*profile3720*toutwakeup(syssleep)3721*lightningboltwakeup(every4sec)3722*alarmclocksignals3723*jabthescheduler3724*/3725clock(d
6、ev,sp,r1,nps,r0,pc,ps)3726{3727registerstructcallo*p1,*p2;3728registerstructproc*pp;37293730/*3731*restartclock/*进入clock函数以后,处理机优先级为6,3732*//*即:6级以下的中断(含)都关闭37333734*lks=0115;/*打开中断控制寄存器37353736/*3737*displayregister3738*/37393740display();/*更新显示寄存器37413742/*
7、3743*callouts3744*ifdone,justreturn3745*elseupdatefirstnon-zerotime/*触发内核定时器,或更新各定时器的触发时间3746*/37473748if(callout[0].c_func==0)3749gotoout;3750p2=&callout[0];3751while(p2->c_time<=0&&p2->c_func!=0)3752p2++;3753p2->c_time--;37543755/*3756*ifpsishigh,justreturn
8、3757*/37583759if((ps&0340)!=0)/*如果中断前处理机优先级>0,则直接跳转到out3760gotoout;37613762/*3763*callout3764*/37653766spl5();/*处理机优先级降为53767if(callout[0].c_time<=0){3768p1=&callout[0];3769while(p1->c_fu
此文档下载收益归作者所有