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

Posted

技术标签:

【中文标题】升级 Binutils 和 GCC 后 x86_64 上的内核无法启动【英文标题】:Kernel on x86_64 not boot after upgrading Binutils and GCC 【发布时间】:2018-08-13 03:31:45 【问题描述】:

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

    我在内核配置下启用了任何 Early Boot 打印,至少我知道(参见下面的内核配置) 尝试使用 KDB 停止内核 - 通过在 grub 中的内核命令行参数末尾添加 kgdbwait 我尝试从 grub 手动引导内核 我尝试在函数中添加 panic() 或日志: asmlinkage void __init start_kernel(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

海合会: 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

【问题讨论】:

你试过'cat /var/log/boot.log'吗? 我无法获得 bash 提示,它只是冻结了。注意:当机器使用内核(使用旧的GCC编译)启动时,我的机器下没有/var/log/boot.log文件 【参考方案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

【讨论】:

以上是关于升级 Binutils 和 GCC 后 x86_64 上的内核无法启动的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Mac OS X 主机上为 MIPS 目标构建 GCC 4.8.x

Linux 桌面玩家指南:08. 使用 GCC 和 GNU Binutils 编写能在 x86 实模式运行的 16 位代码

无法执行'x86_64-conda_cos6-linux-gnu-gcc':没有这样的文件或目录(pysam安装)

ubuntu操作系统升级

Linux ubuntu 3.11.0-12-generic 下oracle12c的基础rpm安装包,具体版本往下看

redhat 6.5升级openssh和openssl