多核cpu通信的相关寄存器

来源:互联网 发布:什么是算法的复杂性 编辑:程序博客网 时间:2024/05/18 01:53

loongson3A-4核cpu为每个处理器核都实现了8个核间中断寄存器(IPI)以支持多核BIOS启动核操作系统运行时在处理器核之间进行中断核通信。

这里主要说一下硬件相关的寄存器。

1,中断框图

先总的看一张关于多核cpu的中断管理示意图:



这个图范围4列:

第一列表示中断源,也就是中断时由那个设备产生的;

第二列表示中断源对应的中断控制器上的那一位;

第三列表示中断路由控制寄存器,可以控制这个中断到底由那个cpu来进行处理;

第四列表示4个cpu的中断位(CP0寄存器中的位)

PS:这里的图示由错误,最后一列也就是第四列,这里的IP0-IP3,应该时IP2-IP5


2,中断控制器寄存器

上面图片上看到的32个中断,都是可以进行控制的,看一下中断控制时怎么对中断进行控制的,以及由那些寄存器:


intisr       :中断状态(那个中断来了)

intenset :设置中断使能,inenset寄存器写1的位对应的中断被使能。

intenclr :清除中断使能

inten      :表示当前中断由那些被使能

intedge :设置中断的触发方式,写1表示脉冲触发,写0表示电平触发.


对于中断控制器,每个寄存器都有其权限,由的寄存器可读写,有的寄存器只可读,有的寄存器只可写

看一下mips架构中对于这几个寄存器的权限设置:



3,中断路由寄存器

框图中示例的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



4,核间通信寄存器

结下来看一下每个cpu中的核间通信寄存器以及其起到的作用:


下面分别是每个核的寄存器,以及地址。

核0:


核1:


核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,此时再调用对应引脚上的中断函数,进行处理。