• 编译和运行一个ARM64内核


    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

    1.2 linux内核的下载路径:

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

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

    1.2.2 官方的内核下载链接:

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

    2 编译最小文件系统

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

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

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

    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 
    
    • 1
    • 2

    2.3 编译安装

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

    make 
    make install 
    
    • 1
    • 2

    2.4 根目录的完善

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

    $ ls
    bin  linuxrc  sbin  usr
    
    • 1
    • 2

    2.4.2 完善所需要的文件

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

    2.4.3 添加profile文件

    vim _install/etc/profile
    
    • 1
    #!/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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    2.4.4 添加rcS文件

    vim _install/etc/init.d/rcS
    
    • 1
    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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    2.4.5 添加fstab文件

    vim _install/etc/fstab
    
    • 1
    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
    
    • 1
    • 2
    • 3
    • 4
    • 5

    2.4.6 添加inittab文件

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

    2.4.7 创建设备节点

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

    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
    
    • 1
    • 2
    • 3

    3.2 menuconfig配置

    export ARCH=arm64
    export CROSS_COMPILE=aarch64-linux-gnu-
    make defconfig
    make menuconfig
    
    • 1
    • 2
    • 3
    • 4

    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 
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    3.3 编译

    make all -j16
    
    • 1

    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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    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
    
    • 1

    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 ]#
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
  • 相关阅读:
    「底层原理」一层层剥开文件系统的面纱,彻底理解Linux文件系统
    【Leetcode】题目解析索引表
    java计算机毕业设计汽车美容管理源码+mysql数据库+系统+lw文档+部署
    华为机试 - We Are A Team
    pandas库--DataFrame常用操作
    01.02 环境搭建详细介绍
    13_cgi
    基于XML配置的AOP
    JS-Vue-组件
    算法训练(leetcode)第二十八天 | 509. 斐波那契数、70. 爬楼梯、746. 使用最小花费爬楼梯
  • 原文地址:https://blog.csdn.net/u014100559/article/details/126532526