Linux 内核初始化线程中未处理的信号

Signals not handled in Linux kernel init thread

我在使用 Linux 内核时遇到以下问题:当内核正在加载驱动程序的初始化线程中出现信号(异常)时,该信号未以任何方式处理,导致系统冻结。甚至无法使用调试器。

但是,当内核启动后在用户进程上发出相同的信号时,它会被捕获并且不会导致系统冻结:

# devmem2 0x51002104 w
/dev/mem opened.[  206.043479] 8<--- cut here ---
[  206.047808] Unhandled fault: asynchronous external abort (0x1211) at 0x00000000    
[  206.055149] pgd = b7e0d3b2
[  206.057865] [00000000] *pgd=a8fc7003, *pmd=00000000

Memory mapped at address 0xb6f2d000.
Bus error

在pcie-keystone.c驱动中,有如下信号处理程序:

#ifdef CONFIG_ARM
    /*
     * PCIe access errors that result into OCP errors are caught by ARM as
     * "External aborts"
     */
    hook_fault_code(17, ks_pcie_fault, SIGBUS, 0,
            "Asynchronous external abort");
#endif

在我的代码中设置类似的处理程序没有帮助。当驱动程序在初始化过程完成后作为模块加载时,信号也不会冻结系统。

请Linux内核专家指教,内核配置中是否有隐藏选项?还是平台初始化有缺失,导致init线程配置不全,无法处理信号?我在ARM AM5728机器上。

我前一段时间又回到了这个问题。根本原因是在某些情况下,没有抛出任何 ARM 异常,硬件只是冻结内存总线和 CPU.

我修改了 pipe3 PCIe PHY 驱动程序,以便它在让 PCIe 核心开始初始化之前检查 APLL 是否被锁定。这在 AM57x TRM 中提到但未在主线 Linux 驱动程序中实现。也许稍后会向 LKML 发送补丁...

问题与此非常相似:https://e2e.ti.com/support/processors-group/processors/f/processors-forum/615543/am5728-pcie-access-hangs-dsp-and-arm

init 线程和 运行 系统行为不同的原因是运行时电源管理,它会在内核加载后禁用 PCIe 核心时钟。