【树莓派Linux内核开发】入门实操篇(虚拟机Ubuntu环境搭建+内核源码获取与配置+内核交叉编译+内核镜像挂载)

【树莓派Linux内核开发】入门实操篇(虚拟机Ubuntu环境搭建+内核源码获取与配置+内核交叉编译+内核镜像挂载)

文章目录

  • 【树莓派Linux内核开发】入门实操篇(虚拟机Ubuntu环境搭建+内核源码获取与配置+内核交叉编译+内核镜像挂载)
    • 一、搭建Ubuntu环境
      • 1.ubuntu18.04镜像下载
      • 2.VMware软件安装
      • 3.安装镜像,创建虚拟机
      • 4.虚拟机安装基础软件(安装过程有询问,直接回车或者Y)
        • 4.1 安装vim
        • 4.2 安装gcc(不会就面向百度开发)
        • 4.3 安装ifconfig
      • 5.添加共享文件夹(虚拟机上默认路径是 /mnt/hgfs/share)
      • 6.拷贝树莓派Linux内核源码和交叉编译工具链
        • 6.1 下载内核源码和工具链
        • 6.2 解压并配置环境变量
    • 二、树莓派等芯片带操作系统的启动过程
      • 1.x86、Intel、windows等设备的启动过程
      • 2.嵌入式产品(树莓派、mini2440、mini6410、nanopi、海思、RK(瑞芯微) )的启动过程
      • 3.安卓操作系统的启动过程
      • 4.小扩展
    • 三、树莓派Linux内核源码简单认知
      • 1.linux内核认知
      • 2.Linux文件系统分区
    • 四、树莓派Linux内核源码配置
      • 1.内核源码配置原因
      • 2.内核源码配置方法
        • 2.1 cp 厂家.config
        • 2.2 make menuconfig 通过菜单一项项配置(通常是基于厂家的config来配置)
        • 2.3 完全自己来(略)
    • 五、树莓派 linux 内核源码编译并运行
      • 1.编译
      • 2.将zmage文件打包成树莓派可用的xxx.img镜像文件
      • 3.将树莓派SD卡的U盘映射到虚拟机
      • 4.数据拷贝
        • 4.1 挂载U盘
        • 4.2 安装modules
        • 4.3 安装并更新kernel.img文件
        • 4.4 拷贝相关配置文件
      • 5.在树莓派上运行编译好的内核镜像
        • 5.1 USB-TTL进行串口打印调试信息,观看启动过程
        • 5.2 SSH连接查看

一、搭建Ubuntu环境

1.ubuntu18.04镜像下载

打开ubuntu18.04镜像传送门,进入到主页

在这里插入图片描述

往下滑,找到相应镜像并下载

在这里插入图片描述

等待镜像下载完毕即可

在这里插入图片描述

2.VMware软件安装

  • VMware是一款运行在windows系统上的虚拟机软件,可以虚拟出一台计算机硬件,方便安装各类操作系统

进入VMware官网传送门,来到主页,往下滑,选着适合的版本进行下载

在这里插入图片描述

下载完成后,双击打开安装应用

在这里插入图片描述

点击下一步

在这里插入图片描述

勾选我接受,继续下一步

在这里插入图片描述

选择自己的安装路径,继续下一步

在这里插入图片描述

全部取消勾选,继续下一步

在这里插入图片描述

最后,点击下一步,开始安装

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

安装完成

在这里插入图片描述

咳咳,最后这部分就交给大家了

MC60H-DWHD5-H80U9-6V85M-8280D

在这里插入图片描述

3.安装镜像,创建虚拟机

打开VMware,点击创建新的虚拟机

在这里插入图片描述

我这里是选择自定义(看自己需求),然后进入下一步

在这里插入图片描述

直接下一步

在这里插入图片描述

选择好之前下载好的镜像文件,接着下一步

在这里插入图片描述

填写好安装信息,继续下一步(用户名有格式要求,不符合的会有提示)

在这里插入图片描述

取好虚拟机名字,选择一个磁盘空间比较大的位置,继续下一步

在这里插入图片描述

根据自己电脑配置量力而行(一般都这么操作也问题不大),继续下一步

在这里插入图片描述

这里就采用推荐内存了,2G

在这里插入图片描述

看情况,我这里选择桥接模式

在这里插入图片描述

后边都选推荐

在这里插入图片描述

在这里插入图片描述

创建虚拟磁盘

在这里插入图片描述

默认20G,下一步即可

在这里插入图片描述

在这里插入图片描述

开始创建

