升级Binutils和GCC后,x86_64上的内核无法启动

时间:2018-03-05 13:02:05

标签: linux gcc linux-kernel binutils grub

我无法在控制台上看到任何日志(甚至没有“解压缩Linux ...”消息)。

  1. 我在内核配置下启用了任何Early Boot打印,至少我知道(见下面的内核配置)
  2. 尝试使用KDB停止内核 - 在grub中的内核命令行参数末尾添加kgdbwait
  3. 我尝试从grub手动启动内核
  4. 我尝试在函数中添加 panic()或日志: asmlinkage void __init start_kernel(void)(init / main.c)
  5. 添加/更改/删除了 loglevel = verbose 内核命令行参数(在GRUB中)
  6. 从内核命令行参数(在GRUB中)删除“安静
  7. crashkernel 添加到内核命令行参数(在GRUB中)
  8. 我的问题:

    1)我还能做些其他方法来获取早期启动日志吗?

    2)我是否需要添加任何其他代码到内核调试它?

    3)有没有其他方法可以调试它?

    Binutils的: 2.26.1 的binutils-2.26.1-1.fc25.src.rpm

    GCC 6.4.1 gcc-6.4.1-1.fc25.src.rpm

    内核: 3.10.0-514.21.1

    GRUB配置

    default=0
    timeout=3
    serial --unit=0 --speed=115200 --word=8 --parity=no --stop=1
    terminal --timeout=34 serial console
    
    title XIV-System
            root (hd0,0)
            kernel /boot/vmlinuz init=/system/my_init console=tty0 mce=0 i8042.noaux idle=poll scsi_mod.inq_timeout=2 selinux=0 nohpet console=ttyS0,115200 earlyprintk=ttyS0,115200 kgdboc=ttyS0,115200 ro crashkernel=auto 
    

    内核配置

    - For verbos boot message
    
    CONFIG_X86_VERBOSE_BOOTUP=y
    
     - For early printk
    
    CONFIG_EARLY_PRINTK=y
    
    CONFIG_EARLY_PRINTK_DBGP=y
    
     - For KGDB
    
    CONFIG_KGDB_LOW_LEVEL_TRAP=y
    
    CONFIG_KGDB_KDB=y
    
    CONFIG_SERIAL_KGDB_NMI=y
    
    CONFIG_HAVE_ARCH_KGDB=y
    
    CONFIG_KGDB=y
    
    CONFIG_KGDB_SERIAL_CONSOLE=y
    
    CONFIG_KGDB_TESTS=y
    
     - For KDB
    
    CONFIG_KDB_KEYBOARD=y
    
    CONFIG_KDB_CONTINUE_CATASTROPHIC=0
    

1 个答案:

答案 0 :(得分:1)

我只是在使用gdb调试内核(早期启动阶段)后才设法解决问题,基本上我发现内核失败了:

(gdb) bt
#0  early_idt_handler () at arch/x86/kernel/head_64.S:407
#1  0xffff9fffffffffff in ?? ()
#2  0xffffff07ffffffff in ?? ()
#3  0xffffe0ffffffffff in ?? ()
#4  0x00000e0000000000 in ?? ()
#5  0xffffffff81bee8a0 in ?? ()
#6  0xffff880000014560 in ?? ()
#7  0xffffffff819c0120 in early_idt_handler () at arch/x86/kernel/head_64.S:374
#8  0x0000000000000400 in irq_stack_union ()
#9  0xffffffff81bee8a0 in ?? ()
#10 0x000000000000000f in irq_stack_union ()
#11 0x0000000000000000 in ?? ()

从他们那里我查看了内核源代码树(对于与head_64.S相关的补丁)并应用它。你可以找到补丁,它与以下内容有关:

commit 5f020130d5360e8266e369dc2b5f4e32ec5b05f4 (HEAD -> my_commit)
Author: Andy Lutomirski <luto@kernel.org>
Date:   Fri May 22 16:15:47 2015 -0700