【中断异常】时钟中断

Linux是一个分时系统,时钟中断是维护其生命的必要条件,因此时钟中断又称为“心跳”;make是重建内核的工具,它是靠时间标记来确定是否需要重新编译以及连接的;进程的强制调度也是需要时钟中断的;


(1)在初始化阶段,先对trap_init(),init_IRQ(),sched_init(),就到了对time_init()初始化,由此可见,一旦开始有时钟中断就可能要进行调度了,所以要先对调度机制初始化,做好准备;CMOS晶片即使在电源断电的情况下,依靠电池供电,记录时间;在time_init()中,首先通过get_cmos_time()来读取当时的时间到xtime(精度为s);而jiffies记录着开机以来的时钟中断,取决于系统中HZ;然后执行setup_irq(),绑定中断请求号和irqaction;irqaction中有要执行的函数timer_interrupt(),以及irq的flag参数:SA_SHIRQ为0即不允许共享,SA_INTERRUPT为1表示不允许中断;

(2)在timer_interrupt()中执行do_timer_interrupt();在do_timer()中首先,增加jiffies,用(*(unsigned long *)&jiffies)++,这条语句就被翻译成一个对内存inc的指令,是一条原子指令;然后执行与进程调度有关的update_process_times(),最后安排mark_bh()下半部任务;mark_bh()将bh_task_vec[TIMER_BH]挂入tasklet_hi_vec中,是CPU返回中断之前执行与TIMER_BH对应的timer_bh();TIMER_BH完成逻辑上的时钟中断服务,可在开中断情况下完成,不是很紧急的,完全下半部功能;TQUEUE_BH指的是挂靠时钟中断,周期性的调用某中断服务程序而设置的;mark_bh()也将会bh_task_vec[TQUEUE_BH]挂入tasklet_hi_vec中,这样内核就会在执行bh时,通过tqueue_bh()来将该队列中所有的函数都调用一遍;

(3)在timer_bh()中,首先执行update_times(),在update_wall_time()中,首先处理实时时钟,包括计数,进位,以及精度目的而做的校正,wall_jiffies代表当前xtime中数值对应的jiffies;calac_load()计算和积累关于CPU符合的统计信息。内核每隔5s计算,累积和更新一次过去的15分钟,10分钟,以及1分钟内平均有多少个进程处于可执行状态,所谓平衡系统负载的指标;

(4)timer_bh()中,然后执行run_timer_list(),检查系统中已经设置的各个定时器,到点的话,就执行执行相应的预定函数;timer_list使用链表来组织起来的,bh函数开中断下执行;

(5)整个时钟中断服务期间,大半部分的操作是在后半执行的;真正在关中断情况下执行的是一些少量的关键性操作;因此区分前半部执行哪些操作和后半部执行哪些操作是需要对系统有深刻了解的;

(6)然后在do_timer_interrupt()中,执行x86_do_profile()积累统计信息;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值