admin 管理员组

文章数量: 887019

1、查看树莓派内核版本

uname -r

 2、去github下载5.10版本树莓派linux内核源码

https://github/raspberrypi/linux/tree/rpi-5.10.y_20201122

3、 在ubuntu20里面解压linux内核源码

unzip linux-rpi-5.10.y_20201122.zip

4、如何配置树莓派的linux内核 

第一种方式:

        cp  厂家.config   .config

第二种方式:

        make   menuconfig一项项配置,通常是基于厂家的config来配置

第三种方式:

        完全自己来

5、开始配置

树莓派-内核开发-说明 下载代码 编译 替换内核_树莓派-内核开发-说明 下载代码 编译 替换内核 nicekwell-CSDN博客

    编译之前需要提前安装的工具
sudo apt update  
sudo apt-get install libssl-dev
sudo apt-get install libncurses5-dev libncursesw5-dev
sudo apt-get install zlib1g:i386
sudo apt install build-essential
sudo apt-get install flex
sudo apt-get install bison

6、配置config

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

        6.1、使用源码里自带的config

内核配置:
ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- KERNEL=kernel7 make bcm2709_defconfig
指定ARM架构           指定编译器             树莓派            主要核心命令

        此命令功能是获取bcm2709_defconfig配置到 .config里
我们可以直接用工程里的配置,但这样的话可能会丢失原来使用的树莓派的配置,这里提供一个方法可以获取当前正在使用的树莓派的config。

7、编译

        7.1、编译

ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- KERNEL=kernel7 make -j4 zImage modules dtbs
指定内核        指定编译器                    树莓派          make -j4 使用多少电脑资源进行编译                                                          
                                                            zImage    生成内核镜像
                                                            modules   要生成驱动模块
                                                            dtbs      生成配置文件

编译成功后,在源码目录多了vmlinux ,失败则无此文件 

成功后,目标Image镜像在arch/arm/booot下

        7.2、打包zImage文件

直接用linux源码包里的工具:打包zImage成树莓派可用的 xxx.img

./scripts/mkknlimg arch/arm/boot/zImage ./kernel_new.img
                    zImage路径                生成文件

在本目录生成一个kernel_new.img文件,这个文件就是要放到sd卡中的文件。
注:使用这个   tools/mkimage/imagetool-uncompressd.py 生成的内核最后不行!!

        在这里出现了bug
提示:ash: ./scripts/mkknlimg: No such file or directory
没有打包工具mkknlimg,尝试了很多方法都不行,后来发现打包工具mkknlimg被淘汰了,方法1:我重新下载源码Linux-rpi-4.14.y.zip,unzip解压,在文件夹scripts里找到打包工具mkknlimg,将该打包工具拷贝到linux-rpi-5.4.y/scripts,方法2:下载tool_master工具包(树莓派的交叉编译工具链包)找到imagetool-uncompressed.py

       执行命令 sudo ./tools-master/mkimage/imagetool-uncompressed.py ./linux-rpi-5.10.y_20201122/arch/arm/boot/zImage

sudo ./tools-master/mkimage/imagetool-uncompressed.py ./linux-rpi-5.10.y_20201122/arch/arm/boot/zImage

sudo   xxxx.pi文件路径/xxxx.py   zImage文件路径/zImage

执行正常会在执行这条命令的路径下生成两个文件
            first32k.bin  
            kernel.img    //这个是我们想要内核 

        不出意外,我的继续报错了  ,找不到一些文件

Traceback (most recent call last):
  File "../tools-master/mkimage/imagetool-uncompressed.py", line 35, in <module>
    load_to_mem("boot-uncompressed.txt", 0x00000000)
  File "../tools-master/mkimage/imagetool-uncompressed.py", line 21, in load_to_mem
    f = open(name)
IOError: [Errno 2] No such file or directory: 'boot-uncompressed.txt'

        解决方案:去xxxx.py相同路径下查看有无这个文件,有这个文件,但是编译还是会报错。

然后打开xxxx.py的源代码,将里面这两行代码的路径指定成绝对路径。

        重新执行   sudo ./tools-master/mkimage/imagetool-uncompressed.py ./linux-rpi-5.10.y_20201122/arch/arm/boot/zImage

        将会在执行路径下生成这两个文件       first32k.bin   kernel.img(这是我想要的)

