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

我已经交叉编译了一个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 OS.关于任何工具链等的任何建议都是容易的&灵活,具体取决于我对驱动程序等的要求,

谢谢

解决方法:

您可以使用GDB通过QEMU调试内核,也可以使用-s -S选项.如果您想要一个简单而可靠的工具链,则可以使用DENX(http://www.denx.de/wiki/DULG/ELDK)中的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),如果现在只想测试一个,请尝试以下步骤:

>创建脚本来设置链工具set_toolchain.sh:

#! /usr/bin/sh

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

ARCH =手臂

CROSS_COMPILE = arm-linux-gnueabi-

导出PATH ARCH CROSS_COMPILE

并运行您的脚本(源./set_toolchain.sh)

>下载一个Linux内核并将其解压缩(假设2.6.x是一个旧的内核,但是有很多机会可以运行而不会出现编译错误).

在解压缩的内核中:

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

在这里我们使用通用芯片,您可能需要使用make menuconfig来修改选项OABI并将其设置为ARM EABI,此选项位于内核功能菜单下

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

make

如果您要进行详细的编译,请使v = 1

之后,您将内核放在arch / arm / boot / zImage下.

希望能有所帮助.

问候.

上一篇:【转载】x86 平台安装arm虚拟机


下一篇:构建调试Linux内核网络代码的环境MenuOS系统