在这里插入图片描述

等待创建完毕即可

在这里插入图片描述

在这里插入图片描述

创建完毕,登录成功

在这里插入图片描述

4.虚拟机安装基础软件(安装过程有询问,直接回车或者Y)

4.1 安装vim

输入命令vi hello.c,发现方向键不好用,系统软件比较古老

arsen@ubuntu:~$ vi hello.c

在这里插入图片描述

输入命令 sudo apt-get install vim 进行下载安装

arsen@ubuntu:~$ sudo apt-get install vim

在这里插入图片描述

在这里插入图片描述

安装完后再次vi hello.c,发现颜色变了,操作也好使起来了

在这里插入图片描述

若发现上不了网,则进行如下操作

  • 打开虚拟机设置,选择桥接模式

    在这里插入图片描述

    在这里插入图片描述

  • 检查编辑里的 虚拟网络编辑器

    在这里插入图片描述

    检查里面的桥接模式(这里的ubuntu18的虚拟机已经帮桥接好,没有桥接模式的显示)

    在这里插入图片描述

4.2 安装gcc(不会就面向百度开发)

编写完测试代码hello.c,发现没有gcc工具进行编译

在这里插入图片描述

面向百度后,得到下面命令,该命令将安装一堆新包,包括gcc,g++和make工具

sudo apt install build-essential

在这里插入图片描述

安装好后,进行编译,运行成功(应该加个\n的)

在这里插入图片描述

4.3 安装ifconfig

输入命令ifconfig,发现运行失败

在这里插入图片描述

面向百度后,输入安装命令

sudo apt install net-tools

一开始遇到了安装失败的问题,后面把报错信息面向百度/CSDN后,得到参考解决方法,先弄两条命令再安装

报错信息:

E: Could not get lock /var/lib/dpkg/lock-frontend - open (11: Resource temporarily unavailable)
E: Unable to acquire the dpkg frontend lock (/var/lib/dpkg/lock-frontend), is another process using it?

解决方法:

sudo rm /var/lib/dpkg/lock-frontend
sudo rm /var/lib/dpkg/lock
sudo apt install net-tools

在这里插入图片描述

安装成功

在这里插入图片描述

5.添加共享文件夹(虚拟机上默认路径是 /mnt/hgfs/share)

点开虚拟机的设置

在这里插入图片描述

在选项里,启动并添加

在这里插入图片描述

选择本地电脑的文件夹路径,设置好此文件夹在虚拟机中的名字,继续下一步

在这里插入图片描述

完成添加,并确定

添加好后,虚拟机上的共享文件夹默认路径是 /mnt/hgfs/share

在这里插入图片描述

6.拷贝树莓派Linux内核源码和交叉编译工具链

6.1 下载内核源码和工具链

先到树莓派Linux内核源码地址,选择适合自己树莓派版本的,把源码下载到本地,放到共享文件夹下

版本查询

树莓派上运行 uname -r(演示一下)

uname -r

在这里插入图片描述
在这里插入图片描述

(我的树莓派是3B+,烧录的镜像是官方的标准镜像,看上面的内核版本我应该下载6.xx的才对,这里下错了,不过问题不大,只是测验,但对应版本的才能进行驱动和运行编译出来的东西)

在这里插入图片描述

在这里插入图片描述

再下载树莓派交叉编译工具到share共享文件夹

传送门

在这里插入图片描述

在这里插入图片描述

6.2 解压并配置环境变量

继续操作上面的虚拟机,删除当前目录下的所有文件(没啥用的文件)

rm * -rf

在这里插入图片描述

接着,使用命令创建一个SYSTEM文件夹并进入

mkdir SYSTEM
cd SYSTEM

然后,使用 cp 命令,把我们在电脑上下载好的文件拷贝到虚拟机的当前目录

cp /mnt/hgfs/share/linux-rpi-4.19.y.zip .
cp /mnt/hgfs/share/tools-master.zip .

在这里插入图片描述

使用uzip命令解压压缩包

(这里显示我没有uzip,而且安装uzip还失败了,报错:E: Unable to locate package uzip)

arsen@ubuntu:~/SYSTEM$ ls
linux-rpi-4.19.y.zip  tools-master.zip
arsen@ubuntu:~/SYSTEM$ uzip tools-master.zip 

Command 'uzip' not found, but there are 16 similar ones.

arsen@ubuntu:~/SYSTEM$ sudo apt-get install uzip
[sudo] password for arsen: 
Reading package lists... Done
Building dependency tree       
Reading state information... Done
E: Unable to locate package uzip
arsen@ubuntu:~/SYSTEM$ 

