Linux Ядро зависает в ожидании прерывания - PullRequest
1 голос
/ 07 января 2020

Я поднимаю linux ядро ​​5.5.0-rc1 на встроенной системе на базе arm64. Инициализация ядра завершена. но после этого ядро ​​непрерывно ожидает прерывания. ниже приведена обратная трассировка

(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 ?? ()

Есть идеи, в чем может быть проблема? почему ядро ​​не получает прерывания?

1 Ответ

0 голосов
/ 14 января 2020

@ Сами Вы получили мимо вызова arch_local_irq_enable (); GDB по-прежнему видит кадр вызова в стеке. Я склонен согласиться с @oakad, что ваша система просто не имеет ничего общего, и для завершения sh загрузки вы должны проверить:

  1. Проходит ли время (т.е. накапливаются ли тики таймера)? Это укусило меня раньше ... вы не можете получить буферизованный вывод консоли без галочек.
  2. Вы уже прошли инициализацию консоли на этом этапе. Независимо от того, предпочитаете ли вы проходить через JTAG-отладчик или выполнять вызовы printk () на консоль, вы сможете проверить, находитесь ли вы в arch_cpu_idle () l oop.
  3. Можете ли вы проверить что вы смонтировали файловую систему root?
  4. Если так, что произойдет, если вы укажете init = / bin / bash в командной строке ядра? Это должно привести вас в простую оболочку, которая лучше, чем ничего. Вы также должны исследовать, используя break = {premount, mount, mount root, modules, top, bottom, init} в командной строке, чтобы увидеть, как далеко вы продвигаетесь к init.
...