注意不能模拟uboot,所以本篇没有模拟uboot启动kernel过程
环境准备
PC系统:Windows10
虚拟机:VMware-17
虚拟机系统:Ubuntu-18.04.1
模拟的32位开发板:vexpress-a9
搭建环境时使用的源码版本
qemu-8.2.0
linux-5.10.209
busybox-1.36.1
下载编译安装QEMU
下载QEMU源码
去qemu官网上下载最新的8.2.0源码包,并解压出来
wget https://download.qemu.org/qemu-8.2.0.tar.bz2
tar -xjf qemu-8.2.0.tar.bz2
配置QEMU
配置qemu源码前要要求本地环境python版本要大于3.8和glib2.0环境依赖。
检查下自己主机的python版本,如果低于python3.8需要去python官网下载源码自行安装https://www.python.org/downloads/source/
cd Python-3.8.17/
./configure --prefix=/usr/local
make -j8
make install
rm /usr/bin/python
sudo ln -s /usr/local/bin/python3.8 /usr/bin/
然后安装各种环境
sudo apt-get install python3-venv
sudo apt-get install python3-pip
sudo apt-get update
pip3 install --upgrade pip
pip3 install sphinx
pip3 install sphinx_rtd_theme
pip3 install Ninja
sudo apt-get install libglib2.0-0 libglib2.0-dev ninja-build libpixman-1-dev
安装完配置前的环境依赖后,进入到qemu目录下,配置下qemu源码,我们只需要ARM32和ARM64架构的单板,本篇模拟ARM32的板子,下篇模拟ARM64的板子,如果需要模拟其他单板类型可以去看configs/devices/
~/qemu-8.2.0$ ls -l configs/devices/
total 124
drwxr-xr-x 2 book book 4096 Dec 19 16:24 aarch64-softmmu
drwxr-xr-x 2 book book 4096 Dec 19 16:24 alpha-softmmu
drwxr-xr-x 2 book book 4096 Dec 19 16:24 arm-softmmu
drwxr-xr-x 2 book book 4096 Dec 19 16:24 avr-softmmu
drwxr-xr-x 2 book book 4096 Dec 19 16:24 cris-softmmu
drwxr-xr-x 2 book book 4096 Dec 19 16:24 hppa-softmmu
drwxr-xr-x 2 book book 4096 Dec 19 16:24 i386-softmmu
drwxr-xr-x 2 book book 4096 Dec 19 16:24 loongarch64-softmmu
drwxr-xr-x 2 book book 4096 Dec 19 16:24 m68k-softmmu
drwxr-xr-x 2 book book 4096 Dec 19 16:24 microblazeel-softmmu
drwxr-xr-x 2 book book 4096 Dec 19 16:24 microblaze-softmmu
drwxr-xr-x 2 book book 4096 Dec 19 16:24 mips64el-softmmu
drwxr-xr-x 2 book book 4096 Dec 19 16:24 mips64-softmmu
drwxr-xr-x 2 book book 4096 Dec 19 16:24 mipsel-softmmu
drwxr-xr-x 2 book book 4096 Dec 19 16:24 mips-softmmu
drwxr-xr-x 2 book book 4096 Dec 19 16:24 nios2-softmmu
drwxr-xr-x 2 book book 4096 Dec 19 16:24 or1k-softmmu
drwxr-xr-x 2 book book 4096 Dec 19 16:24 ppc64-softmmu
drwxr-xr-x 2 book book 4096 Dec 19 16:24 ppc-softmmu
drwxr-xr-x 2 book book 4096 Dec 19 16:24 riscv32-softmmu
drwxr-xr-x 2 book book 4096 Dec 19 16:24 riscv64-softmmu
drwxr-xr-x 2 book book 4096 Dec 19 16:24 rx-softmmu
drwxr-xr-x 2 book book 4096 Dec 19 16:24 s390x-softmmu
drwxr-xr-x 2 book book 4096 Dec 19 16:24 sh4eb-softmmu
drwxr-xr-x 2 book book 4096 Dec 19 16:24 sh4-softmmu
drwxr-xr-x 2 book book 4096 Dec 19 16:24 sparc64-softmmu
drwxr-xr-x 2 book book 4096 Dec 19 16:24 sparc-softmmu
drwxr-xr-x 2 book book 4096 Dec 19 16:24 tricore-softmmu
drwxr-xr-x 2 book book 4096 Dec 19 16:24 x86_64-softmmu
drwxr-xr-x 2 book book 4096 Dec 19 16:24 xtensaeb-softmmu
drwxr-xr-x 2 book book 4096 Dec 19 16:24 xtensa-softmmu
接下来创建编译目录,然后进行配置
~/qemu-8.2.0$ mkdir build/
~/qemu-8.2.0$ cd build/
~/qemu-8.2.0/build/$ ../configure --target-list=arm-softmmu,aarch64-softmmu --audio-drv-list=
其中target-list选项可以指定编译哪些指令集:
aarch64-softmmu:ARM64指令集 arm-softmmu:ARMv7指令集 riscv32-softmmu:RISC-V的32bit指令集 riscv64-softmmu:RISC-V的64bit指令集
编译安装qemu
~/qemu-8.2.0/build/$ make -j8 && make install
下载编译kernel
安装好qemu模拟器后,在[www.kernel.org] 官网上,下载Linux kernel源码,我这里选的5.10源码
解压kernel源码
tar -xf linux-5.10.209.tar.xz
进入kernel目录下,修改顶层Makefile的ARCH和CROSS_COMPILE, 修改完后如下
377 ARCH ?= arm
378 CROSS_COMPILE ?= arm-linux-gnueabi-
配置单板的defconfig,生成.config
~/linux-5.10.209$ make vexpress_defconfig
我们发现配置单板过程中,如果遇到下面的错误,则ubuntu里没有安装工具链
HOSTCC scripts/kconfig/conf.o
HOSTLD scripts/kconfig/conf
scripts/Kconfig.include:39: compiler 'arm-linux-gnueabi-gcc' not found
make[1]: *** [scripts/kconfig/Makefile:88: vexpress_defconfig] Error 1
make: *** [Makefile:616: vexpress_defconfig] Error 2
解决方法是需要手动安装lib32的库
sudo apt install gcc-arm-linux-gnueabi
在执行一次make vexpress_defconfig命令
~/linux-5.10.209$ make vexpress_defconfig
#
# configuration written to .config
#
编译kernel内核
编译完的zImage存放在arch/arm/boot/下面
~/linux-5.10.209$ make zImage -j8
编译kernel modules
编译完的ko文件存放在arch/arm/boot/下面
~/linux-5.10.209$ make modules -j8
编译设备树
~/linux-5.10.209$ make dtbs
使用busybox制作根文件系统
本篇根文件系统我们使用busybox进行制作,下一篇我们也可以尝试用Buildroot进行做文件系统
先下载busybox官网上的最新版本源码,并进行解压
wget https://www.busybox.net/downloads/busybox-1.36.1.tar.bz2
tar -xjf busybox-1.36.1.tar.bz2
进入到busybox源码目录,修改顶层Makefile的ARCH和CROSS_COMPILE, 修改完后如下
164 CROSS_COMPILE ?= arm-linux-gnueabi-
...
190 ARCH ?= arm
执行下面命令,重新配置.config文件并编译
~/busybox-1.36.1$ make defconfig && make -j8
执行下面命令,进行安装文件系统
~/busybox-1.36.1$ make install
会默认安装在_install目录下
~/busybox-1.36.1/_install$ ls
bin linuxrc sbin usr
创建rootfs目录用来存放所需要的文件系统内容,把busybox里安装的目录放到这里,还需要把工具链的库放在这里
mkdir rootfs
mkdir -p rootfs/lib
cp -r /usr/arm-linux-gnueabi/lib/ rootfs/lib/
cp -r busybox-1.36.1/_install/* rootfs
mkdir -p rootfs/dev/
sudo mknod -m 666 tty1 c 4 1
sudo mknod -m 666 tty2 c 4 2
sudo mknod -m 666 tty3 c 4 3
sudo mknod -m 666 tty4 c 4 4
sudo mknod -m 666 console c 5 1
sudo mknod -m 666 null c 1 3
制作SD卡的文件系统镜像 dd命令生成镜像
dd if=/dev/zero of=rootfs.ext4 bs=1M count=64
格式化ext4文件系统
mkfs.ext4 rootfs.ext4
将安装做好的rootfs目录下的文件全部拷贝在/mnt目录下面
sudo mount -t ext4 rootfs.ext4 /mnt -o loop
cp -r rootfs/* mnt
umount mnt
qemu模拟kernel启动
执行下面的命令启动kernel进入到系统里
~/linux-5.10.209$ qemu-system-arm -M vexpress-a9 -m 512M -kernel ./arch/arm/boot/zImage -dtb ./arch/arm/boot/dts/vexpress-v2p-ca9.dtb -nographic -append "root=/dev/mmcblk0 rw console=ttyAMA0 rootwait rootfstype=ext4" -sd rootfs.ext4
-m 512M 单板物理内存512M -kernel ./arch/arm/boot/zImage 指定内和镜像及路径 -dtb ./arch/arm/boot/dts/vexpress-v2p-ca9.dtb 指定单板的设备树文件 -nographic 不使用图形界面,使用串口 -append "console=ttyAMA0 rootwait rootfstype=ext4" 指定内核启动参数,串口设备使用ttyAMA0 -sd rootfs.ext4 指定SD卡制作的rootfs.ext4文件系统
可以看到登录到串口上
退出当前运行的 qemu,使用组合键,CTRL + a,松开后然后再按 x 键。
本篇咱们模拟ARM64 QEMU开发环境
环境准备
PC系统:Windows10
虚拟机:VMware-17
虚拟机系统:Ubuntu-20.04
模拟的64位cpu:cortex-a57
搭建环境时使用的源码版本
qemu-8.2.0
linux-5.10.209(Linux Kernel)
busybox-1.36.1
AARCH64的工具链安装准备:
sudo apt-get install gcc-aarch64-linux-gnu -y
下载编译安装QEMU
下载QEMU源码
去qemu官网上下载最新的8.2.0源码包,并解压出来
wget https://download.qemu.org/qemu-8.2.0.tar.bz2 tar -xjf qemu-8.2.0.tar.bz2
配置QEMU
配置qemu源码前要要求本地环境python版本要大于3.8和glib2.0环境依赖。
检查下自己主机的python版本,如果低于python3.8需要去python官网下载源码自行安装https://www.python.org/downloads/source/
cd Python-3.8.17/ ./configure --prefix=/usr/local make -j8 make install rm /usr/bin/python sudo ln -s /usr/local/bin/python3.8 /usr/bin/python
然后安装各种环境
sudo apt-get install python3-venv sudo apt-get install python3-pip sudo apt-get update pip3 install --upgrade pip pip3 install sphinx pip3 install sphinx_rtd_theme pip3 install Ninja sudo apt-get install libglib2.0-0 libglib2.0-dev ninja-build libpixman-1-dev
安装完配置前的环境依赖后,进入到qemu目录下,配置下qemu源码。本篇模拟ARM64架构的开发环境,接下来创建编译目录,然后进行配置
~/qemu-8.2.0$ mkdir build/ ~/qemu-8.2.0$ cd build/ ~/qemu-8.2.0/build/$ ../configure --target-list=aarch64-softmmu --audio-drv-list=
编译安装qemu
~/qemu-8.2.0/build/$ make -j8 && make install
下载编译kernel
安装好qemu模拟器后,在[http://www.kernel.org] 官网上,下载Linux kernel源码,我这里选的5.10源码
解压kernel源码
tar -xf linux-5.10.209.tar.xz
进入kernel目录下,配置编译kernel并编译生成Image文件,存放在arch/arm/boot/下面
make ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- defconfig make ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- Image -j8
编译kernel modules 编译完的ko文件存放在arch/arm/boot/下面
~/linux-5.10.209$ make modules -j8
使用busybox制作根文件系统
本篇根文件系统我们使用busybox进行制作,下一篇我们也可以尝试用Buildroot进行做文件系统
先下载busybox官网上的最新版本源码,并进行解压
wget https://www.busybox.net/downloads/busybox-1.36.1.tar.bz2 tar -xjf busybox-1.36.1.tar.bz2
设置交叉编译工具链
-> Settings
(aarch64-linux-gnu-) Cross compiler prefix
执行下面命令,重新配置.config文件并编译
~/busybox-1.36.1$ make defconfig && make -j8
执行下面命令,进行安装文件系统
~/busybox-1.36.1$ make install
会默认安装在_install目录下
~/busybox-1.36.1/_install$ ls bin linuxrc sbin usr
创建rootfs目录用来存放所需要的文件系统内容,把busybox里安装的目录拷贝到这里,创建lib目录本地安装的工具链放到这里,在创建其他所需目录
mkdir rootfs mkdir -p rootfs/lib cp -r /usr/aarch64-linux-gnu/lib/ rootfs/lib/ cp -r busybox-1.36.1/_install/* rootfs cd rootfs/ mkdir -p etc dev mnt proc sys tmp mnt root etc/init.d/ touch etc/initab etc/fstab etc/profile etc/init.d/rcS chmod +x etc/initab etc/init.d/rcS
一个完整文件系统是启机要做很多事情,这些事情都是由启机脚本去做 etc目录下创建inittab文件,它是启机后运行的第一个脚本
inittab会先去执行/etc/init.d/rcS脚本的事情,rcS脚本内容如下所示
rcS它会做三件事:
1、挂载fstab的所有系统节点
2、mdev机制实现热插拔自动创建节点
3、给eth0设置静态IP
/etc/fstab主要是存放文件系统信息内容如下
/etc/profile文件是全局的shell配置文件,简单的讲就是登陆shell前的配置文件,主要是设置环境变量路径,设置主机用户名,创建设备节点 内容如下
我尝试过aarch64架构就不能用上篇的sd卡制作文件系统,会报机器类型不支持
qemu-system-aarch64: -sd rootfs_arm64.ext4: machine type does not support if=sd,bus=0,unit=0
所以换cpio工具制作initramfs内存文件系统
~/rootfs$ find . | cpio -o -H newc > ../rootfs.img 98684 blocks ~$ cd ../ ~$ ls -lh rootfs.img -rw-rw-r-- 1 forlinx forlinx 49M 2月 5 10:47 rootfs.img
或者cpio做出来的镜像用gzip压缩成img,两者区别是gzip压缩更小
~/rootfs$ find . | cpio -o -H newc |gzip > ../rootfs.cpio.gz ~$ cd ../ ~$ ls -lh rootfs.cpio.gz -rw-rw-r-- 1 forlinx forlinx 15M 2月 5 10:47 rootfs.cpio.gz
qemu模拟kernel启动
输入qemu命令启动内核
qemu-system-aarch64 -machine virt,virtualization=true,gic-version=3 -nographic -m size=1024M -cpu cortex-a57 -smp 4 -kernel arch/arm64/boot/Image -initrd rootfs.cpio.gz -append "root=/dev/ram console=ttyAMA0 rdinit=/linuxrc"
-machine virt,virtualization=true,gic-version=3 因为qemu不能模拟出具体64位机器类型,只能是virt虚拟化出64位机器类型,所以dtb就不需要指定
-cpu cortex-a57 目前qemu支持armv8的cpu有cortex-a53,cortex-a55,cortex-a57,cortex-a72,cortex-a76
smp 4 使用4核CPU
-m 1024M 单板物理内存1024M
-kernel ./arch/arm/boot/Image 指定内核镜像及路径
-nographic 不使用图形界面,使用串口
-initrd rootfs.cpio.gz 内存文件系统
-append "root=/dev/ram console=ttyAMA0 init=/linuxrc" 指定内核启动参数,串口设备使用ttyAMA0,告诉kernel,init进程是/linuxrc
可以看到登录到串口上
推荐本站淘宝优惠价购买喜欢的宝贝:
本文链接:https://hqyman.cn/post/5746.html 非本站原创文章欢迎转载,原创文章需保留本站地址!
休息一下~~