Linux内核挂起等待中断

Linux内核挂起等待中断,linux,linux-kernel,arm64,Linux,Linux Kernel,Arm64,我将在基于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 0xffff8000

我将在基于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\u local\u irq\u enable()调用;gdb仍然可以从调用中看到推送的堆栈帧。我倾向于同意@oakad的观点,即您的系统根本不需要做任何事情,要完成引导,您应该检查:

  • 时间是否在流逝(即是否存在计时器滴答声)?这曾经咬过我。。。如果没有滴答声,您不容易得到缓冲控制台输出
  • 此时您已通过初始化控制台。无论您是希望通过JTAG调试器单步执行还是对控制台执行printk()调用,都应该能够验证您是否处于arch\u cpu\u idle()循环中
  • 您是否可以验证是否已装入根文件系统
  • 如果是这样,那么在内核cmdline上指定init=/bin/bash时会发生什么?它应该把你带进一个简单的壳里,这总比什么都没有好。您还应该在cmdline上使用break={premount,mount,mountroot,modules,top,bottom,init}进行研究,看看您离init有多远
  • @Sami您通过了arch\u local\u irq\u enable()调用;gdb仍然可以从调用中看到推送的堆栈帧。我倾向于同意@oakad的观点,即您的系统根本不需要做任何事情,要完成引导,您应该检查:

  • 时间是否在流逝(即是否存在计时器滴答声)?这曾经咬过我。。。如果没有滴答声,您不容易得到缓冲控制台输出
  • 此时您已通过初始化控制台。无论您是希望通过JTAG调试器单步执行还是对控制台执行printk()调用,都应该能够验证您是否处于arch\u cpu\u idle()循环中
  • 您是否可以验证是否已装入根文件系统
  • 如果是这样,那么在内核cmdline上指定init=/bin/bash时会发生什么?它应该把你带进一个简单的壳里,这总比什么都没有好。您还应该在cmdline上使用break={premount,mount,mountroot,modules,top,bottom,init}进行研究,看看您离init有多远

  • 没有任何迹象表明它正在“等待中断”。我更愿意认为,它与此无关(您应该检查根文件系统和init进程的情况)。而且它不会回来。由于它在arch/arm64/include/asm/irqflags.h中的arch\u local\u irq\u enable()中被阻塞,我认为它正在等待中断。启动内核中的arch\u call\u rest\u init()调用之后会发生什么?正如我所说,内核应该执行一个用户空间
    init
    进程。由于某些原因,它无法在您的设置上执行此操作
    …irq_enable
    与等待无关,它只允许当前CPU内核再次接收中断(用于确保在关键位置不抢占内核线程)。是的,在等待中断之前,内核创建一个线程kernel_init,该线程kernel_init本应执行用户空间初始化进程。但是,这个内核初始化线程调用schedule()。。init/main.c->kernel\u init->kernel\u init\u freeable->kernel/workqueue.c->workqueue\u init->init\u rescuer->kernel/kthread.c->kthread\u bind\u mask->wait\u task\u inactive->schedule()没有任何迹象表明它正在“等待中断”。我更愿意认为,它与此无关(您应该检查根文件系统和init进程的情况)。而且它不会回来。由于它在arch/arm64/include/asm/irqflags.h中的arch\u local\u irq\u enable()中被阻塞,我认为它正在等待中断。启动内核中的arch\u call\u rest\u init()调用之后会发生什么?正如我所说,内核应该执行一个用户空间
    init
    进程。由于某些原因,它无法在您的设置上执行此操作
    …irq_enable
    与等待无关,它只允许当前CPU内核再次接收中断(用于确保在关键位置不抢占内核线程)。是的,在等待中断之前,内核创建一个线程kernel_init,该线程kernel_init本应执行用户空间初始化进程。但是,这个内核初始化线程调用schedule()。。init/main.c->kernel\u init->kernel\u init\u freeable->kernel/workqueue.c->workqueue\u init->init\u rescuer->kernel/kthread.c->kthread\u bind\u mask->wait\u task\u inactive->schedule()