最后,问题解决了,发现是解压命令错了,应该是unzip

不过,如果报错如上:E: Unable to locate package xxx

原因:刚安装,软件源还来不及更新,无法找到包

解决办法:
1.首先尝试update命令
sudo apt-get update

2.如果不行则执行upgrade
sudo apt-get upgrade

3.最后上面两项都不行则尝试
sudo apt-get install aptitude

成功以后使用

sudo aptitude install xxx

先使用unzip解压交叉编译工具链

unzip tools-master.zip 

然后,安装交叉编译工具链,并进行配置使它永久有效

先cd到根目录,再输入命令 vi .bashrc

vi .bashrc

在这里插入图片描述

快捷键 shift + g 跳到最后一行

在这里插入图片描述

另一边先进入解压后的arm-bcm2708文件夹

cd tools-master/arm-bcm2708

在这里插入图片描述

一步步获取交叉编译工具链的绝对路径

pwd 打印出来的:

/home/arsen/SYSTEM/tools-master/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian-x64/bin

echo $PATH 打印出来的:

/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin

arsen@ubuntu:~/SYSTEM/tools-master/arm-bcm2708$ ls
arm-bcm2708hardfp-linux-gnueabi  arm-rpi-4.9.3-linux-gnueabihf
arm-bcm2708-linux-gnueabi        gcc-linaro-arm-linux-gnueabihf-raspbian
arm-linux-gnueabihf              gcc-linaro-arm-linux-gnueabihf-raspbian-x64
arsen@ubuntu:~/SYSTEM/tools-master/arm-bcm2708$ cd gcc-linaro-arm-linux-gnueabihf-raspbian-x64
arsen@ubuntu:~/SYSTEM/tools-master/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian-x64$ ls
arm-linux-gnueabihf  bin  lib  libexec  share
arsen@ubuntu:~/SYSTEM/tools-master/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian-x64$ cd bin
arsen@ubuntu:~/SYSTEM/tools-master/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian-x64/bin$ pwd
/home/arsen/SYSTEM/tools-master/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian-x64/bin
arsen@ubuntu:~/SYSTEM/tools-master/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian-x64/bin$ echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin
arsen@ubuntu:~/SYSTEM/tools-master/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian-x64/bin$ 

在这里插入图片描述

接着,回到配置窗口,在最后一行加上(第二句的路径是echo $PATH 获取的 + pwd 获取的)

export PATH=$PATH:/home/arsen/SYSTEM/tools-master/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian-x64/bin
#或者下面这句,二选一就行
export PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/:/home/arsen/SYSTEM/tools-master/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian-x64/bin

在这里插入图片描述

配置好后,返回操作目录,使用下面命令进行加载

source .bashrc

检查工具链版本,成功运行则安装完毕

arm-linux-gnueabihf-gcc -v

在这里插入图片描述

最后,进入SYSTEM文件夹,对内核源码压缩包进行解压

cd SYSTEM
unzip linux-rpi-4.19.y.zip

解压完毕,准备工作完成

在这里插入图片描述

二、树莓派等芯片带操作系统的启动过程

1.x86、Intel、windows等设备的启动过程

启动过程:

  • 电源 —> BIOS —> windows内核 —> C,D盘的启动 —> 程序的启动(例如QQ的启动)

2.嵌入式产品(树莓派、mini2440、mini6410、nanopi、海思、RK(瑞芯微) )的启动过程

启动过程:

  • 电源 —> BootLoader (引导操作系统启动) —> linux内核 —> 文件系统(根据功能性来组织文件夹,带访问权限)—> 嵌入式产品的启动(例如KTV点歌机,人脸识别打卡机,智能家居主控)

3.安卓操作系统的启动过程

启动过程:

  • 电源 —> fastBoot/Bootloader/ —> linux内核 —> 文件系统 —> 虚拟机 —> HOME应用程序 —> 点击某图标打开某app

4.小扩展

C51、STM32(裸机,不带操作系统)的开发流程

  • 不带操作系统的裸机开发是C语言直接操控底层寄存器实现相关业务

BootLoader开发:

  • 一阶段:让CPU跟内存,FLASH,串口,IIC,IIS,数据段等打交道(汇编和C结合驱动这些设备)
  • 二阶段:引导Linux内核启动(纯C操作)

三、树莓派Linux内核源码简单认知

