编译内核,构建linux根文件系统,使用qemu调试内核
2021/11/15 7:09:41
本文主要是介绍编译内核,构建linux根文件系统,使用qemu调试内核,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
环境:Ubuntu 20.04 LTS, Linux ubuntu 5.4.0-29-generic
运行的qemu虚机为arm64。
完整详细操作命令如下:
# prepare environment. install arm64 cross compiler
apt install gcc-10-aarch64-linux-gnu
apt install build-essential
apt install gdb-multiarch
apt install libncurses5-dev
ln -s aarch64-linux-gnu-gcc-10 aarch64-linux-gnu-gcc
ln -s aarch64-linux-gnu-gcc-ar-10 aarch64-linux-gnu-gcc-ar
ln -s aarch64-linux-gnu-cpp-10 aarch64-linux-gnu-cpp
ln -s aarch64-linux-gnu-gcc-nm-10 aarch64-linux-gnu-gcc-nm
ln -s aarch64-linux-gnu-gcov-10 aarch64-linux-gnu-gcov
ln -s aarch64-linux-gnu-gcc-ranlib-10 aarch64-linux-gnu-gcc-ranlib
ln -s aarch64-linux-gnu-gcov-dump-10 aarch64-linux-gnu-gcov-dump
ln -s aarch64-linux-gnu-gcov-tool-10 aarch64-linux-gnu-gcov-tool
# get busybox and kernel source code
wget https://cdn.kernel.org/pub/linux/kernel/v4.x/linux-4.9.290.tar.xz
wget https://cdn.kernel.org/pub/linux/kernel/v4.x/patch-4.9.290.xz
wget https://busybox.net/downloads/busybox-1.34.1.tar.bz2
# config and compile busybox
tar jxf busybox-1.34.1.tar.bz2
cd busybox-1.34.1/
make menuconfig
# make menuconfig setting
Settings --->
--- Build Options
[*] Build static binary (no shared libs)
Cross compiler prefix
aarch64-linux-gnu-
--- Installation Options ("make isntall" behavior)
What kind of applet lins to install (sl soft-links) --->
(./_install) Destination path for 'make isntall' (NEW)
make
make install
ls _install/
cd ..
mkdir -p qemu-arm/rootfs
cd qemu-arm/
cp ../busybox-1.34.1/_install/* rootfs/ -fr
cd rootfs/
mkdir dev etc lib proc sys tmp var root mnt
cd dev
mknod console c 5 1
mknod null c 1 3
mknod tty1 c 4 1
cd ..
# copy c run time lib
cp -a /usr/aarch64-linux-gnu/lib/*so* ./lib/
cd etc
cp -a ../../busybox-1.34.1/examples/bootfloppy/etc/* ./etc/
vim inittab
--->
::sysinit:/etc/init.d/rcS
::respawn:-/bin/sh
#tty2::askfirst:-/bin/sh
::askfirst:-/bin/sh
::ctrlaltdel:/bin/reboot
::shutdown:/sbin/swapoff -a
::shutdown:/bin/umount -a -r
::restart:/sbin/init
<---
vim init.d/rcS
--->
#! /bin/sh
/bin/mount -a
/bin/mkdir -p /dev/pts
/bin/mount -t devpts devpts /dev/pts
/bin/echo /sbin/mdev > /proc/sys/kernel/hotplug
/sbin/mdev -s
<---
vim fstab
--->
proc /proc proc defaults 0 0
sysfs /sys sysfs defaults 0 0
tmpfs /tmp tmpfs defaults 0 0
tmpfs /dev tmpfs defaults 0 0
<---
vim profile
--->
# /etc/profile: system-wide .profile file for the Bourne shells
echo
echo -n "Processing /etc/profile... "
export HOSTNAME=aarch64
export USER=root
export HOME=/root
export PS1="[$USER@$HOSTNAME:\$PWD]\#"
export PATH=/bin:/sbin:/usr/bin/:/usr/sbin
export LD_LIBRARY_PATH=/lib:/usr/lib:$LD_LIBRARY_PATH
# no-op
echo "Done"
echo
<---
# build kernel
xz -d linux-4.9.290.tar.xz
tar xf linux-4.9.290.tar
mkdir kernel-source/
cp ../linux-4.9.290 kernel-source/ -fr
cd kernel-source/linux-4.9.290
cp ../../qemu-arm/rootfs _install -fr
export ARCH=arm64
export CROSS_COMPILE=aarch64-linux-gnu-
# use default aarch64 config
make defconfig
make menuconfig
# change initramfs dir: _install
General setup --->
[*]Initial RAM filesystem and RAM disk (initramfs/initrd) support
(_install) Initramfs source file(s)
# delete default boot arg
Boot options --->
() Default kernel command string
# change address line to 48bit
Kernel Features --->
Page size(4KB) --->
Virtual address space size (48-bit) --->
# add debuginfo to kernel compile
Kernel hacking --->
Compile-time checks and compiler options --->
[*] Compile the kernel with debug info
# exit and save then make
make -j4
# run qemu virtual machine
cp arch/arm64/boot/Image.gz ../../qemu-arm/
cd ../../qemu-arm/rootfs/
qemu-system-aarch64 -machine virt -cpu cortex-a57 -nographic -smp 2 -m 2048 -kernel Image.gz -append "rdinit=/linuxrc console=ttyAMA0"
# gdb debug
# first console
qemu-system-aarch64 -machine virt -cpu cortex-a57 -nographic -smp 2 -m 2048 -kernel Image.gz -append "rdinit=/linuxrc console=ttyAMA0" -S -s
# second console
cd ../../kernel-source/linux-4.9.290/
gdb-multiarch vmlinux
target remove localhost:1234
b start_kernel
c
layout src
效果:
这篇关于编译内核,构建linux根文件系统,使用qemu调试内核的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-11-12如何创建可引导的 ESXi USB 安装介质 (macOS, Linux, Windows)
- 2024-11-08linux的 vi编辑器中搜索关键字有哪些常用的命令和技巧?-icode9专业技术文章分享
- 2024-11-08在 Linux 的 vi 或 vim 编辑器中什么命令可以直接跳到文件的结尾?-icode9专业技术文章分享
- 2024-10-22原生鸿蒙操作系统HarmonyOS NEXT(HarmonyOS 5)正式发布
- 2024-10-18操作系统入门教程:新手必看的基本操作指南
- 2024-10-18初学者必看:操作系统入门全攻略
- 2024-10-17操作系统入门教程:轻松掌握操作系统基础知识
- 2024-09-11Linux部署Scrapy学习:入门级指南
- 2024-09-11Linux部署Scrapy:入门级指南
- 2024-08-21【Linux】分区向左扩容的方法