ARM Cortex A9中的处理器间中断(如何在Linux中为软件生成的中断(ARM)编写处理程序?)

Nue*_*ino 4 arm linux-kernel interrupt-handling

我读到ARM中软件生成的中断被用作处理器间中断.我还可以看到其中5个中断已经在使用中.我也知道ARM提供了16个软件生成的中断.

在我的应用程序中,我正在运行ARM-cortex内核和Linux上的裸机应用程序.我想将运行裸机应用程序的核心数据传递给运行Linux的核心.我计划将数据复制到片上存储器(共享),然后我将在Core(运行linux)上触发一个SGI来指示一些数据可供它处理.现在我能够从核心(运行裸机应用程序)生成SGI.但是为了处理linux端的中断,我不确定SGI IRQ号是免费的,我也不确定我是否可以直接使用IRQ号(一般SGI是0-15).有没有人知道如何在Linux中为SGI编写处理程序?

编辑: 这是上述文本的重新措辞,因为该问题因SSCE原因而被关闭.Cortex-A CPU用于多CPU系统.ARM 通用中断控制器(GIC)监视所有全局中断并将它们分派给特定的CPU.为了使各个CPU相互发信号,软件生成中断(SGI)从一个核心发送到另一个核心; 这使用外围专用中断(PPI).这个问题是,

如何实现可以接收SGI作为PPI的Linux内核驱动程序?

art*_*ise 6

有没有人知道如何在Linux中为SGI编写处理程序?

由于您没有提供Linux版本,我将假设您使用最新版本(或至少是最近版本).ARM GIC具有设备树绑定.通常,您需要在设备树节点中指定SGI中断号,

 ipc: ipc@address {
        compatible = "company,board-ipc"; /* Your driver */
        reg = <address range>;
        interrupts = <1 SGI 0x02>;  /* SGI is your CPU interrupt. */
        status = "enabled";
 };
Run Code Online (Sandbox Code Playgroud)

中断节中的第一个数字表示PPI.的SGI将可能是0-15之间,因为这是在SGI中断可被(至少在一个的Cortex-A5).

然后你可以使用platform_get_irq()你的驱动程序来获得PPI(外设私有中断).我想这个地址是你希望进行通信的共享内存(物理); 也许reg是不合适的,但我认为它会起作用.这个区域将由Linux MMU重新映射,你可以使用它,

res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
mem = devm_ioremap_resource(dev, res);
Run Code Online (Sandbox Code Playgroud)

地址在上面的设备树是物理地址的十六进制值.本platform_get_irq()应该返回一个IRQ号,你可以用用request_irq()家庭的功能.只需将此连接到您的日常工作.

编辑:不幸的是,Linux irq-gic.c禁止低于16的中断.例如,gic_handle_irq()将处理程序限制为16到1020之间的中断.如果启用了SMP,则会handle_IPI()调用感兴趣的中断.gic_raise_softirq()可用于发出中断信号.要使用当前的Linux 处理SGI,smp.c需要额外的enum ipi_msg_type值和代码来处理这些内容handle_IPI().它看起来像新的内核(3.14+吧?)可能会增加set_ipi_handler()smp.c作出这样的修改不需要的.