1.linux内核认知

  • linux是开源的,免费的,由其linux开源社区工作者和爱好者共同进行维护

  • linux是一个开源的,支持多架构多平台代码;

    如ARM:海思,树莓派,RK,nanoPi,友善之臂;X86;PowerPC,MIPS

  • 可移植性非常高

  • linux内核大约由1.3w个C文件组成,1100w行代码左右;

    但是linux内核编译出来一般就是几M,一般是4M左右;

    因为是支持多平台多架构,所以在编译之前是需要进行配置的,配置成适合的目标平台来用

2.Linux文件系统分区

详细分区传送门

在这里插入图片描述

上图Linux文件都是根据功能来放的

  • dev: 放的是设备相关,
  • lib: 放的是各种动态库和静态库,
  • proc: 放的是内核的数据信息,
  • home:是用户登录的工作界面,
  • opt: 是跟内核底层有关的,
  • sbin: 通常是可执行文件或指令,
  • bin: 也是指令和可执行文件,
  • boot: 是启动要加载的配置等等。

四、树莓派Linux内核源码配置

1.内核源码配置原因

操作树莓派需要进行驱动代码的编写,编写完后,代码运行需要进行驱动代码的编译,而驱动代码的编译需要一个提前编译好的内核,编译内核必须要进行内核源码的配置。

(配置的最终目标会生成 .config文件,该文件指导Makefile去把有用东西组织成内核)

2.内核源码配置方法

Linux内核源码配置,其实就是配置config

  • linux源码中有很多工程:
    树莓派1的工程是bcmrpi_defconfig
    树莓派2、3的工程是bcm2709_defconfig

    树莓派4的工程是bcm2711_defconfig(临时ChatGPT查的)

2.1 cp 厂家.config

厂家linux内核源码,比如说买了树莓派,厂家就会向我们提供树莓派linux内核源码,可以进行参考

使用厂家源码中的工程文件,进行cp 厂家.config

先进入树莓派Linux内核源码文件夹,然后运行下面指令,查看各个架构的工程文件

find . -name *_defconfig

在这里插入图片描述

树莓派3的工程文件

在这里插入图片描述

使用下面命令获取bcm2709_defconfig的配置到 .config里

ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- KERNEL=kernel7 make bcm2709_defconfig

命令解释:

#命令解释
ARCH=arm(指定当前要编译的是arm架构)
CROSS_COMPILE=arm-linux-gnueabihf- (指定编译器是树莓派交叉编译工具链)
KERNEL=kernel7 (指明kernel类型,树莓派1设置为kernel,树莓派2,3设置为kernel7,树莓派4设置为kernel7l)
make bcm2709_defconfig(make为配置命令)

在这里插入图片描述

在执行该命令的过程了我遇到了两次报错

  • 第一次报错:

    YACC scripts/kconfig/zconf.tab.c
    /bin/sh: 1: bison: not found
    scripts/Makefile.lib:196: recipe for target ‘scripts/kconfig/zconf.tab.c’ failed
    make[1]: *** [scripts/kconfig/zconf.tab.c] Error 127
    Makefile:534: recipe for target ‘bcm2709_defconfig’ failed
    make: *** [bcm2709_defconfig] Error 2

    解决方法:

    根据报错信息来看,这是由于缺少bison工具导致的错误。bison是用于生成解析器的工具,需要进行安装才能继续进行编译过程。

    在树莓派上安装bison的方法可以尝试以下命令:

    sudo apt-get install bison

    在这里插入图片描述

  • 第二次报错:

    YACC scripts/kconfig/zconf.tab.c
    LEX scripts/kconfig/zconf.lex.c
    /bin/sh: 1: flex: not found
    scripts/Makefile.lib:188: recipe for target ‘scripts/kconfig/zconf.lex.c’ failed
    make[1]: *** [scripts/kconfig/zconf.lex.c] Error 127
    Makefile:534: recipe for target ‘bcm2709_defconfig’ failed
    make: *** [bcm2709_defconfig] Error 2

    解决方法:

    根据报错信息,这次报错是由于缺少flex工具导致的。flex是用于生成词法分析器的工具,需要进行安装才能继续进行编译过程。

    在树莓派上安装flex的方法可以尝试以下命令:

    sudo apt-get install flex

    在这里插入图片描述


2.2 make menuconfig 通过菜单一项项配置(通常是基于厂家的config来配置)

通过make menuconfig 一项项的来配置,通常都是基于厂家的config来进行配置。

通过这样的"裁剪",可以减小内核的体积。

先安装一些必要的库

