zl程序教程

您现在的位置是:首页 >  系统

当前栏目

ARM Linux 如何--注册和触发--软中断

Linux注册ARM 如何 -- 中断 触发
2023-09-27 14:29:31 时间
    register_cpu_notifier( timers_nb);       open_softirq(TIMER_SOFTIRQ, run_timer_softirq);   void open_softirq(int nr, void (*action)(struct softirq_action *))       softirq_vec[nr].action = action;  

软中断TIMER_SOFTIRQ的中断处理函数为:run_timer_softirq

之所以成为softirq,是因为这些中断是由硬件中断来间接触发的,如何间接触发的呢:
硬件中断处理函数-- 对软中断的相应位置位-- 唤醒ksoftirqd线程-- 执行软中断的中断处理函数

 

2. 硬件中断如何通过置位唤醒ksoftirqd线程

timer interrupt handler-
timer_tick-
update_process_times-
run_local_timers-
hrtimer_run_queues()和raise_softirq(TIMER_SOFTIRQ)-
raise_softirq_irqoff-
__raise_softirq_irqoff { or_softirq_pending(1UL (nr)); }
即(local_softirq_pending() |= (x))

 

3. 如何执行软中断的action 中断处理函数

对于TIMER_SOFTIRQ来说,每次system clock产生中断时,即一个tick 到来时,在system clock的中断处理函数中会调用run_local_timers来设置TIMER_SOFTIRQ触发条件;也就是当前CPU对应的irq_cpustat_t结构体中的__softirq_pending成员的第TIMER_SOFTIRQ个BIT被置为1。 而当这个条件满足时,ksoftirqd线程(入口函数run_ksoftirqd,cpu_callback:kthread_create(run_ksoftirqd, hcpu, "ksoftirqd/%d", hotcpu);)会被唤醒,然后按照下面的流程调用TIMER_SOFTIRQ在数组softirq_vec中注册的action,即run_timer_softirq。
run_ksoftirqd--- do_softirq--- __do_softirq--- softirq_vec[TIMER_SOFTIRQ].action


 


               If already offline, well be on wrong CPU:                 dont process */               if (cpu_is_offline((long)__bind_cpu))                   goto wait_to_die;               do_softirq();               preempt_enable_no_resched();               cond_resched();               preempt_disable();               rcu_sched_qs((long)__bind_cpu);           }           preempt_enable();           set_current_state(TASK_INTERRUPTIBLE);       }       __set_current_state(TASK_RUNNING);       return 0;   wait_to_die:       preempt_enable();       /* Wait for kthread_stop */       set_current_state(TASK_INTERRUPTIBLE);       while (!kthread_should_stop()) {           schedule();           set_current_state(TASK_INTERRUPTIBLE);       }       __set_current_state(TASK_RUNNING);       return 0;  
Linux调度器何时需触发抢占?—— 从hackbench谈起 作者:何惟禹 吴一昊一、背景:性能之战“不服跑个分”虽然已经沦为手机行业的调侃用语,但在操作系统领域仍然是最重要的评价方式之一。本文的故事也源于一次 Alinux3 与 CentOS8 的一次跑分的较量。当然比分较量并不是目的,更重要的是发现存在的回归缺陷并进行修复,最终让 Alinux3 全方位持平或超过 CentOS8。在本次较量中,我们使用 hackbench 作为跑分软件,我们在测试过程中