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

news2024/12/24 0:21:18

【树莓派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连接树莓派了

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【Hadoop】- YARN架构[7]

前言 Yarn架构是一个用于管理和调度Hadoop集群资源的系统。它是Hadoop生态系统的一部分&#xff0c;主要用于解决Hadoop中的资源管理问题。 通过使用Yarn架构&#xff0c;Hadoop集群中的不同应用程序可以共享集群资源&#xff0c;并根据需要动态分配和回收资源。这种灵活的资…

强固型工业电脑在称重系统+叉车电脑,称重量体扫码一体机,物流分拣线工作站行业应用

称重系统叉车电脑行业应用 背景介绍 在叉车上安装称重传感器&#xff0c;通过对举升压力的自动检测&#xff0c;将压力信号转换为电流或电压信号&#xff0c;经过A/D转换&#xff0c;使模拟信号变为数字信号&#xff0c;经微处理器进行数据处理后通过蓝牙、串口或者USB接口将称…

java的单元测试和反射

单元测试 就是针对最小的功能单元&#xff0c;编写测试代码对其进行正确性测试 Junit单元测试框架&#xff1a; 可以用来对方法进行测试 有点&#xff1a; 可以灵活的编写测试代码&#xff0c;可以针对某个方法进行测试&#xff0c;也支持一键完成对全部方法的自动发测试&a…

【C++初阶】vector使用特性 vector模拟实现

1.vector的介绍及其使用 1.1 vector的介绍 vector文档介绍 1. vector是表示可变大小数组的序列容器。 2. 就像数组一样&#xff0c;vector也采用的连续存储空间来存储元素。也就是意味着可以采用下标对vector的元素进行访问&#xff0c;和数组一样高效。但是又不像数组&#…

分类神经网络1:VGGNet模型复现

目录 分类网络的常见形式 VGG网络架构 VGG网络部分实现代码 分类网络的常见形式 常见的分类网络通常由特征提取部分和分类部分组成。 特征提取部分实质就是各种神经网络&#xff0c;如VGG、ResNet、DenseNet、MobileNet等。其负责捕获数据的有用信息&#xff0c;一般是通过…

第24天:安全开发-PHP应用文件管理模块显示上传黑白名单类型过滤访问控制

第二十四天 一、PHP文件管理-显示&上传功能实现 如果被抓包抓到数据包&#xff0c;并修改Content-Type内容 则也可以绕过筛查 正常进行上传和下载 二、文件上传-$_FILES&过滤机制实现 无过滤机制 黑名单过滤机制 使用 explode 函数通过点号分割文件名&#xff0c;…

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

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

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

目前面向平面、视觉、时尚等设计领域的高可用 AIGC 方向有以下 4 种&#xff1a; 透明图层生成可控生成图像定制化SVG 生成 本篇&#xff08;下篇&#xff09;介绍 3、4&#xff0c;上篇在&#xff1a;https://blog.csdn.net/weixin_44212848/article/details/138035279?spm…

【FFmpeg】视频与图片互相转换 ( 视频与 JPG 静态图片互相转换 | 视频与 GIF 动态图片互相转换 )

文章目录 一、视频与 JPG 静态图片互相转换1、视频转静态图片2、视频转多张静态图片3、多张静态图片转视频 二、视频与 GIF 动态图片互相转换1、视频转成 GIF 动态图片2、 GIF 动态图片转成视频 一、视频与 JPG 静态图片互相转换 1、视频转静态图片 执行 ffmpeg -i input.mp4 …

初始化Git仓库时应该运行哪个命令?

文章目录 初始化Git仓库时&#xff0c;你应该运行git init这个命令。这个命令的作用是在你当前所在的目录里创建一个新的Git仓库。这样&#xff0c;你就可以在这个目录里开始使用Git来管理你的文件了。 下面我给你举个详细的例子来说明一下&#xff1a; 首先&#xff0c;你需要…

# 从浅入深 学习 SpringCloud 微服务架构(三)注册中心 Eureka(3)

从浅入深 学习 SpringCloud 微服务架构&#xff08;三&#xff09;注册中心 Eureka&#xff08;3&#xff09; 段子手168 1、eureka&#xff1a;高可用的引入 Eureka Server 可以通过运行多个实例并相互注册的方式实现高可用部署&#xff0c; Eureka Server 实例会彼此增量地…

Spark和Hadoop的安装

实验内容和要求 1&#xff0e;安装Hadoop和Spark 进入Linux系统&#xff0c;完成Hadoop伪分布式模式的安装。完成Hadoop的安装以后&#xff0c;再安装Spark&#xff08;Local模式&#xff09;。 2&#xff0e;HDFS常用操作 使用hadoop用户名登录进入Linux系统&#xff0c;启动…

ChatGPT研究论文提示词集合2-【形成假设、设计研究方法】

点击下方▼▼▼▼链接直达AIPaperPass &#xff01; AIPaperPass - AI论文写作指导平台 目录 1.形成假设 2.设计研究方法 3.书籍介绍 AIPaperPass智能论文写作平台 近期小编按照学术论文的流程&#xff0c;精心准备一套学术研究各个流程的提示词集合。总共14个步骤&#…

Llama3新一代 Llama模型

最近&#xff0c;Meta 发布了 Llama3 模型&#xff0c;从发布的数据来看&#xff0c;性能已经超越了 Gemini 1.5 和 Claud 3。 Llama 官网说&#xff0c;他们未来是要支持多语言和多模态的&#xff0c;希望那天赶紧到来。 未来 Llama3还将推出一个 400B大模型&#xff0c;目前…

Linux--链表 第二十五天

1. 链表 t1.next -> data t1.next->next->data .(点号)的优先级比->的大 所以 t1.next->data 就可以了 不用(t1.next)->data 2. 链表的静态增加和动态遍历 打印链表算法&#xff0c; void printLink(struct Test *head) { struct Te…

安装和部署maven

准备工作 maven下载地址&#xff1a;https://maven.apache.org/download.cgi 使用wget将maven包下载到linux环境上&#xff0c;/toos/ 目录下&#xff08;也可用迅雷&#xff09; wget https://dlcdn.apache.org/maven/maven-3/3.9.6/binaries/apache-maven-3.9.6-bin.tar.g…

PaddleOCRV4训练自己的模型(4)------模型推理及导出

一、Det模型推理&#xff1a; &#xff08;1&#xff09;上一篇文章只讲了推理的实现方法&#xff0c;没有展示结果&#xff0c;这里顺带展示一下结果。 因为训练定位模型的时候是整图训练&#xff0c;所以推理的时候也是整图推理。 &#xff08;2&#xff09;在推理的时候可以…

LinkedList和链表

1.ArrayList的缺陷 ArraryList由于底层是一段连续的空间&#xff0c;所以在ArrayList任意位置插入或者删除元素时&#xff0c;就 需要将后续元素往前或者往后搬移&#xff0c;时间复杂度为O(n)&#xff0c;效率比较低&#xff0c;因此ArrayList不适合做任意位置插入和删除比较…

断言(Assertion)在IT技术中的确切含义— 基于四类典型场景的分析

当“断言”&#xff08;Assertion&#xff09;一词成为IT术语时&#xff0c;语义的混沌性和二义性也随之而生。那么&#xff0c;何为断言&#xff1f;断言何为&#xff1f;实际上&#xff0c;只需分析四种典型场景&#xff0c;确切答案和准确描述就将自然显现。 在SAML&#xf…

【讲解下Spring Boot单元测试】

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