这文件生成来之与 xxxx.py代码里的一句代码,下面将解释这段代码什么意思

        生成文件的代码段
os.system("cat first33k.bin " + kernel_image + " > kernel.img")

        含义
这段代码是Python中使用os.system来执行一个shell命令。这个命令的目的是将两个文件的内容合并,并将结果输出到一个新文件中。具体来说,它做了以下几件事:

1、"cat first32k.bin " + kernel_image + " > kernel.img" 这部分代码是一个字符串拼接操作,它构建了一个shell命令。
    cat first32k.bin:cat是一个常用的Unix/Linux命令,用于显示文件内容。这里它会显示first32k.bin文件的内容。
    kernel_image:这是一个Python变量,它应该包含另一个文件名。这个文件名会被插入到命令中。
    > kernel.img:这部分是shell命令的重定向操作。它会将前面命令的输出(即first32k.bin和kernel_image文件的内容)写入到kernel.img文件中。如果kernel.img文件已经存在,它的内容会被新内容替换;如果文件不存在,它会被创建。

2、os.system(...):这是Python的os模块中的一个函数,用于执行传递给它的字符串作为shell命令。在这个例子中,它执行了上面构建的命令。

    所以,整个代码的作用就是:将first32k.bin和kernel_image两个文件的内容连接起来,并将结果保存到kernel.img文件中。

8、挂载树莓派sd卡

        将树莓派关机,取下SDK卡,插入读卡器,并将读卡器挂载到虚拟机上

使用  dmesg命令  可以查看挂载上来的读卡器信息

         挂载成功

         出现两个分区

把树莓派的sd卡插入ubuntu系统电脑,树莓派的sd卡有两个分区:
一个fat分区,是boot相关的内容,kernel的img文件就放在这个分区里;
一个是ext4分区,也就是系统的根目录分区。

       8.1、 数据拷贝

创建两个文件夹
    mkdir data1 
    mkdir data2

挂载
sudo mount /dev/sdb1 data1
sudo mount /dev/sdb2 data2

         8.2、安装modules   设备驱动文件:hdmi  usb  wifi  io  ...

sudo ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- KERNEL=kernel7 make INSTALL_MOD_PATH=[ext4] modules_install
操作ext4分区,需要root权限。  ext4需要用挂载更目录分区的文件夹代替

sudo ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- KERNEL=kernel7 make INSTALL_MOD_PATH=/home/pg/data2 modules_install

 注:如果没有这步,内核是能开启的,但是会导致系统很多驱动不能用

        8.3、更新 kernel.img 文件

        注:镜像名字是kernel7.img

这里我们需要先备份镜像,防止树莓派刷机失败无法启动

再把编译新生成的拷贝到data1(镜像分区),起名kernel7.img

        8.4、复制其它配置文件

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/

        执行下面命令
cp arch/arm/boot/dts/.*dtb* /home/pg/data1/
cp arch/arm/boot/dts/overlays/.*dtb* /home/pg/data1/overlays/
cp arch/arm/boot/dts/overlays/README /home/pg/data1/overlays/

         最后系统开不起来,这样打包的内核不行。

 9、重来

        从7.2继续bug哪里继续开始 ,我们使用方法一

 重新执行:打包zImage文件

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

          去看8.1

          去看8.2 

          去看8.3备份镜像,备份镜像完之后拷贝 kernel_new.img内核到data1下,命令为kernel7.img

        配置树莓派为串口登录

        1、打开data1目录的"config.txt"文件,将以下内容添加在最后并且保存。

dtoverlay=pi3-miniuart-bt

        2、然后再修改data1目录的"cmdline.txt",将里面的内容全部替换成以下内容,以防万一,请先备份好这个文件的原内容。

console=serial0,115200 root=/dev/mmcblk0p2 rootfstype=ext4 elevator=deadline fsck.repair=yes rootwait

10、最后

        把SD卡查入树莓派,通过串口登录,查看启动过程是否正常。 

启动后使用命名查看内核版本
    uname -r

        内核版本与之前相比变了 

本文标签: 内核 树莓派