读代码细学内核中断机制-中断的响应

本文探讨了内核中断响应的过程,从设备如何借助中断控制器发起中断请求,到龙芯1B处理器的中断控制器结构,以及内核如何通过异常向量入口和中断处理函数来响应中断。详细阐述了中断控制器寄存器、cause寄存器、status寄存器的角色,并解释了中断下发函数plat_irq_dispatch的工作原理,最终调用do_IRQ函数进行中断处理。
摘要由CSDN通过智能技术生成

  在内核中断初始化完成并且设备注册了响应的中断后,内核就可以响应相应的中断了。

  首先要确定如果一个外设发出中断请求,它到底做了什么,设备是不能直接发出中断的,而是借助中断控制器,设备向中断控制器请求中断,这就是IRQ的来历。

  对于龙芯1B处理器来说,中断控制器有四条输出线接在了处理器上,也就是四条中断线,INT0~INT3,每条中断线对应32个中断源,而中断控制器寄存器的位域也就跟这32个中断源一一对应。

  每个设备控制器都有一条IRQ输出线和中断控制器寄存器的相应位相连,这样当相应设备控制器发出中断时,中断控制器寄存器相应位就置1,中断控制器就通过相应的中断输出线向内核发出中断,CP0协处理器寄存器cause寄存器的IP0~IP7相应位就置1。

  内核响应中断就是跳转到事先设定好的异常向量入口,前面说过,对于龙芯1B内核是在0x80000180,首先读取cause寄存器中的例外码,确定是哪一种通用异常,然后跳转到exception_handler数组相应的处理函数中。对于中断就是数组的0号成员,处理函数是handler_int,执行handler_int,这个函数中是检查status寄存器的全局中断标志位IE是否置1,然后跳转到plat_irq_dispatch,这个函数就是中断的下发函数了,读取出status寄存器的IM0~IM7,读出cau

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值