build/qemu-system-cris build/qemu-system-microblaze build/qemu-system-mipsel build/qemu-system-riscv32 build/qemu-system-sh4eb build/qemu-system-xtensa
后面就可以通过 build/qemu-system-aarch64 模拟arm64平台处理器来运行Linux kernel了。
## **安装arm64交叉编译工具链**
当前我们选择用linaro的交叉编译工具链来编译uboot、kernel、busybox等,linaro交叉编译工具链的下载网址为:https://releases.linaro.org/components/toolchain/binaries/7.5-2019.12/aarch64-linux-gnu/,网页如下:

我们先创建一个~/cross-compiler目录,然后在该目录下下载交叉编译工具链压缩包gcc-linaro-7.5.0-2019.12-x86\_64\_aarch64-linux-gnu.tar.xz 并解压,命令和日志如下:
max@ubuntu2204:~ mkdir ~/cross-compiler && cd ~/cross-compiler max@ubuntu2204:~/cross-compiler wget releases.linaro.org/components/… --2024-01-14 00:07:24-- releases.linaro.org/components/… Resolving releases.linaro.org (releases.linaro.org)... 52.215.200.125 …… …… gcc-linaro-7.5.0-2019.12-x86_64_aarch64-linux-gnu. 100%[===============================================================================================================>] 112.43M 1.13MB/s in 4m 37s
2024-01-14 00:12:04 (416 KB/s) - ‘gcc-linaro-7.5.0-2019.12-x86_64_aarch64-linux-gnu.tar.xz’ saved [117896452/117896452]
max@ubuntu2204:/cross-compiler tar xf gcc-linaro-7.5.0-2019.12-x86_64_aarch64-linux-gnu.tar.xz
max@ubuntu2204:/cross-compiler$
把该交叉编译工具链的bin目录添加到 PATH 环境变量中,如下:
PATH=/home/max/cross-compiler/gcc-linaro-7.5.0-2019.12-x86_64_aarch64-linux-gnu/bin:$PATH
这样我们就可以使用这个交叉编译工具链了,如下:
max@ubuntu2204:~/cross-compiler
到此arm64交叉编译工具链就安装完成了。
## **编译linux kernel**
### **安装工具**
在ubuntu上安装编译内核需要用到的工具,命令和日志如下:
max@ubuntu2204:~
### **下载linux内核源码**
我们这里下载的是linux官方最新的longterm版本linux-6.1.y 的内核,从linux官网下载源码耗时较长,所以我们选择从清华仓库中下载。大家可以参考 [获取Linux内核源码]( ) 这篇文章来查看linux官方发布的所有版本和各种快速下载内核源码方法。下载命令和日志如下:
max@ubuntu2204:~
进入linux-stable目录查看下载的内核的版本为Linux 6.1.72,命令和日志如下:
max@ubuntu2204:~ git branch -vv
- linux-6.1.y 7c58bfa711cb [origin/linux-6.1.y] Linux 6.1.72 max@ubuntu2204:~/linux-stable$
### **编译linux内核源码**
进入到linux-stable 内核目录下,通过menuconfig配置内核选项,命令和日志如下:
max@ubuntu2204:~/linux-stable$ make CROSS_COMPILE=aarch64-linux-gnu- ARCH=arm64 O=build menuconfig make[1]: Entering directory '/home/max/linux-stable/build' GEN Makefile
using defaults found in arch/arm64/configs/defconfig
*** End of the configuration. *** Execute 'make' to start the build or try 'make help'.
make[1]: Leaving directory '/home/max/linux-stable/build' max@ubuntu2204:~/linux-stable$
执行上面的命令会进入到menuconfig 菜单页面,如下:

在菜单中依次选择如下选项:
Device Drivers > Block devices > RAM block device support
并且把 “Default RAM disk size (kbytes)”调整为65536,调整后界面如下:

然后选择save保存,并退出menuconfig菜单,到此内核选项就配置完成了。下面开始编译内核镜像,命令和日志如下:
max@ubuntu2204:~/linux-stable
查看生成的Image内核镜像,命令和日志如下:
max@ubuntu2204:~/linux-stable
到此内核镜像Image就编译完成了。
## **编译busybox**
Busybox的官方网页为https://busybox.net/ ,我们通过wget下载主页上的BusyBox 1.36.1版本的源码,命令和日志如下:
max@ubuntu2204:~
解压busybox源码并进入源码目录,然后通过menuconfig菜单选择静态编译,即选择“Build static binary (no shared libs)”选项,命令和日志如下:
max@ubuntu2204: cd busybox-1.36.1/
max@ubuntu2204:/busybox-1.36.1
执行上面的命令,会显示出busybox的menuconfig菜单,如下:

在菜单中依次选择:
Settings > [*] Build static binary (no shared libs)
界面如下:

然后保存退出,到此busybox的选项就配置完成了。下面开始编译busybox,命令和日志如下:
max@ubuntu2204:~/busybox-1.36.1$ make CROSS_COMPILE=aarch64-linux-gnu- ARCH=arm64 install -j8 SPLIT include/autoconf.h -> include/config/* GEN include/bbconfigopts.h GEN include/common_bufsiz.h …… ……
You will probably need to make your busybox binary setuid root to ensure all configured applets will work properly.
查看生成的busybox可执行文件,命令如下:
max@ubuntu2204:~/busybox-1.36.1$ file _install/bin/busybox _install/bin/busybox: ELF 64-bit LSB executable, ARM aarch64, version 1 (SYSV), stati
## **制作 initrd 文件系统镜像**
为了方便制作initrd文件系统镜像,我们通过mk\_initrd.sh脚本来生成initrd.ext4镜像文件,后面在内核跑起来后会挂载该镜像中的文件系统,脚本如下:
#!/bin/bash
set -x
CURR_DIR=pwd
MOUNT_DIR=MOUNT_DIR
sudo mount initrd.ext4 BUSYBOX_PREFIX/_install/* MOUNT_DIR
mkdir -p etc dev mnt proc sys tmp mnt etc/init.d/
echo "proc /proc proc defaults 0 0" > etc/fstab
echo "tmpfs /tmp tmpfs defaults 0 0" >> etc/fstab
echo "sysfs /sys sysfs defaults 0 0" >> etc/fstab
echo "#!/bin/sh" > etc/init.d/rcS
echo "mount -a" >> etc/init.d/rcS
echo "mount -o remount,rw /" >> etc/init.d/rcS
echo "echo -e "Welcome to ARM64 Linux"" >> etc/init.d/rcS
chmod 755 etc/init.d/rcS
echo "::sysinit:/etc/init.d/rcS" > etc/inittab
echo "::respawn:-/bin/sh" >> etc/inittab
echo "::askfirst:-/bin/sh" >> etc/inittab
chmod 755 etc/inittab
cd dev
mknod console c 5 1
mknod null c 1 3
mknod tty1 c 4 1
cd MOUNT_DIR
echo "make initrd ok!"
用户需要根据自己编译的busybox所在目录来调整脚本中的 BUSYBOX\_PREFIX 变量。修改完mk\_initrd.sh 脚本后,我们先创建一个make\_initrd目录,并把 mk\_initrd.sh 脚本拷贝到该目录下,由于在ubuntu下做mount和umount操作需要sudo权限,所以在执行mk\_initrd.sh脚本前需要先在终端进入sudo权限,然后再执行该 mk\_initrd.sh 脚本生成initrd.ext4镜像,命令和日志如下:
max@ubuntu2204: cd make_initrd/
max@ubuntu2204:/make_initrd
max@ubuntu2204:~/make_initrd$ sudo su
[sudo] password for max:
root@ubuntu2204:/home/max/make_initrd#
root@ubuntu2204:/home/max/make_initrd# sh mk_initrd.sh
- pwd
- CURR_DIR=/home/max/make_initrd
- MOUNT_DIR=/home/max/make_initrd/mount_point
- BUSYBOX_PREFIX=/home/max/busybox-1.36.1 …… ……
- echo make initrd ok! make initrd ok! root@ubuntu2204:/home/max/make_initrd# root@ubuntu2204:/home/max/make_initrd# exit exit max@ubuntu2204:~/make_initrd$ ls -lh initrd.ext4 -rw-r--r-- 1 root root 32M 1月 14 12:32 initrd.ext4
到此文件系统镜像initrd.ext4就做好了。
## **使用qemu aarch64模拟器运行Linux内核**

最全的Linux教程,Linux从入门到精通
======================
1. **linux从入门到精通(第2版)**
2. **Linux系统移植**
3. **Linux驱动开发入门与实战**
4. **LINUX 系统移植 第2版**
5. **Linux开源网络全栈详解 从DPDK到OpenFlow**

第一份《Linux从入门到精通》466页
====================
内容简介
====
本书是获得了很多读者好评的Linux经典畅销书**《Linux从入门到精通》的第2版**。本书第1版出版后曾经多次印刷,并被51CTO读书频道评为“最受读者喜爱的原创IT技术图书奖”。本书第﹖版以最新的Ubuntu 12.04为版本,循序渐进地向读者介绍了Linux 的基础应用、系统管理、网络应用、娱乐和办公、程序开发、服务器配置、系统安全等。本书附带1张光盘,内容为本书配套多媒体教学视频。另外,本书还为读者提供了大量的Linux学习资料和Ubuntu安装镜像文件,供读者免费下载。

**本书适合广大Linux初中级用户、开源软件爱好者和大专院校的学生阅读,同时也非常适合准备从事Linux平台开发的各类人员。**
> 需要《Linux入门到精通》、《linux系统移植》、《Linux驱动开发入门实战》、《Linux开源网络全栈》电子书籍及教程的工程师朋友们劳烦您转发+评论
详情docs.qq.com/doc/DSmdCdUNwcEJDTXFK