linux - Linux内核挂起等待中断
问题描述
我正在基于 arm64 的嵌入式系统上启动 linux 内核 5.5.0-rc1。内核初始化完成。但在那之后,内核会不断地等待中断。下面是回溯
(gdb) bt
#0 arch_local_irq_enable () at /home/sami/linux/arch/arm64/include/asm/irqflags.h:37
#1 arch_cpu_idle () at /home/sami/linux/arch/arm64/kernel/process.c:126
#2 0xffff8000106eb8d4 in default_idle_call () at /home/sami/linux/kernel/sched/idle.c:94
#3 0xffff8000100d9e3c in cpuidle_idle_call () at /home/sami/linux/kernel/sched/idle.c:154
#4 do_idle () at /home/sami/linux/kernel/sched/idle.c:269
#5 0xffff8000100da07c in cpu_startup_entry (state=CPUHP_ONLINE) at /home/sami/linux/kernel/sched/idle.c:361
#6 0xffff8000106e5888 in rest_init () at /home/sami/linux/init/main.c:451
#7 0xffff8000109b09e4 in arch_call_rest_init () at /home/sami/linux/init/main.c:572
#8 0xffff8000109b0e14 in start_kernel () at /home/sami/linux/init/main.c:784
#9 0x0000000000000000 in ?? ()
任何想法可能是什么问题?为什么内核没有中断?
解决方案
@Sami 你通过了 arch_local_irq_enable() 调用;gdb 仍然会从调用中看到推送的堆栈帧。我倾向于同意@oakad 的观点,即您的系统根本无事可做,要完成引导,您应该检查:
- 时间是否在流逝(即是否有计时器滴答声累积)?这曾经让我感到痛苦……您不会轻易获得没有滴答声的缓冲控制台输出。
- 此时您已经完成了对控制台的初始化。无论您喜欢通过 JTAG 调试器单步执行还是对控制台执行 printk() 调用,您都应该能够验证您是否处于 arch_cpu_idle() 循环中。
- 你能确认你已经挂载了一个根文件系统吗?
- 如果是这样,当您在内核命令行上指定 init=/bin/bash 时会发生什么?它应该带你进入一个简单的外壳,这总比没有好。您还应该在 cmdline 上使用 break={premount,mount,mountroot,modules,top,bottom,init} 进行调查,看看您离 init 有多远。
推荐阅读
- typescript - 当我映射和展平数组时,TypeScript 错误地出错?
- logging - 是否有软件或脚本可以记录我对 MadCap Flare 中的项目文件所做的更改?
- xslt - [错误] 评估 xsl:variable 时无法执行 xsl:result-document 的原因是什么?(使用 XSpec)
- java - JDA getMembers() 只返回自机器人启动以来在聊天中写过的用户?
- html - Bootstrap4 选项卡面板不切换面板
- android - 迁移以将新数据行插入 Room DB
- javascript - Reactjs 材料 ui 文本字段编号最大值和最小值
- python - 为什么我们要在 def __init__(self, n) -> None: 中使用 ->?
- c++ - 在 OpenGL 调试期间未加载 atio6axx.pdb
- typescript - Typescript:类型检查中间件