sudo apt-get install bc
sudo apt-get install libncurses5-dev libncursesw5-dev
sudo apt-get install zlib1g:i386
sudo apt-get install libc6-i386 lib32stdc++6 lib32gcc1 lib32ncurses5

安装好后,运行下面指令,在内核菜单进行配置

ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- KERNEL=kernel7 make menuconfig

在这里插入图片描述

选项解释

  • General setup —>(通用选项)
  • [ * ] Enable loadable module support —> 内核模块选项
  • [ * ]Enable the block layer —> 块设备逻辑层选项(大文件支持、分区、I/O调度)
  • System Type —>(平台选项)
  • Bus support —> 总线选项
  • Kernel Features —>内核特征
  • Boot options —> 引导选项
  • CPU Power Management —> CPU电源管理选项
  • Floating point emulation —> 浮点运算
  • Userspace binary formats —> 用户程序格式
  • Power management options —> 电源管理选项
  • [*] Networking support —> 网络协议选项
  • Device Drivers —> 设备驱动
  • Firmware Drivers ---- 驱动固件选项
  • File systems —> 文件系统选项
  • Kernel hacking —> 内核调试选项
  • Security options —> 安全模块选项

选择要配置的文件,使用空格可以切换[ ]里面的模式。

[*]:编译进内核(*代表Y,编译进内核,zImage包含了驱动)
[M]:编译成模块(以模块的方式生成驱动文件xxx.ko,系统启动后,
                通过命令inmosd xxx.ko来加载驱动,也可以减小一些内核大小)
[ ]:表示不需要的部分
空格可切换修改。
修改完毕后,保存退出
2.3 完全自己来(略)

xxxx


五、树莓派 linux 内核源码编译并运行

1.编译

运行下面指令进行编译

编译的时间会比较久(看电脑配置,20~30分钟少不了)

编译过程中如果跑了几分钟没有报错,那就是没问题,等就行了

ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- KERNEL=kernel7 make -j4 zImage modules dtbs

命令解释:

#命令解释
ARCH=arm(指定当前要编译的是arm架构)
CROSS_COMPILE=arm-linux-gnueabihf- (指定编译器是树莓派交叉编译工具链)
KERNEL=kernel7 (指明kernel类型,树莓派1设置为kernel,树莓派2,3设置为kernel7,树莓派4设置为kernel7l)
make -j4:指定用多少电脑资源进行编译(j4是四核的意思,这个要每个人根据
          自己的电脑的配置以及虚拟机的设置的核数来决定,我之前虚拟机设置的是4核)
zImage:生成内核镜像
modules:要生成驱动模块
dtbs:生成配置文件

编译过程中,我一下子就遇到了一个报错

scripts/extract-cert.c:21:10: fatal error: openssl/bio.h: No such file or directory
#include <openssl/bio.h>
^~~~~~~~~~~~~~~
compilation terminated.
scripts/Makefile.host:90: recipe for target ‘scripts/extract-cert’ failed
make[1]: *** [scripts/extract-cert] Error 1
make[1]: *** Waiting for unfinished jobs…
UPD include/generated/asm-offsets.h
CALL scripts/checksyscalls.sh
Makefile:1073: recipe for target ‘scripts’ failed
make: *** [scripts] Error 2

在这里插入图片描述

解决方法:

根据报错信息来看,这是由于缺少openssl库导致的错误。缺少openssl/bio.h头文件。

在树莓派上安装openssl库的方法可以尝试以下命令:

sudo apt-get install libssl-dev

解决后再运行编译命令就一直跑了,应该没问题了,等待就好

在这里插入图片描述

编译完成

编译成功后,会生成vmlinux文件,失败则无此文件

在这里插入图片描述

2.将zmage文件打包成树莓派可用的xxx.img镜像文件

生成的zImage文件在/home/arsen/SYSTEM/linux-rpi-4.19.y/arch/arm/boot路径的boot文件夹下

在这里插入图片描述

回到内核源码目录,输入下面命令进行镜像打包(会生成kernel_new.img适合树莓派使用的镜像文件)

./scripts/mkknlimg arch/arm/boot/zImage ./kernel_new.img

在这里插入图片描述

3.将树莓派SD卡的U盘映射到虚拟机

将插有树莓派SD卡的U盘插入电脑,通过下面操作,把U盘映射到ubuntu虚拟机(U盘插入过程中,电脑有时会自动识别到并询问是否进行映射,问题不大,可自行百度解决)

在这里插入图片描述

输入下面命令,查看内核信息(可以显示系统中各种硬件设备的信息),有设备接入的时候内核会打印出驱动层面的信息

