2012-01-19 47 views
3

我已经交叉编译了一个Linux内核(对于i686上的ARM--使用Cross-LFS)。 现在我试图用QEMU启动这个内核。如何调试我的交叉编译的Linux内核?

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

然后,它显示这条线,并等待无限的时间!

Uncompressing Linux... done, booting the kernel. 

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

我对这些内核版本很陌生,有人可以帮助我调试我的定制内核,因为它甚至没有在该语句之后显示任何内容。内核是否有可能被破坏? (我不这么认为,b'se在编译时没有给出任何错误)

我的目标是生成一个非常小的Linux操作系统的定制构建。任何有关的任何工具链等建议,这将是很容易&灵活根据我的需求,如驱动程序等,

三江源

+0

有人可以帮助我! – inblueswithu

+0

有没有人知道这样的事情? plz帮助 – inblueswithu

回答

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 

你键入:文件hello_wrold查看二进制的目标架构,它应该是这样的:

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

现在,如果你想编译生产的内核,你需要优化它(我建议使用busybox),如果你现在想只是一个用来测试,试试这个步骤:

  1. 创建一个脚本设置你的链工具set_toolchai n.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

和运行脚本(source ./set_toolchain.sh

  1. 下载Linux内核,并且将它解压缩(假设2.6.x的,这是一个旧的内核,但也有很多机会,它没有编译错误主持工作)。

里面你解压缩内核:

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下。

希望得到这个帮助。

问候。

0

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

`

0

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