前提:在一个进程运行过程中发生了硬件异常,被硬件检测到,通知内核,然后内核给该异常发生时正在运行的进程发送信号(立即传递无延时)。
思考题:ARM在这里有一个工作模式的切换,运行在用户模式下的程序进行了某些软件操作,发生了硬件异常,这时CPU切换到一般中断IRQ模式,在这个模式下处理这个硬件异常中断,将这个硬件异常通知内核(我在这里有一个疑问,ARM这里有没有再进行一次工作模式切换,会不会进入到SYS系统模式,切换到这个工作模式下,还是说linux内核直接运行在IRQ模式下),内核得知发生了一个硬件异常(单CPU的话这时候之前的进程应该被内核抢占,内核产生一个信号量,发送给产生硬件异常的进程,多核的话该进程和内核有可能并行,内核将信号发送出去)。
问题:在CPU处理中断的过程中内核究竟运行在哪一种工作模式下?
ARM的工作模式切换有两种方法:
被动切换---在ARM运行的时候产生一些异常或中断来自动进行模式的切换。
主动切换---通过软件改变,即软件设置寄存器来进行ARM的模式切换。
所以之前的问题就可以解决了,硬件异常属于被动切换,linux系统从用户态进入内核态。
内核运行在除了usr模式之外的其他特权模式,但是当异常处理完毕后应返回之前的工作模式。
所以内核应该运行在irq模式下。
总结:linux用户程序通过主动或被动的方式,进入内核态,ARMcpu的工作模式也就相对应的从usr模式切换到特权级模式。