【问题标题】:Linux Kernel hangs waiting for interruptLinux内核挂起等待中断
【发布时间】:2020-01-07 02:00:25
【问题描述】:

我正在基于 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 ?? ()

任何想法可能是什么问题?为什么内核没有中断?

【问题讨论】:

  • 没有任何迹象表明它正在“等待中断”。我宁愿认为,它没有别的事可做(你应该检查根文件系统和初始化进程发生了什么)。
  • 在 init/main.c 中,在 start_kernel 中,最后调用 arch_call_rest_init。它不会返回。由于它在arch/arm64/include/asm/irqflags.h中的arch_local_irq_enable()中被阻止,我认为它正在等待中断。在 start_kernel 中调用 arch_call_rest_init() 之后会发生什么?
  • 内核应该执行用户空间init 进程,正如我所说。出于某种原因,它无法在您的设置中执行此操作。 ...irq_enable与等待无关,只是让当前CPU内核再次接收中断(这是为了保证关键地方内核线程不抢占)。
  • 是的,在等待中断之前,内核创建了一个线程 kernel_init,它应该执行一个用户空间的 init 进程。但是,这个 kernel_init 线程调用 schedule()..init/main.c -> kernel_init -> kernel_init_freeable -> kernel/workqueue.c -> workqueue_init -> init_rescuer -> kernel/kthread.c -> kthread_bind_mask -> wait_task_inactive->时间表()

标签: linux linux-kernel arm64


【解决方案1】:

@Sami 你得到了 过去 arch_local_irq_enable() 调用; gdb 仍然会从调用中看到推送的堆栈帧。我倾向于同意@oakad 的观点,即您的系统根本与您无关,并且要完成启动,您应该检查:

  1. 时间是否在流逝(即是否有计时器滴答声累积)?这让我很痛苦......你不会轻易获得没有滴答声的缓冲控制台输出。
  2. 此时您已经完成了对控制台的初始化。无论您喜欢通过 JTAG 调试器单步执行还是对控制台执行 printk() 调用,您都应该能够验证您是否处于 arch_cpu_idle() 循环中。
  3. 您能否验证您是否已挂载根文件系统?
  4. 如果是这样,当您在内核 cmdline 上指定 init=/bin/bash 时会发生什么?它应该带你进入一个简单的外壳,这总比没有好。您还应该在 cmdline 上使用 break={premount,mount,mountroot,modules,top,bottom,init} 进行调查,看看您离 init 有多远。

【讨论】:

    猜你喜欢
    • 2020-11-27
    • 1970-01-01
    • 2023-03-07
    • 1970-01-01
    • 1970-01-01
    • 2016-01-24
    • 2019-03-06
    • 2016-09-23
    • 1970-01-01
    相关资源
    最近更新 更多