dmesg

看到sb1,sb2,则说明接入成功

sdb1,2分别是树莓派sd卡的两个分区(sd卡在刷树莓派镜像的时候会自动变成两个分区)

  • ①一个fat分区,是boot相关的内容,kernel的img文件在此分区。
  • ②一个是ext4分区,也就是系统的根目录分区。(cd /进入的就是系统的根目录)

在这里插入图片描述

4.数据拷贝

4.1 挂载U盘

返回到原先创建SYSTEM目录的地方,再创建data1和data2两个文件夹

在这里插入图片描述

运行下面指令,将两个分区挂载到新创建的两个数据文件夹

sudo mount /dev/sdb1 data1  
    #挂载U盘的sdb1文件分区到当前路径下的data1文件夹,   
    #该分区为fat分区,是boot相关的内容,kernel的img.
sudo mount /dev/sdb2 data2  
    #挂载U盘的sdb2文件分区到当前路径下的data2文件夹,
    #该分区为ext4分区,也就是系统的根目录分区.

在这里插入图片描述

运行完后,两个新建的文件夹就都有数据了,都分别关联到了两个分区

data1为fat分区(boot相关),data2为ext4分区(系统根目录相关)一定要对应好!!!

在这里插入图片描述

4.2 安装modules

运行指令安装,因为内核配置时,有一部分是编译成模块的形式配置进来的,安装后hdmi接口、usb、wifi、io口等等的设备才能使用,所以需要这么一步。

回到内核源码文件夹,运行安装命令

# 操作ext4分区需要root权限,sudo
# [ext4]为第二分区(sdb2)虚拟机上挂载的地址(data2的位置),需要根据自己的地址更改
# 更改前
sudo ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- KERNEL=kernel7 make INSTALL_MOD_PATH=[ext4] modules_install
# 更改后,我的,注意将代码的“[ext4]”更改为data2的绝对路径 !!
sudo ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- KERNEL=kernel7 make INSTALL_MOD_PATH=/home/arsen/data2 modules_install

在这里插入图片描述

安装完成

在这里插入图片描述

4.3 安装并更新kernel.img文件

注意查看原来镜像名字是kernel7.img

ls /home/arsen/data1

在这里插入图片描述

在操作过程中,原来的这个kernel7.img会被覆盖,为了防止刷机失败,或者拷贝过程中文件损坏,需要提前用别名备份这个文件。

打开新的终端(ctrl alt t)(方便操作罢了),进入其存放路径(cd /home/data1)

sudo cp kernel7.img kernel7OLD.img

在这里插入图片描述

从内核源码目录(linux-rpi-4.19.y)拷贝kernel_new.img(是由zImage打包而成)到data1并且命名为kernel7.img覆盖原来的文件

sudo cp kernel_new.img /home/arsen/data1/kernel7.img

检查拷贝是否有问题,使用命令md5sum显示文件的唯一编码号,若相同则为同一个文件

  • md5sum kernel_new.img
  • md5sum /home/arsen/data1/kernel7.img

在这里插入图片描述

4.4 拷贝相关配置文件

从内核源码目录linux-rpi-4.19.y进行拷贝,这些配置文件是为了能够加载驱动以及一些其他的配置

# 修改前,[fat]为第一分区(sdb1)虚拟机上挂载的地址(data1的位置),需要根据自己的地址更改
cp arch/arm/boot/dts/.*dtb* [fat]/
cp arch/arm/boot/dts/overlays/.*dtb* [fat]/overlays/
cp arch/arm/boot/dts/overlays/README [fat]/overlays/
# 按自己需求修改后,README是说明书
cp arch/arm/boot/dts/.*dtb* /home/arsen/data1/
cp arch/arm/boot/dts/overlays/.*dtb* /home/arsen/data1/overlays/
cp arch/arm/boot/dts/overlays/README /home/arsen/data1/overlays/

在这里插入图片描述

5.在树莓派上运行编译好的内核镜像

5.1 USB-TTL进行串口打印调试信息,观看启动过程

先点击选择断开连接sd卡,使其重新挂载在windows上

在这里插入图片描述

添加USB串口信息,如果之前在做别的项目,例如串口编程时,会把这个配置信息删掉,这时需要添加回来

在这里插入图片描述

配置好后,sd卡插回树莓派,USB-TTL连接,用MobaXterm进行串口连接,可以看到启动正常。

此时,可以再输入查看内核版本的命令进行确认(如果和之前不一样,则说明更换成功)

