码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • 编译和运行一个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.bz2和linux-5.10.tar.xz,分别通过tar -xvf busybox-1.35.0.tar.bz2和tar -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
  • 相关阅读:
    【Azure Developer - 密钥保管库 】使用 Python Azure SDK 实现从 Azure Key Vault Certificate 中下载证书(PEM文件)
    猿创征文 | [云原生]为微服务保驾护航之链路跟踪skywalking保姆级搭建教程
    qnx shell sh ,linux shell bash
    leetcode 310 最小高度树
    Matplotlib绘制动图以及绘制平滑曲线
    【数字测图原理与方法】第三章水准测量原理和仪器
    23届前端面试选择题(长期更新)
    湖仓一体电商项目(八):业务实现之编写写入ODS层业务代码
    基于改进莱维飞行和混沌映射的粒子群优化BP神经网络分类研究(Matlab代码实现)
    MySQL 基本操作1
  • 原文地址:https://blog.csdn.net/u014100559/article/details/126532526
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号