Linux内核的知识点

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 负载均衡的时候

posted on 2024-02-27 09:47  penglcool  阅读(27)  评论(0)    收藏  举报