uname -r
uname -a
5.2 SSH连接查看

用指令uname -r/a查看内核版本,发现内核版本与之前相比,已然发生了变化,说明更换成功

我这边用的是SSH连接,内核更换后,我发现之前的wifi配置信息还是有效的,就直接通过MobaXterm进行SSH连接树莓派了

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/563089.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

什么是0-day漏洞,怎么防护0-day漏洞攻击

随着信息技术的快速发展&#xff0c;网络安全问题日益凸显&#xff0c;其中0day漏洞攻击作为一种高级威胁手段&#xff0c;给企业和个人用户带来了极大的风险。下面德迅云安全就对0day漏洞攻击进行简单讲解下&#xff0c;并分享相应的一些安全措施&#xff0c;以期提高网络安全…

网络空间地图测绘理论体系白皮书(2023年)02网络空间测绘研究背景(想法比较好,着重看)

01前言 02 网络空间测绘研究背景 2.1 网络空间的起源 2.2 传统测绘理论 2.3 网络空间测绘相关工作 03 测绘体系框架概念定义 3.1 网络空间 3.2 网络空间地图测绘 3.3 体系框架总体思路 04 测绘体系框架应用实践 4.1 网络空间地形图 4.2 网络空间地志图 4.3 网络空间战略图 05 总…

Python 全栈安全(一)

原文&#xff1a;annas-archive.org/md5/712ab41a4ed6036d0e8214d788514d6b 译者&#xff1a;飞龙 协议&#xff1a;CC BY-NC-SA 4.0 前言 序言 多年前&#xff0c;我在亚马逊搜索了一本基于 Python 的应用程序安全书。我以为会有多本书可供选择。已经有了很多其他主题的 Pyt…

【ZYNQ】Zynq 芯片介绍

Zynq 是 Xilinx 公司提出的全可编程 SoC 架构&#xff0c;集成了单核或多核 ARM 处理器与 Xilinx 16nm 或 28nm 可编程逻辑&#xff0c;包括 Zynq 7000 Soc&#xff0c;Zynq UltraScale MPSoC 和 Zync UltraScale RFSoC 等系列。本文主要介绍 Xilinx Zynq 7000 系列芯片架构、功…

Hadoop1X,Hadoop2X和hadoop3X有很大的区别么?

Hadoop的演进从Hadoop 1到Hadoop 3主要是为了提供更高的效率、更好的资源管理、更高的可靠性以及对更多数据处理方式的支持。下面是Hadoop 1, Hadoop 2, 和 Hadoop 3之间的主要区别和演进的原因&#xff1a; Hadoop 1 特点&#xff1a; 主要包括两大核心组件&#xff1a;HDFS&a…

simple-jwt快速入门(包含自定制)

simple-jwt快速入门(包含自定制) 目录 simple-jwt快速入门(包含自定制)安装路由层视图层全局配置前端传入参数配置文件定制登录返回格式定制payload格式自定制签发-认证 安装 pip install djangorestframework-simplejwt路由层 from rest_framework_simplejwt.views import T…

【 AIGC 研究最新方向(上)】面向平面、视觉、时尚设计的高可用 AIGC 研究方向总结

目前面向平面、视觉、时尚等设计领域的高可用 AIGC 方向有以下 4 种&#xff1a; 透明图层生成可控生成图像定制化SVG 生成 本篇&#xff08;上篇&#xff09;介绍 1、2&#xff0c;而下篇将介绍 3、4。 透明图层生成 LayerDiffuse 代表性论文&#xff1a;Transparent Imag…

Qt基础之四十六:Qt界面中嵌入第三方程序的一点心得

本文主要讲解QWidget和QWindow的区别,以及如何在QWidget中嵌入第三方程序,并完美解决在QWidget中嵌入某些程序(比如Qt程序)时出现的白边问题。 下面是嵌入QQ音乐的样子,这首歌还不错。 先用spy++查看QQ音乐的窗口信息,如果安装了Visual Studio,工具菜单里自带spy++ 然后…

Spring Boot | Spring Boot 默认 “缓存管理“ 、Spring Boot “缓存注解“ 介绍

目录: 一、Spring Boot 默认 "缓存" 管理 :1.1 基础环境搭建① 准备数据② 创建项目③ 编写 "数据库表" 对应的 "实体类"④ 编写 "操作数据库" 的 Repository接口文件⑤ 编写 "业务操作列" Service文件⑥ 编写 "applic…

Redis入门到通关之数据结构解析-QuickList

