我已经交叉编译了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
答案 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
),如果你现在只需要一个进行测试,请尝试以下步骤:
创建一个脚本来设置链工具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
运行您的脚本(source ./set_toolchain.sh
)
在解压缩的内核中:
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
部分中的选项来构建内核。
然后,您可以使用kdb
或kgdb
,它更易于使用,但需要另一台正在运行gdb
的计算机。
`
答案 2 :(得分:0)
您还可以连接Qemu和GDB。 Qemu具有运行GDB服务器的-s和-S选项,允许您通过TCP连接到localhost:1234。然后,您可以在GDB中加载内核映像(解压缩的映像),并查看内核启动的程度。