我已经交叉编译了一个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下.
希望能有所帮助.
问候.