Linux 升级Binutils和GCC后x86_64上的内核未启动

Linux 升级Binutils和GCC后x86_64上的内核未启动,linux,gcc,linux-kernel,binutils,grub,Linux,Gcc,Linux Kernel,Binutils,Grub,我在控制台上看不到任何日志(甚至看不到“解压缩Linux…”消息) 我在内核配置下启用了任何早期引导打印,至少我知道这一点(请参阅下面的内核配置) 尝试使用KDB停止内核-在grub中的内核命令行参数末尾添加kgdbwait 我试图从grub手动启动内核 我试图在函数中添加panic()或日志: asmlinkage void\uuu init start\u内核(void)(init/main.c) 添加/更改/删除loglevel=verbose内核命令行参数(在GRUB中) 从内核命令行参

我在控制台上看不到任何日志(甚至看不到“解压缩Linux…”消息)

  • 我在内核配置下启用了任何早期引导打印,至少我知道这一点(请参阅下面的内核配置)
  • 尝试使用KDB停止内核-在grub中的内核命令行参数末尾添加kgdbwait
  • 我试图从grub手动启动内核
  • 我试图在函数中添加panic()或日志: asmlinkage void\uuu init start\u内核(void)(init/main.c)
  • 添加/更改/删除loglevel=verbose内核命令行参数(在GRUB中)
  • 从内核命令行参数中删除“quiet”(在GRUB中)
  • 向内核命令行参数添加crashkernel(在GRUB中)
  • 我的问题是:

    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
    
    内核配置

    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
    

    我是在用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
    
    commit 5f020130d5360e8266e369dc2b5f4e32ec5b05f4(HEAD->my_commit)
    作者:安迪·卢托米尔斯基
    日期:2015年5月22日星期五16:15:47-0700
    
    您是否尝试过“cat/var/log/boot.log”?我无法获得bash提示符,它只是冻结了。注意:当机器使用内核引导(使用旧的GCC编译)时,我的机器下没有/var/log/boot.log文件