文章目录 ☃️前提概要☃️ 配置项相关☃️简要源码☃️总结 Redis中的 QuickList 是一种特殊的数据结构&#xff0c;用于存储列表类型的数据。它的设计目的是在内存中高效地存储和操作大量的列表元素&#xff0c;尤其是当列表长度很大时。 QuickList的内部结构是一个由多个节…

政安晨:【Keras机器学习示例演绎】(八)—— 利用 PointNet 进行点云分割

目录 简介 导入 下载数据集 加载数据集 构建数据集 预处理 创建 TensorFlow 数据集 PointNet 模型 排列不变性 变换不变性 点之间的相互作用 实例化模型 训练 直观了解培训情况 推论 最后说明 政安晨的个人主页&#xff1a;政安晨 欢迎 &#x1f44d;点赞✍评论…

【PCL】教程 implicit_shape_model.cpp 3D点云数据的对象识别 利用隐式形状模型进行训练和识别...

ism_test_cat.pcd 参数&#xff1a;ism_train_cat.pcd 0 ism_train_horse.pcd 1 ism_train_lioness.pcd 2 ism_train_michael.pcd 3 ism_train_wolf.pcd 4 ism_test_cat.pcd 0 这里红点表示对应感兴趣类别的对象预测中心 ./ism_t…

字节FE:JavaScript学习路线图

JavaScript简介 JavaScript是一种高级的、解释执行的编程语言。它是互联网的三大核心技术之一&#xff0c;与HTML和CSS一同工作&#xff0c;用于创建交互式的网页。JavaScript被所有现代网页浏览器支持而不需要任何插件。它可以增强用户界面和网页的交互性&#xff0c;可以进行…

【讲解下Spring Boot单元测试】

&#x1f308;个人主页: 程序员不想敲代码啊 &#x1f3c6;CSDN优质创作者&#xff0c;CSDN实力新星&#xff0c;CSDN博客专家 &#x1f44d;点赞⭐评论⭐收藏 &#x1f91d;希望本文对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出指正&#xff0c;让我们共…

FineBi中创建自定义的图表

FineBi中增加自己的自定义图表组件,比如: 的相关笔记: 1 获取有哪些BI自定义图表组件:http://localhost:8080/webroot/decision/v5/plugin/custom/component/list?_=1713667435473[{"name": "图表DEMO_EK","chartType": "amap_demo&q…

GO环境及入门案例

文章目录 简介一、win GO开发环境安装二、Linux go运行环境二、GO代码入门2.1 导包案例2.2 赋值2.3 变量、函数2.4 三方库使用 简介 go不是面向对象语言&#xff0c; 其指针、结构体等比较像C&#xff0c;知名的go 开源项目有docker k8s prometheus node-exporter等 一、win …

如何在3dMax中快速打包mzp 文件?

如何在3dMax中创建mzp 文件&#xff1f; 我喜欢将我的Maxscript脚本发布为mzp文件。这是一个为3dMax构建的自解压zip文件。在mzp文件中&#xff0c;您可以捆绑Maxscript脚本文件、图片、预设或其他文件&#xff0c;并链接安装时执行的特殊操作。 在3dMax中使用大型脚本时&…

耐高温300度锅炉轴承,江苏鲁岳轴承制造的行业标杆

自润滑轴承-产品类型-耐高温轴承-不锈钢轴承-江苏鲁岳轴承制造有限公司。锅炉轴承&#xff0c;耐高温至200度-800度。 江苏鲁岳轴承制造有限公司&#xff0c;一家专注于锅炉轴承和耐高温轴承的研发与生产的企业&#xff0c;致力于为客户提供高质量、高性能的轴承解决方案。其中…

LeetCode题练习与总结:矩阵置零--73

一、题目描述 给定一个 m x n 的矩阵&#xff0c;如果一个元素为 0 &#xff0c;则将其所在行和列的所有元素都设为 0 。请使用 原地 算法。 示例 1&#xff1a; 输入&#xff1a;matrix [[1,1,1],[1,0,1],[1,1,1]] 输出&#xff1a;[[1,0,1],[0,0,0],[1,0,1]]示例 2&#xf…

Linux-内存文件

1. 基础IO操作 1.1 c语言的IO接口 fopen&#xff1a;打开一个文件&#xff0c;按照指定方式 参数&#xff1a;filename 文件名&#xff0c;也可以是路径&#xff0c;mode&#xff1a;打开方式 返回打开的文件指针 fread&#xff1a;从指定流中读数据 参数&#xff1a;从FIL…