loongson3A-4核cpu为每个处理器核都实现了8个核间中断寄存器(IPI)以支持多核BIOS启动核操作系统运行时在处理器核之间进行中断核通信。
这里主要说一下硬件相关的寄存器。
先总的看一张关于多核cpu的中断管理示意图:
这个图范围4列:
第一列表示中断源,也就是中断时由那个设备产生的;
第二列表示中断源对应的中断控制器上的那一位;
第三列表示中断路由控制寄存器,可以控制这个中断到底由那个cpu来进行处理;
第四列表示4个cpu的中断位(CP0寄存器中的位)
PS:这里的图示由错误,最后一列也就是第四列,这里的IP0-IP3,应该时IP2-IP5
上面图片上看到的32个中断,都是可以进行控制的,看一下中断控制时怎么对中断进行控制的,以及由那些寄存器:
intisr :中断状态(那个中断来了)
intenset :设置中断使能,inenset寄存器写1的位对应的中断被使能。
intenclr :清除中断使能
inten :表示当前中断由那些被使能
intedge :设置中断的触发方式,写1表示脉冲触发,写0表示电平触发.
对于中断控制器,每个寄存器都有其权限,由的寄存器可读写,有的寄存器只可读,有的寄存器只可写
看一下mips架构中对于这几个寄存器的权限设置:
框图中示例的32个中断,每个中断都有自己的中断路由寄存器,只要配置对应中断的寄存器就可以把这个中断路由到对应的cpu以及引脚上。
看一下每个中断对应的寄存器:
那有了寄存器,那怎么设置才能路由到对应的cpu的对应的引脚上呢?
这里呢也有专门的说明使用的:
OK拉,就这样设置就好了,还时不清楚?好吧,我当时也是这样的,那就说两个例子就好了。
例子1:路由LPC中断到cpu0的IP2上:
*(volatile unsigned char*)0x3ff0140b = 0x11
例子2:路由LPC中断到cpu0的IP3上
*(volatile unsigned char*)0x3ff0140b = 0x21
例子3:路由LPC中断到cpu1的IP2上
*(volatile unsigned char*)0x3ff0140b = 0x12
例子2:路由LPC中断到cpu2的IP3上
*(volatile unsigned char*)0x3ff0140b = 0x24
下面分别是每个核的寄存器,以及地址。
核0:
核2:
核3:
上面几个就是cpu间的通信寄存器,其功能就在第一个里面说了,对于mailbox的4个寄存器,具体功能还不清楚,再代码中还没有看到其是怎么使用的。
这里说一下核间通信的一个过程:
假如有一个中断要让cpu1进行处理,这样怎么做呢?
1,首先设置core1_IPI_set寄存器中该中断对应的位,那么此时再core1_IPI_status中就会显示出这个中断来了。
2,那么此时呢,再核1的CP0辅助寄存器中cause寄存器的IP6位就会置位,表示一个核间中断来了。
3,再中断处理函数里面,判断一下这个中断是否是IP6引起的,如果是呢,这就是一个核间中断拉,
4,再设置core1_IPI_clear的对应位,进行清中断操作
5,此时再调用对应引脚上的中断函数,进行处理。