编译和运行一个ARM64内核

编译和运行一个ARM64内核

  • 1 准备工具
    • 1.1 busybox的下载路径:
    • 1.2 linux内核的下载路径:
      • 1.2.1 国内阿里云linux内核源代码的镜像:
      • 1.2.2 官方的内核下载链接:
  • 2 编译最小文件系统
    • 2.1 配置编译处理器架构和交叉编译工具
    • 2.2 配置menuconfig菜单
    • 2.3 编译安装
    • 2.4 根目录的完善
      • 2.4.1 新生成的_install目录里面包含以下几个文件
      • 2.4.2 完善所需要的文件
      • 2.4.3 添加profile文件
      • 2.4.4 添加rcS文件
      • 2.4.5 添加fstab文件
      • 2.4.6 添加inittab文件
      • 2.4.7 创建设备节点
  • 3 编译linux内核
    • 3.1 配置编译工具和架构
    • 3.2 menuconfig配置
    • 3.3 编译
  • 4 启动linux内核
    • 4.1 制作模拟磁盘
    • 4.2 执行qemu
    • 4.3 启动之后的现象

1 准备工具

需要下载busybox和linux内核,我下载的是busybox-1.35.0.tar.bz2linux-5.10.tar.xz,分别通过tar -xvf busybox-1.35.0.tar.bz2tar -xvf linux-5.10.tar.xz解压。(linux内核linux-5.10和linux-5.17.9经过测试都是可以的,但是linux-5.19在使用中存在一些问题,目前还不清楚问题的根本原因)

1.1 busybox的下载路径:

https://busybox.net/downloads/

1.2 linux内核的下载路径:

1.2.1 国内阿里云linux内核源代码的镜像:

http://mirrors.aliyun.com/linux-kernel/?spm=a2c6h.25603864.0.0.54434823gkVvPG

1.2.2 官方的内核下载链接:

https://mirrors.edge.kernel.org/pub/linux/kernel/

2 编译最小文件系统

首先先解压下载的busybox,我自己下载的是当前最新版本的busybox-1.35.0,然后按照下面的步骤去制作最小文件系统即可。

2.1 配置编译处理器架构和交叉编译工具

1. cd busybox-1.35.0  
2. make ARCH=arm64 defconfig
3. make ARCH=arm64 menuconfig

2.2 配置menuconfig菜单

这会打开一个配置菜单,在配置菜单中修改以下几个选项,然后保存退出。

Busybox Settings ---> Build Options ---> Build BusyBox as a static binary (no shared libs) ---> yes  
Busybox Settings ---> Build Options ---> (aarch64-linux-gnu-) Cross compiler prefix 

2.3 编译安装

在执行下面的步骤之后会生成_install 文件夹。

make 
make install 

2.4 根目录的完善

2.4.1 新生成的_install目录里面包含以下几个文件

$ ls
bin  linuxrc  sbin  usr

2.4.2 完善所需要的文件

cd _install 
mkdir -pv {home,root,lib,etc/init.d,proc,sys,home,dev,usr/{lib,bin,sbin}} 

2.4.3 添加profile文件

vim _install/etc/profile
#!/bin/sh
export HOSTNAME=jimmy
export USER=root
export HOME=/home
export PS1="[$USER@$HOSTNAME \W]\# "
PATH=/bin:/sbin:/usr/bin:/usr/sbin
LD_LIBRARY_PATH=/lib:/usr/lib:$LD_LIBRARY_PATH
export PATH LD_LIBRARY_PATH

2.4.4 添加rcS文件

vim _install/etc/init.d/rcS
mkdir -p /sys
mkdir -p /tmp
mkdir -p /proc
mkdir -p /mnt
/bin/mount -a
mkdir -p /dev/pts
mount -t devpts devpts /dev/pts
echo /sbin/mdev > /proc/sys/kernel/hotplug
mdev -s

2.4.5 添加fstab文件

vim _install/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
debugfs /sys/kernel/debug debugfs defaults 0 0

2.4.6 添加inittab文件

vim _install/etc/inittab
::sysinit:/etc/init.d/rcS
::respawn:-/bin/sh
::askfirst:-/bin/sh
::ctrlaltdel:/bin/umount -a -r

2.4.7 创建设备节点

cd _install/dev
sudo mknod console c 5 1
sudo mknod null c 1 3

3 编译linux内核

我下载的linux-5.0的linux内核linux-5.10.tar.xz,之前使用的linux-5.19.tar.xz的内核,但是在使用的时候有一些问题,把内核切换到linux-5.10.tar.xz之后测试是OK。

3.1 配置编译工具和架构

tar -xvf linux-5.10.tar.xz
cd linux-5.10
sudo cp -fr ../busybox-1.35.0/_install  _install_arm64

3.2 menuconfig配置

export ARCH=arm64
export CROSS_COMPILE=aarch64-linux-gnu-
make defconfig
make menuconfig

menuconfig按照下面的方式去配置

-> General setup
[*] Initial RAM filesystem and RAM disk (initramfs/initrd) support
	(_install_arm64) Initramfs source file (s)
...
 -> Device Drivers 
 [*] PCI support 
 [*] Block devices 
     [*] Virtio block driver 
 [*] Virtio drivers 
 [*]  PCI driver for virtio devices 
 [*]    Support for legacy virtio draft 0.9.X and older devices 
 [*]  Virtio balloon driver 
 [*]  Virtio input driver 
 [*]  Platform bus driver for memory mapped virtio devices 
 [*]    Memory mapped virtio devices parameter parsing 

3.3 编译

make all -j16

4 启动linux内核

4.1 制作模拟磁盘

sudo dd if=/dev/zero of=rootfs.ext4 bs=1M count=8192
sudo mkfs.ext4 rootfs.ext4
sudo mkdir -p tmpfs
sudo mount -t ext4 rootfs.ext4 tmpfs/ -o loop
sudo cp -af _install_arm64/* tmpfs/
sudo umount tmpfs
sudo rm -rf tmpfs
sudo chmod 777 rootfs.ext4

4.2 执行qemu

qemu-system-aarch64 -machine virt -cpu cortex-a57 -machine type=virt  -m 1024 -smp 4 -kernel arch/arm64/boot/Image --append "noinitrd root=/dev/vda rw console=ttyAMA0 loglevel=8" -drive if=none,file=rootfs.ext4,id=hd0 -device virtio-blk-device,drive=hd0 -netdev user,id=eth0 -device virtio-net-device,netdev=eth0 -nographic

4.3 启动之后的现象

[    1.909965]     TERM=linux
[    2.076950] 9pnet_virtio: no channels available for device kmod_mount
mount: mounting kmod_mount on /mnt failed: No such file or directory

Please press Enter to activate this console.
[root@Tester ]#
[root@Tester ]#
[root@Tester ]# ls
bin         home        lost+found  root        test.txt    var
dev         lib         mnt         sbin        tmp
etc         linuxrc     proc        sys         usr
[root@Tester ]#

你可能感兴趣的:(linux嵌入式开发,编译和运行一个ARM64内核,qemu,arm64)