QEMU启动ARM64 Linux内核
目录
- 前言
- 前置知识
- virt开发板
- ARM处理器家族简介
- 安装qemu-system-aarch64
- 安装交叉编译工具
- 交叉编译ARM64 Linux内核
- 交叉编译ARM64 Busybox
- 使用busybox制作initramfs
- 使用QEMU启动ARM64 Linux内核
前言
本文介绍采用 qemu 模拟ARM-64bit开发板(针对ARM-32bit的有另一篇文章介绍),并启动ARM64 Linux内核。大致思路是:
- 安装qemu-system-aarch64(ARM-64bit)模拟器;
- 安装aarch64-linux-gnu(ARM-64bit)交叉编译器;
- 交叉编译linux源码,得到ARM64 Linux内核镜像;
- 交叉编译busybox源码,使用busybox制作initramfs;
- 最后使用qemu-system-aarch64启用ARM64 Linux内核;
我的环境:
- 宿主机硬件平台:x86_64
- 宿主机操作系统:Ubuntu 20.04 (Linux 5.4.0-139-generic)
- QEMU版本:qemu-4.2.1
- 实验内核:linux-5.19
- busybox版本:busybox-1.35.0
前置知识
virt开发板
截至书稿本文时,QEMU模拟了多大70几种的硬件开发板,可参考Arm System emulator。但ARM-64bit的QEMU模拟器非常少,以至于virt成了唯一的选择。virt支持PCI,virtio,较新的ARM CPU,大容量内存,比较遗憾的是它不支持图形界面,如果你不知道选择什么硬件开发板就选virt。
更详尽的内容可参考:
Why the “virt”board?
Installing Debian on QEMU’s 32-bit ARM “virt”board
Installing Debian on QEMU’s 64-bit ARM “virt”board
ARM处理器家族简介
ARM处理器家族众多,哪些是32bit,哪些是64bit,可参考:
List_of_ARM_processors
很多厂家使用ARM核设计SOC芯片,这里罗列了很多,可参考:
List_of_products_using_ARM_processors
安装qemu-system-aarch64
安装:
$ sudo apt install qemu-system-arm
会同时安装ARM-32bit的qemu-system-arm版本和ARM-64bit的 qemu-system-aarch64版本,查看版本号:
$ qemu-system-aarch64 --version
QEMU emulator version 4.2.1 (Debian 1:4.2-3ubuntu6.24)
Copyright (c) 2003-2019 Fabrice Bellard and the QEMU Project developers
查看 qemu 支持的 ARM 内核开发板,本文选择virt开发板:
$ qemu-system-aarch64 -M help
Supported machines are:
akita Sharp SL-C1000 (Akita) PDA (PXA270)
ast2500-evb Aspeed AST2500 EVB (ARM1176)
ast2600-evb Aspeed AST2600 EVB (Cortex A7)
borzoi Sharp SL-C3100 (Borzoi) PDA (PXA270)
canon-a1100 Canon PowerShot A1100 IS
cheetah Palm Tungsten|E aka. Cheetah PDA (OMAP310)
collie Sharp SL-5500 (Collie) PDA (SA-1110)
connex Gumstix Connex (PXA255)
cubieboard cubietech cubieboard (Cortex-A8)
emcraft-sf2 SmartFusion2 SOM kit from Emcraft (M2S010)
highbank Calxeda Highbank (ECX-1000)
imx25-pdk ARM i.MX25 PDK board (ARM926)
integratorcp ARM Integrator/CP (ARM926EJ-S)
kzm ARM KZM Emulation Baseboard (ARM1136)
lm3s6965evb Stellaris LM3S6965EVB
lm3s811evb Stellaris LM3S811EVB
mainstone Mainstone II (PXA27x)
mcimx6ul-evk Freescale i.MX6UL Evaluation Kit (Cortex A7)
mcimx7d-sabre Freescale i.MX7 DUAL SABRE (Cortex A7)
microbit BBC micro:bit
midway Calxeda Midway (ECX-2000)
mps2-an385 ARM MPS2 with AN385 FPGA image for Cortex-M3
mps2-an505 ARM MPS2 with AN505 FPGA image for Cortex-M33
mps2-an511 ARM MPS2 with AN511 DesignStart FPGA image for Cortex-M3
mps2-an521 ARM MPS2 with AN521 FPGA image for dual Cortex-M33
musca-a ARM Musca-A board (dual Cortex-M33)
musca-b1 ARM Musca-B1 board (dual Cortex-M33)
musicpal Marvell 88w8618 / MusicPal (ARM926EJ-S)
n800 Nokia N800 tablet aka. RX-34 (OMAP2420)
n810 Nokia N810 tablet aka. RX-44 (OMAP2420)
netduino2 Netduino 2 Machine
none empty machine
nuri Samsung NURI board (Exynos4210)
palmetto-bmc OpenPOWER Palmetto BMC (ARM926EJ-S)
raspi2 Raspberry Pi 2
raspi3 Raspberry Pi 3
realview-eb ARM RealView Emulation Baseboard (ARM926EJ-S)
realview-eb-mpcore ARM RealView Emulation Baseboard (ARM11MPCore)
realview-pb-a8 ARM RealView Platform Baseboard for Cortex-A8
realview-pbx-a9 ARM RealView Platform Baseboard Explore for Cortex-A9
romulus-bmc OpenPOWER Romulus BMC (ARM1176)
sabrelite Freescale i.MX6 Quad SABRE Lite Board (Cortex A9)
sbsa-ref QEMU 'SBSA Reference' ARM Virtual Machine
smdkc210 Samsung SMDKC210 board (Exynos4210)
spitz Sharp SL-C3000 (Spitz) PDA (PXA270)
swift-bmc OpenPOWER Swift BMC (ARM1176)
sx1 Siemens SX1 (OMAP310) V2
sx1-v1 Siemens SX1 (OMAP310) V1
terrier Sharp SL-C3200 (Terrier) PDA (PXA270)
tosa Sharp SL-6000 (Tosa) PDA (PXA255)
verdex Gumstix Verdex (PXA270)
versatileab ARM Versatile/AB (ARM926EJ-S)
versatilepb ARM Versatile/PB (ARM926EJ-S)
vexpress-a15 ARM Versatile Express for Cortex-A15
vexpress-a9 ARM Versatile Express for Cortex-A9
virt-2.10 QEMU 2.10 ARM Virtual Machine
virt-2.11 QEMU 2.11 ARM Virtual Machine
virt-2.12 QEMU 2.12 ARM Virtual Machine
virt-2.6 QEMU 2.6 ARM Virtual Machine
virt-2.7 QEMU 2.7 ARM Virtual Machine
virt-2.8 QEMU 2.8 ARM Virtual Machine
virt-2.9 QEMU 2.9 ARM Virtual Machine
virt-3.0 QEMU 3.0 ARM Virtual Machine
virt-3.1 QEMU 3.1 ARM Virtual Machine
virt-4.0 QEMU 4.0 ARM Virtual Machine
virt-4.1 QEMU 4.1 ARM Virtual Machine
virt QEMU 4.2 ARM Virtual Machine (alias of virt-4.2)
virt-4.2 QEMU 4.2 ARM Virtual Machine
witherspoon-bmc OpenPOWER Witherspoon BMC (ARM1176)
xilinx-zynq-a9 Xilinx Zynq Platform Baseboard for Cortex-A9
xlnx-versal-virt Xilinx Versal Virtual development board
xlnx-zcu102 Xilinx ZynqMP ZCU102 board with 4xA53s and 2xR5Fs based on the value of smp
z2 Zipit Z2 (PXA27x)
看下virt开发板支持的cpu列表,本文以64-bit的cortex-a57为例说明:
$ qemu-system-aarch64 -M virt --cpu help
Available CPUs:arm1026arm1136arm1136-r2arm1176arm11mpcorearm926arm946cortex-a15cortex-a53cortex-a57cortex-a7cortex-a72cortex-a8cortex-a9cortex-m0cortex-m3cortex-m33cortex-m4cortex-r5cortex-r5fmaxpxa250pxa255pxa260pxa261pxa262pxa270-a0pxa270-a1pxa270pxa270-b0pxa270-b1pxa270-c0pxa270-c5sa1100sa1110ti925t
安装交叉编译工具
我们是在X86平台下进行的开发,目标平台是arm架构,需要安装交叉编译工具链。有关arm-linux的交叉编译器主要有:
- 针对ARM-32bit的arm-linux-gnueabi和arm-linux-gnueabihf。
- 针对ARM-64bit的aarch64-linux-gnu。
交叉编译器各版本的区别可参考《arm系列交叉编译器各版本区别》。
安装ARM-64bit的aarch64-linux-gnu版本:
$ sudo apt install gcc-aarch64-linux-gnu
查看版本:
$ aarch64-linux-gnu-gcc --version
aarch64-linux-gnu-gcc (Ubuntu 9.4.0-1ubuntu1~20.04.1) 9.4.0
Copyright (C) 2019 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
交叉编译ARM64 Linux内核
下载源码:
$ mkdir ~/kvm-arm
$ cd ~/kvm-arm/
$ wget https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git/snapshot/linux-5.19.tar.gz
$ tar -xf linux-5.19.tar.gz
$ cd linux-5.19/
$ make ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- O=build defconfig
$ make ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- O=build -j8
说明:
- ARCH:指定目标CPU架构;
- CROSS_COMPILE:指定交叉编译器;
- O=build:O是Out的缩写,表示编译输出文件放在build目录,不跟源码混在一起,保持源码的整洁性。
- make时只有defconfig配置可选,因为 linux-5.19/arch/arm64/configs/ 目录下有且只有defconfig一个。
查看下内核编译出来的原始内核文件vmlinux,是ARM 64-bit版本。
$ file build/vmlinux
build/vmlinux: ELF 64-bit LSB shared object, ARM aarch64, version 1 (SYSV), statically linked, BuildID[sha1]=f2a5fd51bd2d59f90b7b26b8926f5afdeab60f36, not stripped
vmlinux不能直接引导Linux系统启动,能引导Linux系统启动的是Image文件(非压缩版)或Image.gz(压缩版),下文用到的内核镜像就是Image:
$ file build/arch/arm64/boot/Image
build/arch/arm64/boot/Image: MS-DOS executable PE32+ executable (EFI application) Aarch64 (stripped to external PDB), for MS Windows$ file build/arch/arm64/boot/Image.gz
build/arch/arm64/boot/Image.gz: gzip compressed data, max compression, from Unix, original size modulo 2^32 36112896
交叉编译ARM64 Busybox
$ mkdir ~/kvm-arm
$ cd ~/kvm-arm/
$ wget https://busybox.net/downloads/busybox-1.35.0.tar.bz2
$ tar -xf busybox-1.35.0.tar.bz2
$ cd busybox-1.35.0/$ export ARCH=arm64
$ export CROSS_COMPILE=aarch64-linux-gnu-
$ make menuconfig# 修改配置,选中如下项目,静态编译
# Settings –> Build Options –> [*] Build static binary(no share libs)# 反选如下项目,否则后续qemu执行会提示 /bin/sh:can't access tty;job control turned off
# Shells ---> [ ] Job control$ make -j `nproc`
$ make install
装完后会 默认安装到源码目录的 _install/ 目录下:
$ ls _install/
bin linuxrc sbin usr
最关键的就是_install/bin/busybox,其他都是链接文件。
$ file _install/bin/busybox
_install/bin/busybox: ELF 64-bit LSB executable, ARM aarch64, version 1 (GNU/Linux), statically linked, BuildID[sha1]=3768162c347859f16ab4f0b01a48fb8c0502774d, for GNU/Linux 3.7.0, stripped
编译的过程中如果出现如下提示,可忽略:
Trying libraries: m resolv rtLibrary m is needed, can't exclude it (yet)Library resolv is needed, can't exclude it (yet)Library rt is not needed, excluding itLibrary m is needed, can't exclude it (yet)Library resolv is needed, can't exclude it (yet)
Final link with: m resolv
使用busybox制作initramfs
使用busybox快速制作initramfs。
创建虚拟rootfs中的inti启动脚本,并赋予可执行权限:
$ cd ~/kvm-arm/busybox-1.35.0/_install/
$ mkdir proc sys dev tmp
$ touch init
$ chmod +x init
脚本内容:
#!/bin/sh# 挂载一些必要的文件系统
mount -t proc none /proc
mount -t sysfs none /sys
mount -t tmpfs none /tmp
mount -t devtmpfs none /devecho
echo "Hello 64-bit ARM Linux"# 显示开机消耗时间
echo "This boot took $(cut -d' ' -f1 /proc/uptime) seconds"
echo# 停留在控制台
exec /bin/sh
制作initramfs文件,它是多个文件通过cpio打包和gzip压缩的文件,是一个cpio格式的内存文件系统。
$ find . -print0 | cpio --null -ov --format=newc | gzip -9 > ../initramfs.cpio.gz
使用QEMU启动ARM64 Linux内核
ARM Linux内核镜像和initramfs都准备好,就可以使用QEMU启动linux内核了。
以字符界面方式启动QEMU,同时日志输出到控制台:
$ qemu-system-aarch64 \-M virt \-cpu cortex-a57 \-smp 8 \-m 8G \-kernel ./linux-5.19/build/arch/arm64/boot/Image \-initrd ./busybox-1.35.0/initramfs.cpio.gz \-nographic \-append "init=/init console=ttyAMA0"
QEMU参数说明(更多可参考:Standard options):
- -M:指定模拟的开发板,可通过qemu-system-aarch64 M help查看,截至书稿时,只有virt支持64-bit ARM。
- -cpu:指定模拟的cpu,可通过qemu-system-aarch64 -M virt --cpu help查看,这里选择cortex-a57。
- -smp:指定cpu核数量,启动后可以使用nproc命令核对。
- -m:指定内存大小,virt 可支持超大内存,启动后可以使用free -h命令核对。
- -kernel:指定启动的内核镜像;
- -initrd:指定启动的内存文件系统;
- -append:传递给内核的启动参数;启动后可使用cat /proc/cmdline命令核对。
- -nographic:启动字符界面(不启动图形界面),输出重定向到宿主机命令行,与参数 console=ttyAMA0 组合使用;
9 参考
- Arm System emulator
- Arm Versatile Express boards (vexpress-a9, vexpress-a15)
- List_of_products_using_ARM_processors
- List_of_ARM_processors
- Qemu使用及常见开发板的模拟
- qemu-system-aarch64使用和相关参数介绍
QEMU启动ARM64 Linux内核相关推荐
- QEMU启动ARM32 Linux内核
目录 前言 前置知识 ARM Versatile Express开发板简介 ARM处理器家族简介 安装qemu-system-arm 安装交叉编译工具 交叉编译ARM32 Linux内核 交叉编译AR ...
- ARM64 Linux 内核页表的块映射
作者 | 宋宝华 责编 | 张文 头图 | CSDN 下载自视觉中国 出品 | CSDN(ID:CSDNnews) 内核文档 Documentation/arm64/memory.rst 描述了 A ...
- Ubuntu 上使用 qemu 模拟 Arm64 linux
Ubuntu 上用 qemu 模拟 Arm64 linux 环境配置 1. 安装Arm64交叉编译工具链 2. 安装qemu 下载源码包 编译 编译Linux kernel 编译qemu 编译busy ...
- ARM DS-5单步调试ARM64 linux 内核
目录 1 介绍 2 开发环境 3 准备工作 3.1 Ubuntu环境准备 3.2 源代码准备 3.3 DS-5准备 3.4 使用DS-5调试源码 3.4.1 建立源码工程 3.4.2 创建debug配 ...
- Linux学习记录(二)QEMU安装与Linux内核环境搭建
Linux学习记录(二) 记录本人学习的过程和遇到的问题 QEMU安装与Linux内核环境搭建 Linux学习记录(二) 一.QEMU安装 1.什么是QEMU 2.QEMU安装 二.Linux内核环境 ...
- elipse调试linux内核,debug eclipse cdt + qemu虚拟机调试linux内核
debug eclipse cdt + qemu虚拟机调试linux内核 (17页) 本资源提供全文预览,点击全文预览即可全文预览,如果喜欢文档就下载吧,查找使用更方便哦! 9.90 积分 A scr ...
- 嵌入式ARM64 Linux内核FIT uimage方式启动
平台:orangepi4 rockchip rk3399 LPDDR4 4G eMMC 16G 系统:ubuntu 20.04 FIT简介 device tree在ARM架构中普及之后,u-boot也 ...
- QEMU搭建arm64 Linux调试环境
https://zhuanlan.zhihu.com/p/345232459 简述 本文记录了在ubuntu20.04上,使用QEMU搭建arm64 的Linux开发调试环境.可以方便得使用gdb调试 ...
- 从linux内核启动,学习Linux内核启动过程:从start_kernel到init
一.实验步骤: 1:运行menuos: a)cd LinuxKernel/ b)qemu -kernel linux-3.18.6/arch/x86/boot/bzImage -initrd root ...
最新文章
- wireshark如何对指定ip进行嗅探
- java虚拟机 第二章Java内存区域与内存溢出异常
- C++ Primer(第四版) 课后习题3.14 vector单词转大写
- hbase 查询固定条数_HBase原理深入
- OK335xS psplash make-image-header.sh hacking
- 关于An association from the tablea refers to an unmapped classB
- bash内部命令-1
- L1-033__040
- 【滤波器】基于matlab GUI IIR+FIR数字滤波器设计【含Matlab源码 698期】
- 宝塔Linux控制面板专业版破解步骤【亲测可用】
- app支付宝接入流程图_支付宝资金预授权开通免押租赁系统,芝麻信用免押租赁app/小程序...
- keras merged model
- 仿钉钉考勤统计页面的日历组件,通过日历展示每日考勤打卡情况,支持在日历上打两种不同类型的点,大致适配各种分辨率效果图
- mybatis-plus 属性为空时判断问题
- 笔记之零基础入门金融风控-贷款违约预测
- 计算机安全模式win7,安全模式启动,教您Win7怎么进入安全模式
- 商务办公软件应用与实践【2】
- 树莓派桌面多出个计算机,计算机实验室之树莓派:课程 7 屏幕02
- android5.0新特性 clipping的用法
- ElasticSearch 高级
热门文章
- 安卓在4.3的系统中提供了低功耗蓝牙Bluetooth Low Energy
- Android使用@hide的API
- 软件度量始于规模,终于规模
- 一种基于KINECT的摔倒检测方法,全新的特征
- 在html文档中建立两个表单,职称计算机考试Dreamwaver中表单的创建与应用
- 三菱Q系列做modbusTCP服务器,三菱Q系列内置以太网的modbus TCP通信的问题
- Kubernetes Dashboard集成Heapster
- 显示器的分辨率被锁定的可选解决方案
- MySQL存储过程:利用游标+临时表实现查询
- vrep学习笔记_V-rep学习笔记:力传感器