如何调试我的Cross编译的Linux内核?

时间:2012-01-19 11:26:59

标签: linux debugging kernel cross-compiling qemu

我已经交叉编译了Linux内核(适用于i686上的ARM - 使用Cross-LFS)。 现在我正在尝试使用QEMU启动此内核。

$ qemu-system-arm -m 128 -kernel /mnt/clfs-dec4/boot/clfskernel-2.6.38.2 --nographic -M versatilepb

然后,它显示这一行并等待无限时间!!

Uncompressing Linux... done, booting the kernel.

所以,我想调试内核,以便我可以研究究竟发生了什么。

我是这些内核版本的新手,有人可以帮我调试我的自定义内核,因为它甚至没有在该语句后显示任何内容。内核是否有可能被破坏? (我不这么认为,但编译时没有出现任何错误)

我的目标是生成一个非常小的Linux操作系统。关于任何工具链等的任何建议都很容易和灵活取决于我的要求,如司机等。

THANKYOU

3 个答案:

答案 0 :(得分:4)

您可以使用GDB通过QEMU调试内核,您可以使用-s -S选项。如果您想要一个简单可靠的工具链,可以使用DENX的ELDK(http://www.denx.de/wiki/DULG/ELDK)。

您可以像这样安装它(这不是最后一个版本,但您明白了):

wget http://ftp.denx.de/pub/eldk/4.2/arm-linux-x86/iso/arm-2008-11-24.iso

sudo mkdir -p /mnt/cdrom(如有必要)

sudo mount -o loop arm-2008-11-24.iso /mnt/cdrom

/mnt/cdrom/install -d $HOME/EMBEDDED_TOOLS/ELDK/

上面的命令应该在$HOLE/EMBEDDED_TOOLS/ELDK下安装工具链(如果需要,可以修改它)

echo "export PATH=$PATH:$HOME/EMBEDDED_TOOLS/ELDK/ELDK42/usr/bin" >> $HOME/.bashrc

然后,您可以看到ARM工具链的版本,如下所示:

arm-linux-gcc -v

你可以像这样测试一个hello_world.c程序:

arm-linux-gcc hello_world.c -o hello_world

然后输入:file hello_wrold来查看二进制文件的目标体系结构,它应该是这样的:

hello_wrold: ELF 32-bit LSB executable, ARM, version 1 (SYSV)

现在,如果你想编译一个生产内核,你需要对它进行优化(我建议使用busybox),如果你现在只需要一个进行测试,请尝试以下步骤:

  1. 创建一个脚本来设置链工具set_toolchain.sh:

    #! /usr/bin/sh

    PATH=$PATH:$HOME/EMBEDDED_TOOLS/ELDK/ELDK42/usr/bin

    ARCH=arm

    CROSS_COMPILE=arm-linux-gnueabi-

    export PATH ARCH CROSS_COMPILE

  2. 运行您的脚本(source ./set_toolchain.sh

    1. 下载一个linux内核并解压缩它(让我们假设2.6.x,它是一个旧内核,但它有很多机会在没有编译错误的情况下工作)。
    2. 在解压缩的内核中:

      cd ~/linux-2.6.29/arch/arm/configs
      make versatile_defconfig
      

      此处我们使用多功能芯片,您可能需要使用make menuconfig修改选项OABI并将其设置为ARM EABI,此选项位于Kernel features menu

      完成所有这些步骤后,您可以编译内核:

      make
      

      如果您想要详细编译make v=1

      在此之后,您将内核置于arch/arm/boot/zImage下。

      希望得到这个帮助。

      问候。

答案 1 :(得分:0)

我建议您通过激活配置文件Kernel hacking部分中的选项来构建内核。 然后,您可以使用kdbkgdb,它更易于使用,但需要另一台正在运行gdb的计算机。

`

答案 2 :(得分:0)

您还可以连接Qemu和GDB。 Qemu具有运行GDB服务器的-s和-S选项,允许您通过TCP连接到localhost:1234。然后,您可以在GDB中加载内核映像(解压缩的映像),并查看内核启动的程度。