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 发送补丁...
init 线程和 运行 系统行为不同的原因是运行时电源管理,它会在内核加载后禁用 PCIe 核心时钟。
我在使用 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 发送补丁...
init 线程和 运行 系统行为不同的原因是运行时电源管理,它会在内核加载后禁用 PCIe 核心时钟。