• Linux驱动开发(四)---树莓派内核编译


    前文回顾

    《Linux驱动开发(一)—环境搭建与hello world》

    《Linux驱动开发(二)—驱动与设备的分离设计》

    《Linux驱动开发(三)—设备树》
    继续宣传一下韦老师的视频

    70天30节Linux驱动开发快速入门系列课程【实战教学、技术讨论、直播答疑】

    在这里插入图片描述
    不过受限于没有钱的烦恼,没去买那么贵的开发板,我决定用树莓派来继续驱动开发的学习。所以需要先搭建一个树莓派的开发环境,能够编译内核模块,并且能够修改DTS,才能进行下一步的学习。
    在这里插入图片描述

    编译环境

    我这里的宿主机安装的ubuntu18,64位的。安装好系统之后,需要安装一些必要软件

    sudo apt update
    sudo apt install net-tools
    sudo apt-get install openssh-server
    sudo apt-get install git
    sudo apt install git bc bison flex libssl-dev make libc6-dev libncurses5-dev
    
    • 1
    • 2
    • 3
    • 4
    • 5

    下面的步骤参考
    官网说明,喜欢看英文的朋友可以移步这里,
    在这里插入图片描述

    安装交叉编译工具

    编译32位系统

    sudo apt install crossbuild-essential-armhf
    
    • 1

    编译64位系统

    sudo apt install crossbuild-essential-arm64
    
    • 1

    下载内核代码

    git clone --depth=1 https://github.com/raspberrypi/linux
    
    • 1

    源码编译

    我用的是3b+的板子,首先要生成配置文件,其实就是把默认配置拷贝过来。

    cd linux
    KERNEL=kernel7
    make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- bcm2709_defconfig
    
    • 1
    • 2
    • 3

    如果是其他的,
    树莓派 1, Zero and Zero W, 树莓派 Compute Module 1:

    cd linux
    KERNEL=kernel
    make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- bcmrpi_defconfig
    
    • 1
    • 2
    • 3

    树莓派 2, 3, 3+ and Zero 2 W, and 树莓派Compute Modules 3 and 3+:

    cd linux
    KERNEL=kernel7
    make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- bcm2709_defconfig
    
    • 1
    • 2
    • 3

    树莓派 4 and 400, and 树莓派 Compute Module 4:

    cd linux
    KERNEL=kernel7l
    make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- bcm2711_defconfig
    
    • 1
    • 2
    • 3

    然后根据配置文件进行编译全部内容

    make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- zImage modules dtbs
    
    • 1

    大概花了我一个多小时,虚拟机,单核2G,确实有点慢
    在这里插入图片描述

    到此,编译内核的过程就完毕了。

    内核替换

    首先需要把SD卡通过读卡器接入ubuntu这个编译服务器,然后能看到sdb设备

    pgg@ubuntu:~$ ls /dev/sd
    sda   sda1  sdb   sdb1  sdb2 
    
    • 1
    • 2

    在这里插入图片描述

    其中,sdb1是FAT文件系统(引导)分区,sdb2是ext4文件系统(根)分区。

    然后分别挂载这两个设备,我这里用了绝对路径,和官方的不太一样。

    mkdir -p /home/pgg/mnt
    mkdir -p /home/pgg/mnt/fat32
    mkdir -p /home/pgg/mnt/ext4
    sudo mount /dev/sdb1 /home/pgg/mnt/fat32
    sudo mount /dev/sdb2 /home/pgg/mnt/ext4
    
    • 1
    • 2
    • 3
    • 4
    • 5

    通过mount命令可以查看
    在这里插入图片描述
    然后将编译好的kernel模块安装到SD卡

    32位系统安装命令:

    sudo env PATH=$PATH make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- INSTALL_MOD_PATH=/home/pgg/mnt/ext4 modules_install
    
    • 1

    64位系统安装命令

    sudo env PATH=$PATH make ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- INSTALL_MOD_PATH=/home/pgg/mnt/ext4 modules_install
    
    • 1

    最后,拷贝内核和设备树,

    32位系统安装命令

    sudo cp /home/pgg/mnt/fat32/$KERNEL.img /home/pgg/mnt/fat32/$KERNEL-backup.img
    sudo cp arch/arm/boot/zImage /home/pgg/mnt/fat32/$KERNEL.img
    sudo cp arch/arm/boot/dts/*.dtb /home/pgg/mnt/fat32/
    sudo cp arch/arm/boot/dts/overlays/*.dtb* /home/pgg/mnt/fat32/overlays/
    sudo cp arch/arm/boot/dts/overlays/README /home/pgg/mnt/fat32/overlays/
    sudo umount /home/pgg/mnt/fat32
    sudo umount /home/pgg/mnt/ext4
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    64位系统安装命令

    sudo cp /home/pgg/mnt/fat32/$KERNEL.img /home/pgg/mnt/fat32/$KERNEL-backup.img
    sudo cp arch/arm64/boot/Image /home/pgg/mnt/fat32/$KERNEL.img
    sudo cp arch/arm64/boot/dts/broadcom/*.dtb /home/pgg/mnt/fat32/
    sudo cp arch/arm64/boot/dts/overlays/*.dtb* /home/pgg/mnt/fat32/overlays/
    sudo cp arch/arm64/boot/dts/overlays/README /home/pgg/mnt/fat32/overlays/
    sudo umount /home/pgg/mnt/fat32
    sudo umount /home/pgg/mnt/ext4
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    另一种选择是将内核复制到同一个位置,但使用不同的文件名,例如kernel-a.img,并不是覆盖内核。
    然后可以config.xt文件来选择Raspberry Pi将引导的内核:
    例如
    kernel=kernel-a.img

    这样做的好处是将自定义内核与系统和任何自动更新工具管理的库存内核映像分开,并允许您在内核无法启动时轻松还原到库存内核。
    就是一个内核选择启动
    在这里插入图片描述

    最后插回SD卡,重启。

    两个消息

    一个好消息,系统成功启动,基本正常。
    一个坏消息,无线网卡没有了,只能用有线连接网络。这个问题后边再查。不能耽误学习进度。
    在这里插入图片描述

    结束语

    今天的热门应该是前某大公司DD被罚了80个亿,理由是各种违法违规的操作,手机用户信息啥的,不过试想手机里哪个APP不是如此,连手机本身都成了窃听器了。
    在这里插入图片描述
    不过人家也是无利不起早,只要我够穷,就不会被他们利用。
    在这里插入图片描述

  • 相关阅读:
    原创: 重构证据定义以消解贝叶斯确证逻辑的内在矛盾
    【死磕NIO】— 探索 SocketChannel 的核心原理
    求直角三角形第三点的坐标
    html页面广告5秒之后跳过
    腾讯待办停止运营,怎么继续提醒事情呢?
    数字图像处理01
    查询方法需要使用事务吗
    3dMax建模笔记(一):介绍3dMax和创建第一个模型Hello world
    共话龙蜥:如何协同构建统一生态?
    一文搞懂什么是单点登录(SSO)及它的优缺点
  • 原文地址:https://blog.csdn.net/baidu_19348579/article/details/125887250