ARM64 Linux kernel + busybox rootFS via NFS over QEMU with GDB

本文介绍了如何在X64 Linux环境下搭建ARM64 Linux kernel模拟运行环境,包括使用QEMU、通过NFS挂载busybox rootFS以及利用GDB进行kernel调试。详细步骤涵盖从下载工具链、编译busybox、构建rootFS、下载内核、编译内核、QEMU的配置与使用,直至最终的GDB调试。
摘要由CSDN通过智能技术生成

由于条件所限,一般选择软件做前期模拟,这里做一些ARM 64 Linux kernel模拟运行环境搭建工作的总结,记录以便后用。
本文只涉及kernel + busybox rootFS via NFS over QEMU,以及gdb trace kernel。

主机环境选择

这里所说主机指模拟软件运行在上面的主机,本文只针对在X64 Linux主机上搭建ARM64 Linux kernel运行环境。
主机选择除了考虑性能高的X64,同时也要考虑编译调试ARM64 Linux kernel的工具链、模拟软件如QEMU等等需求。
X64 Ubuntu 16.04已经可以通过apt-get直接下载aarch64交叉工具链和qemu-system-aarch64:
# aarch64-linux-gnu-gcc -v
Using built-in specs.
COLLECT_GCC=aarch64-linux-gnu-gcc
COLLECT_LTO_WRAPPER=/usr/lib/gcc-cross/aarch64-linux-gnu/5/lto-wrapper
Target: aarch64-linux-gnu
Configured with: ../src/configure -v –with-pkgversion=’Ubuntu/Linaro 5.4.0-6ubuntu1~16.04.4’ –with-bugurl=file:///usr/share/doc/gcc-5/README.Bugs –enable-languages=c,ada,c++,java,go,d,fortran,objc,obj-c++ –prefix=/usr –program-suffix=-5 –enable-shared –enable-linker-build-id –libexecdir=/usr/lib –without-included-gettext –enable-threads=posix –libdir=/usr/lib –enable-nls –with-sysroot=/ –enable-clocale=gnu –enable-libstdcxx-debug –enable-libstdcxx-time=yes –with-default-libstdcxx-abi=new –enable-gnu-unique-object –disable-libquadmath –enable-plugin –with-system-zlib –disable-browser-plugin –enable-java-awt=gtk –enable-gtk-cairo –with-java-home=/usr/lib/jvm/java-1.5.0-gcj-5-arm64-cross/jre –enable-java-home –with-jvm-root-dir=/usr/lib/jvm/java-1.5.0-gcj-5-arm64-cross –with-jvm-jar-dir=/usr/lib/jvm-exports/java-1.5.0-gcj-5-arm64-cross –with-arch-directory=aarch64 –with-ecj-jar=/usr/share/java/eclipse-ecj.jar –disable-libgcj –enable-multiarch –enable-fix-cortex-a53-843419 –disable-werror –enable-checking=release –build=x86_64-linux-gnu –host=x86_64-linux-gnu –target=aarch64-linux-gnu –program-prefix=aarch64-linux-gnu- –includedir=/usr/aarch64-linux-gnu/include
Thread model: posix
gcc version 5.4.0 20160609 (Ubuntu/Linaro 5.4.0-6ubuntu1~16.04.4)
#qemu-system-aarch64 -machine virt -cpu help
Available CPUs:
arm1026
arm1136
arm1136-r2
arm1176
arm11mpcore
arm926
arm946
cortex-a15
cortex-a53
cortex-a57
cortex-a8
cortex-a9
cortex-m3
cortex-m4
cortex-r5
pxa250
pxa255
pxa260
pxa261
pxa262
pxa270-a0
pxa270-a1
pxa270
pxa270-b0
pxa270-b1
pxa270-c0
pxa270-c5
sa1100
sa1110
ti925t
#
这样就非常方便了。

Toolchains

GNU Tool Chain是Linux内核常见的(交叉)工具链,
请注意Linaro提供Linux下工具链(https://releases.linaro.org/components/toolchain/binaries/)采用动态连接而非静态连接,需要一些更高版本的支撑软件,可能会影响CentOS release 6.8系统。

本文只针对CentOS release 6.8 (Final) X64环境,采用厂家提供的静态连接方式的交叉编译器,不需要其他版本支撑软件,不涉及其他选择。
root用户bash下设置工具链环境:
# export ARCH=arm64
# export CROSS_COMPILE=aarch64-XXXX-linux-gnu-
# export PATH=/opt/XXXX/bin:$PATH
(一般不需要设置LD_LIBRARY_PATH)
编译busybox、QEMU及内核时需要一些支撑软件,可以通过yum直接下载安装。

Busybox

下载busybox:

# wget -c https://busybox.net/downloads/busybox-1.25.1.tar.bz2

编译busybox:

进入解压后的busybox-1.25.1目录
# make menuconfig
选择Busybox Settings —>Build Options —>[*] Build BusyBox as a static binary (no shared libs)
保存配置后
# make;make install

构造rootFS

拷贝busybox-1.25.1目录下生成的_install目录到/opt目录
# cp -a _install /opt
进入/opt/_install目录手工创建rootFS相关文件与目录
# cd /opt/_install
# mkdir ­pv etc/init.d dev
# cat > etc/init.d/rcS
mkdir -p /sys /proc /tmp
/bin/mount -a
mkdir -p /dev/pts
mount -t devpts devpts /dev/pts
echo /sbin/mdev > /proc/sys/kernel/hotplug
mdev -s
^C
# chmod a+x etc/init.d/rcS
rcS必须可执行
#
# cat > etc/fstab
proc /proc proc defaults 0 0
tmpfs /tmp tmpfs defaults 0 0
sysfs /sys sysfs defaults 0 0
tmpfs /dev tmpfs defaults 0 0
^C
# cat > etc/inittab
::sysinit:/etc/init.d/rcS
::respawn:-/bin/sh
::askfirst:-/bin/sh
::ctrlaltdel:/bin/umount -a -r
^C
# mknod console c 5 1
# mknod null c 1 3
#
到这一步基于busybox简单的rootFS就创建完成。

通过NFS导出busybox rootFS

# cat > /etc/exports
/opt/_install *(rw,sync,no_root_squash,insecure,no_subtree_check)
^C
# /etc/init.d/nfs reload
# exportfs -favr
# showmount -e localhost
# mount -t nfs -nolock localhost:/opt/_install/ /mnt
# umount /mnt
NFS验证通过。

Linux Kernel

下载内核

# wget -c https://cdn.kernel.org/pub/linux/kernel/v4.x/linux-4.9.tar.xz下载4.9内核。

编译内核

进入解压缩后的linux-4.9目录
# make defconfig
# make menuconfig
选择Kernel Features —>Page size (4KB)
Virtual address space size (48-bit)
保存配置,然后编译生成内核Image
# make -j`getconf _NPROCESSORS_ONLN`
内核Image在:
# ls arch/arm64/boot/Image
arch/arm64/boot/Image
#
到这里kernel Image和busybox rootFS都已经制好。

QEMU

下载QEMU

wget -c http://wiki.qemu-project.org/download/qemu-2.8.0.tar.bz2

编译QEMU

进入解压缩后的qemu-2.8.0目录
# cd qemu-2.8.0
# mkdir -p bin/debug/native
# cd bin/debug/native
# ../../../configure –enable-debug
# m

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值