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

在这里插入图片描述

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

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

相关文章

判断完数(C语言)

一、N-S流程图&#xff1b; 二、运行结果&#xff1b; 三、源代码&#xff1b; # define _CRT_SECURE_NO_WARNINGS # include <stdio.h>int main() {//初始化变量值&#xff1b;int n 0;int i 1;int j 0;int result 1;//提示用户&#xff1b;printf("请输入一个…

目标检测网络YOLO进化之旅

yolo系列网络在目标检测领域取得了巨大的成功&#xff0c; 尤其是在工程实践中&#xff0c; 以其出色的性能优势获得了广泛的应用落地。 YOLO的前3个版本是由同一个作者团队出品&#xff0c; 算是官方版本。 之后的版本都是各个研究团队自己改进的版本&#xff0c; 之间并无明…

基础SQL DDL语句

MySQL的DDL&#xff08;Data Definition Language&#xff09;语句用于定义或修改数据库结构。 DDL数据库操作 查看所有的数据库 show databases; 红色圈起来的是系统数据库&#xff0c;是系统自带的 mysql&#xff1a;包含存储MySQL服务器运行时所需信息的表。这包括数据字典…

【Linux】MySQL的安装及配置(Ubuntu-18.04)

一、安装MySQL 分别安装MySQL服务器、MySQL客户端、C/C开发库 sudo apt-get install mysql-server sudo apt-get install mysql-client sudo apt-get install libmysqlclient-dev 二、配置MySQL 1.查看默认配置文件&#xff0c;此处的user和password为默认提供的&#xff0c;…

Ceph 分布式文件系统 搭建及使用

一、Ceph 介绍 在当今数据爆炸式增长的时代&#xff0c;企业对于可靠、可扩展的存储解决方案的需求日益迫切。Ceph 作为一种开源的、可伸缩的分布式存储解决方案&#xff0c;正逐渐成为企业级存储领域的热门选择。Ceph是一种由Radicalbit公司开发的开源分布式存储系统&#xf…

ElasticSearch虚拟机安装(单机版)

1.下载7.10.2 下载链接&#xff0c;选择LINUX X86_64下载 2.创建用户 useradd es也可以使用系统默认用户&#xff08;非root&#xff09;,root用户会报错 3.解压 tar xvf elasticsearch-7.10.2-linux-x86_64.tar.gz假定目录在/home/es/elasticsearch-7.10.2-linux-x86_64 …

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

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

JavaCard学习笔记: CAP Component 之 Class Component

文章目录 整体结构tag和size字段signature_pool_length和signature_pooltype_descriptor结构导入类型编码导入项签名示例导入类导入数组导入远程方法 interfaces[]interface_info结构flagsinteface_countsuperinterfacesinterface_name class_info_compact classes[]结构flagsi…

基于Springboot的网上商城购物系统

基于SpringbootVue的网上商城购物系统的设计与实现 开发语言&#xff1a;Java数据库&#xff1a;MySQL技术&#xff1a;SpringbootMybatis工具&#xff1a;IDEA、Maven、Navicat 系统展示 用户登录 首页 商品信息 商品资讯 后台登录页面 后台管理首页 用户管理 商品分类管…

记录一个hive中跑insert语句说没创建spark客户端的问题

【背景说明】 我目前搭建离线数仓&#xff0c;并将hive的执行引擎改成了Spark&#xff0c;在将ods层的数据装载到dim层&#xff0c;执行insert语句时报如下错误 【报错】 [42000][40000] Error while compiling statement: FAILED: SemanticException Failed to get a spark…

星链全解1

星链基本信息 星链卫星的寿命约为5年&#xff0c;最终目标是发射42000颗卫星。最初&#xff0c;每颗卫星重约260公斤&#xff0c;与1吨以上的大卫星相比属于“小卫星”。现在&#xff0c;向V2版进化的星链卫星重量近800公斤&#xff0c;约为老一代卫星的3倍。 点击“星链地图…

【Entity Framework】聊一聊EF如何使用数据库函数

【Entity Framework】聊一聊EF如何使用数据库函数 文章目录 【Entity Framework】聊一聊EF如何使用数据库函数一、数据库函数的类型二、内置函数与用户定义的函数四、聚合函数、标量函数和表值函数五、Niladic函数六、EF Core 中的数据库函数映射6.1 内置函数映射6.2 EF.Functi…

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

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

ARM与单片机有啥区别?

初学者必知&#xff1a;ARM与单片机到底有啥区别&#xff1f;1、软件方面这应该是最大的区别了。引入了操作系统。为什么引入操作系统&#xff1f;有什么好处嘛&#xff1f; 在开始前我有一些资料&#xff0c;是我根据网友给的问题精心整理了一份「ARM的资料从专业入门到高级教…

【Linux驱动层】iTOP-RK3568学习之路(二):vscode中设置头文件路径-完成代码自动补全

在Ubuntu下用vscode写Linux驱动层的时候&#xff0c;需要添加头文件&#xff1a; #include<linux/module.h> #include<linux/init.h> #include<linux/kernel.h>但vscode没有智能提示&#xff0c;因此需要我们手动添加自己的头文件路径&#xff1a; topeetu…

嵌入式Linux开发实操(十七):Linux Media Infrastructure userspace API

视频和无线电流媒体设备使用的Linux内核到用户空间API,包括摄像机、模拟和数字电视接收卡、AM/FM接收卡、软件定义无线电(SDR)、流捕获和输出设备、编解码器设备和遥控器。典型的媒体设备硬件如下: 媒体基础设施API就是用于控制此类设备的,分五个部分。 第一部分V4L2 API…

AI安全之问:我们的智能助手真的安全吗?

在我们日益依赖人工智能来撰写文档、编写程序代码、甚至创作艺术作品的今天&#xff0c;我们是否曾经想过这些智能系统可能面临的被恶意操纵的风险&#xff1f; 分享几个网站 GPT-3.5研究测试&#xff1a; https://hujiaoai.cn GPT-4研究测试&#xff1a; https://higpt4.cn…

MKS 质量MFC流量控制器原理及应用课件PPT

MKS 质量MFC流量控制器原理及应用课件PPT

Git | Git基本命令

Git | Git基本操作 文章目录 Git | Git基本操作一、创建Git本地仓库1、创建Git仓库2、配置Git3、理解工作区、暂存区、版本库关系 二、添加、修改与查看添加文件查看历史提交记录 修改文件查看.git文件 三、版本回退版本回退撤销修改尚未add已add但还未commit已add并commit 删除…

安信可 ESP_01SWIFI模块的使用 (电脑通过usb转tll模块连接wifi模块进行调试)

一&#xff1a;需要用到的模块 &#xff08;1&#xff09;安信可的ESP_01wifi模块 ESP-01是深圳安信可科技基于ESP8266芯片开发的串口wifi模块&#xff0c;模组集成了透传功能&#xff0c;即买即用&#xff0c;支持串口指令集&#xff0c;用户通过串口即可实现网络访问…