1、发生硬件中断后,ARM处理器做了哪些事情?
答:当CPU感知到中断发生后,硬件会自动做如下一些事情:
1)保存中断发生时CPSR寄存器的内容到SPSR_irq寄存器中;
2)修改CPSR寄存器,让CPU进入处理器模式(processor mode)中的IRQ模式,即CPSR寄存器中的M域设置为IRQ Mode。
3)硬件自动关闭IRQ或FIQ,即CPSR中的IRQ位或FIQ位置1。
4)保存返回地址到LR_irq寄存器中。
5)硬件自动跳转到中断向量表的IRQ向量中。
当从中断返回时需要软件实现如下两个操作:
1)从SPSR_irq寄存器中恢复数据到CPSR中。
2)从LR_irq中恢复内容到PC中,从而返回到中断点的下一个指令处执行。
上述是ARM处理器检测到IRQ中断后自动做的事情,软件需要做的事情从中断向量表开始。
2、Linux内核调度的时机有哪些?
答:Kernel 判断当前进程标记是否为 TIF_NEED_RESCHED,是的话调用 schedule 函数,执行调度,切换上下文,这也是上面抢占(preempt)机制的本质。那么在哪些情况下会执行 schedule 呢?
__schedule()函数是调度器的核心函数,其作用是让调度器选择和切换到一个合适进程运行。调度的时机可以分为以下3种:
1)阻塞操作:互斥量,信号量,等待队列(waitqueue)等;
2)用户态抢占:在中断返回前和系统调用返回用户空间时,去检查TIF_NEED_RESCHED标志位以判断是否需要调度;ret_to_user 是异常触发,系统调用,中断处理完成后都会调用的函数。
3)将要被唤醒的进程
4)主动调用schedule函数
3、那么,什么时候设置TIF_NEED_RESCHED呢 ?
答:1)scheduler_tick 时钟中断;
2)wake_up_process 唤醒进程的时候;
3)do_fork 创建新进程的时候
4)set_user_nice 修改进程nice值的时候
5)smp_send_reschedule 负载均衡的时候
标签:知识点,中断,IRQ,Linux,调度,内核,寄存器,irq,CPSR From: https://www.cnblogs.com/penglcool/p/18036228