树莓派Linux内核编译

这篇具有很好参考价值的文章主要介绍了树莓派Linux内核编译。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

树莓派内核源代码保存在GitHub上github.com/raspberrypi/linux,可以看做是Linux主线内核代码的一个分支。树莓派内核源代码是从Linux主线的长期维护的稳定版本加上树莓派特有的改动形成的。树莓派的内核更新可以通过apt命令自动更新到最新的稳定版本。但是如果你需要使用到最新的非稳定版本或者指定版本或者要对内核进行裁剪或者修改内核代码。那么你就会需要对内核进行编译。

1、下载内核代码

通过访问github找到树莓派内核源代码项目(方法见下载linux内核代码),通过https或者git下载你想要的版本的源代码到本地主机。

2、编译树莓派内核

编译过成可以分成在本机上本地编译和交叉编译,本地编译指的是在目标主机上直接编译,编译完成后就在目标主机上直接运行,交叉编译是指在其它主机上编译,编译完成后再把编译出来的程序安装到目标主机上执行。在树莓派这里,我们可以采用本地编译与可以采用交叉编译,因为树莓派运行速度较慢,所以交叉编译在这里可以显著的提高编译速度。

3、本地编译

3.1、安装编译环境

启动树莓派后,输入如下命令安装编译环境

sudo apt install git bc bison flex libssl-dev make

3.2、下载树莓派内核代码

然后通过https下载Linux内核代码后解决压或者通过git下载代码到/usr/src目录下,如下所示:

xxx@raspberrypi:/usr/src $ ls -l
total 16
drwxr-xr-x 27 root root 4096 Jun  5 13:56 linux-rpi-6.1.y
xxx@raspberrypi:/usr/src $ cd ./linux-rpi-6.1.y/
xxx@raspberrypi:/usr/src/linux-rpi-6.1.y $ ls -l
total 1012
drwxr-xr-x  24 root root   4096 Jun  4 19:39 arch
drwxr-xr-x   3 root root  12288 Jun  5 14:01 block
drwxr-xr-x   2 root root   4096 Jun  5 10:28 certs
-rw-r--r--   1 root root    496 Jun  4 19:39 COPYING
-rw-r--r--   1 root root 101639 Jun  4 19:39 CREDITS
drwxr-xr-x   4 root root  20480 Jun  5 13:25 crypto
drwxr-xr-x  86 root root   4096 Jun  4 19:39 Documentation

3.3、配置内核

开始编译之前我们需要先对内核进行配置,让编译工程知道我们要编译的内核的目标主机架构等信息,编译工程才知道自己应该怎么编译。

  1. 使用默认配置
  • 如果你的设备是Raspberry Pi 1, Zero 或者 Zero W 或者 Raspberry Pi Compute Module 1 ,那么它们只支持32-bit的Linux内核,可以使用如下内核配置命令配置成默认配置。
xxx@raspberrypi:/usr/src $ cd ./linux-rpi-6.1.y/
xxx@raspberrypi:/usr/src $ KERNEL=kernel
xxx@raspberrypi:/usr/src $ sudo make bcmrpi_defconfig
  • 如果你的设备是Raspberry Pi 2, 3, 3+ 或者 Zero 2 W 或者 Raspberry Pi Compute Modules 3, 3+,且使用32-bit的内核,可以使用如下内核配置命令配置成默认配置。
xxx@raspberrypi:/usr/src $ cd ./linux-rpi-6.1.y/
xxx@raspberrypi:/usr/src $ KERNEL=kernel7
xxx@raspberrypi:/usr/src $ sudo make bcm2709_defconfig
  • 如果你的设备是Raspberry Pi 4 或者 400, 或者 Raspberry Pi Compute Module 4 ,且使用32-bit的内核,可以使用如下内核配置命令配置成默认配置。
xxx@raspberrypi:/usr/src $ cd ./linux-rpi-6.1.y/
xxx@raspberrypi:/usr/src $ KERNEL=kernel7l
xxx@raspberrypi:/usr/src $ sudo make bcm2711_defconfig
  • 如果你的设备是Raspberry Pi 3, 3+, 4, 400 或者 Zero 2 W, 或者 Raspberry Pi Compute Modules 3, 3+ 或者 4,那么它们还支持64-bit的内核,可以使用如下内核配置命令配置成默认配置。
xxx@raspberrypi:/usr/src $ cd ./linux-rpi-6.1.y/
xxx@raspberrypi:/usr/src $ KERNEL=kernel8
xxx@raspberrypi:/usr/src $ sudo make bcm2711_defconfig

本文使用的是树莓派zero w,只支持32位内核,所以使用的是第一种配置。

  1. 自定义内核配置
    待更新

  2. 加入内核补丁
    待更新

3.4、定制内核版本号

修改当前目录下的.config文件里的
CONFIG_LOCALVERSION=“my_first_kernel”

xxx@raspberrypi:/usr/src/linux-rpi-6.1.y $ ls -a | grep config
.cocciconfig
.config----------------------------修改这个文件里的LOCAL配置项成你想要的任何字符串
Kconfig

这个可以在你后续运行中通过uname命令查询到你自己编译的Linux内核的版本号,也会让新的内核在/lib/modules目录下产生新的目录文件去放置新内核的模块,而不是直接覆盖。

3.5、编译并安装内核

这一步,我们将编译,安装内核,模块和设备树,因为树莓派性能比较差,所以这一步会花费非常长的时间,尤其是如果你使用的是树莓派的早期硬件版本的话,就更慢了。

32bit内核

make -j4 zImage modules dtbs
sudo make modules_install
sudo cp arch/arm/boot/dts/*.dtb /boot/
sudo cp arch/arm/boot/dts/overlays/*.dtb* /boot/overlays/
sudo cp arch/arm/boot/dts/overlays/README /boot/overlays/
sudo cp arch/arm/boot/zImage /boot/$KERNEL.img

64bit内核

make -j4 Image.gz modules dtbs
sudo make modules_install
sudo cp arch/arm64/boot/dts/broadcom/*.dtb /boot/
sudo cp arch/arm64/boot/dts/overlays/*.dtb* /boot/overlays/
sudo cp arch/arm64/boot/dts/overlays/README /boot/overlays/
sudo cp arch/arm64/boot/Image.gz /boot/$KERNEL.img

编译安装完成后,重启则已经用新编译的内核了。

4、交叉编译

这里以ubuntu为例,介绍如何对树莓派内核进行交叉编译

4.1、安装编译环境

启动树莓派后,输入如下命令安装编译环境

sudo apt install git bc bison flex libssl-dev make libc6-dev libncurses5-dev

根据你编译的目标是32bit内核还是64bit内核选择安装不同的toolchain

  • 32bit
sudo apt install crossbuild-essential-armhf
  • 64bit
sudo apt install crossbuild-essential-arm64

4.2、下载树莓派内核代码

然后通过https下载Linux内核代码后解决压或者通过git下载代码到/usr/src目录下,如下所示:

xxx@ubuntu:/usr/src $ ls -l
total 16
drwxr-xr-x 27 root root 4096 Jun  5 13:56 linux-rpi-6.1.y
xxx@ubuntu:/usr/src $ cd ./linux-rpi-6.1.y/
xxx@ubuntu:/usr/src/linux-rpi-6.1.y $ ls -l
total 1012
drwxr-xr-x  24 root root   4096 Jun  4 19:39 arch
drwxr-xr-x   3 root root  12288 Jun  5 14:01 block
drwxr-xr-x   2 root root   4096 Jun  5 10:28 certs
-rw-r--r--   1 root root    496 Jun  4 19:39 COPYING
-rw-r--r--   1 root root 101639 Jun  4 19:39 CREDITS
drwxr-xr-x   4 root root  20480 Jun  5 13:25 crypto
drwxr-xr-x  86 root root   4096 Jun  4 19:39 Documentation

4.3、配置内核

开始编译之前我们需要先对内核进行配置,让编译工程知道我们要编译的内核的目标主机架构等信息,编译工程才知道自己应该怎么编译。

  • 32-bit

如果你的设备是Raspberry Pi 1, Zero 或者 Zero W 或者 Raspberry Pi Compute Module 1:

cd linux-rpi-6.1.y
KERNEL=kernel
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- bcmrpi_defconfig

如果你的设备是Raspberry Pi 2, 3, 3+ 或者 Zero 2 W 或者 Raspberry Pi Compute Modules 3, 3+:

cd linux-rpi-6.1.y
KERNEL=kernel7
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- bcm2709_defconfig

如果你的设备是Raspberry Pi 4 或者 400, 或者 Raspberry Pi Compute Module 4 :

cd linux-rpi-6.1.y
KERNEL=kernel7l
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- bcm2711_defconfig
  • 64-bit

如果你的设备是Raspberry Pi 3, 3+, 4, 400 或者 Zero 2 W, 或者 Raspberry Pi Compute Modules 3, 3+ 或者 4:

cd linux-rpi-6.1.y
KERNEL=kernel8
make ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- bcm2711_defconfig

本文使用的是树莓派zero w,只支持32位内核,所以使用的是第一种配置。

4.4、定制内核版本号

修改当前目录下的.config文件里的
CONFIG_LOCALVERSION=“-v7-MY_FIRST_KERNEL”

xxx@raspberrypi:/usr/src/linux-rpi-6.1.y $ ls -a | grep config
.cocciconfig
.config----------------------------修改这个文件里的LOCAL配置项成你想要的任何字符串
Kconfig

这个可以在你后续运行中通过uname命令查询到你自己编译的Linux内核的版本号,也会让新的内核在/lib/modules目录下产生新的目录文件去放置新内核的模块,而不是直接覆盖。

4.5、编译内核

这一步,我们将编译,安装内核,模块和设备树,因为是交叉编译,交叉编译用的主要性能相对于树莓派而言都是非常非常高的了,所以这一步会花费的时间会比较短,8核 i7用-j12选项一般来说25分钟就可以编完了。

32bit内核

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

64bit内核

make -j4 ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- Image modules dtbs

4.6、安装内核

完成交叉编译后,需要将编译出来的内核拷贝到树梅莓里并安装内核模块。通过将SD读卡器插入编译主机的方式进行的操作会比较简单。下面就以这个为例进行说明。

将带有SD卡的SD卡读卡器插入主机,输入以下命令(注意,如果你的主机本来就有多个硬盘那么插入的SD卡可能显示的是sdc之类的,注意鉴别一下):


xxx@xx-PC:~$ lsblk -f | grep sdb
sdb
├─sdb1 vfat     FAT32 bootfs CEE7-0DF0
└─sdb2 ext4     1.0   rootfs ebadab55-bd70-46a9-8f18-995c136fb5b2

  1. 挂载这二个分区:
sudo mkdir mnt
sudo mkdir mnt/fat32
sudo mkdir mnt/ext4
sudo mount /dev/sdb1 mnt/fat32
sudo mount /dev/sdb2 mnt/ext4
  1. 安装内核模块到sd卡
  • 32bit系统
sudo env PATH=$PATH make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- INSTALL_MOD_PATH=mnt/ext4 modules_install
  • 64bit系统
sudo env PATH=$PATH make ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- INSTALL_MOD_PATH=mnt/ext4 modules_install
  1. 安装内核与设备树(安装前可以先备份原先的内核):
  • 32bit系统
sudo cp mnt/fat32/$KERNEL.img mnt/fat32/$KERNEL-backup.img
sudo cp arch/arm/boot/zImage mnt/fat32/$KERNEL.img
sudo cp arch/arm/boot/dts/*.dtb mnt/fat32/
sudo cp arch/arm/boot/dts/overlays/*.dtb* mnt/fat32/overlays/
sudo cp arch/arm/boot/dts/overlays/README mnt/fat32/overlays/
sudo umount mnt/fat32
sudo umount mnt/ext4
  • 64bit系统
sudo cp mnt/fat32/$KERNEL.img mnt/fat32/$KERNEL-backup.img
sudo cp arch/arm64/boot/Image mnt/fat32/$KERNEL.img
sudo cp arch/arm64/boot/dts/broadcom/*.dtb mnt/fat32/
sudo cp arch/arm64/boot/dts/overlays/*.dtb* mnt/fat32/overlays/
sudo cp arch/arm64/boot/dts/overlays/README mnt/fat32/overlays/
sudo umount mnt/fat32
sudo umount mnt/ext4

退出SD卡,将SD卡插回树莓派,重启则可。

5、内核更新结果

我们可以看到内核版本已经变成6.1.31my_first_kernel,也已经 更新了内核编译的时间。文章来源地址https://www.toymoban.com/news/detail-472810.html

xxx@raspberrypi:~ $ uname -a
Linux raspberrypi 6.1.31my_first_kernel #1 Mon Jun  5 20:48:53 CST 2023 armv6l GNU/Linux

到了这里,关于树莓派Linux内核编译的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • blender源代码编译运行

    其实在blender官网上已经给出了编译步骤https://wiki.blender.org/wiki/Building_Blender/Windows,由于在源码编译的过程中还遇到了很多问题,特此记录一下。 Visual Studio2019或者2022(至少选择【Desktop Development with C++】),我自己是下载的2022版,这里记录了下载的方法及过程https://blog.csdn.net

    2024年02月02日
    浏览(29)
  • Python反编译exe获取封装源代码

    先把exe和pyinstxtractor放在一起 会得到一个文件夹 安装解析库 一共有两个,还有个struct 用sublime打开两个文件,看到一堆二进制,其中struct是多一行的,把struct的第一行复制到前一个文件中 uncompyle6 C:UserslenovoDesktop20223102412-李凌飞exemerge_ALL_ALL_V1.0.exe_extractedmerge_ALL_ALL_V1.0

    2024年01月19日
    浏览(38)
  • mysql源代码编译安装(可自拟版本)

    centOS7 mysql5.6.40为例 关闭防火墙的条件下 1.yum安装 2.rpm查询一下 3.创建mysql用户,用于授权目录 -s /sbin/nologin 不允许用户进行任何交互操作 -M 不要自动创建用户的 home 目录 mysql 为用户名 查看用户是否已经存在 ​在想要指定目录下载 这里我以/opt/mysql为例 1.下载源码 可以换别

    2024年02月14日
    浏览(28)
  • ffmpeg学习 源代码编译、英伟达硬件加速

    使用cpu进行软编解码时,cpu效率低并且占用高。使用硬件加速,能够明显降低CPU的占用,参看博客 ffmpeg学习(16)AVDevice使用。 这里以使用英伟达gpu进行h264编解码加速为例说明,其他平台类似。 在windows平台直接下载官方的预编译ffmpeg、lib开发包,都已经支持了英伟达显卡硬

    2023年04月09日
    浏览(25)
  • Java源代码是如何编译,加载到内存中的?

    相信许多开发同学看过《深入理解java虚拟机》,也阅读过java虚拟机规范,书籍和文档给人的感觉不够直观,本文从一个简单的例子来看看jvm是如何工作的吧。 本文所有操作均在mac上进行。 示例代码采用最常见的双重检索单例模式: 经过编译后,我们得到class文件,然后用

    2024年02月13日
    浏览(27)
  • X86架构下交叉编译arm64源代码

    glibc在/lib(/lib32 /lib64)目录下的.so文件为libc.so.6 glibc是GNU发布的libc库,即c运行库。glibc是linux系统中最底层的api,几乎其它任何运行库都会依赖于glibc。glibc除了封装linux操作系统所提供的系统服务外,它本身也提供了许多其它一些必要功能服务的实现。由于 glibc 囊括了几乎所有

    2023年04月21日
    浏览(36)
  • 树莓派Linux内核编译

    树莓派内核源代码保存在GitHub上github.com/raspberrypi/linux,可以看做是Linux主线内核代码的一个分支。树莓派内核源代码是从Linux主线的长期维护的稳定版本加上树莓派特有的改动形成的。树莓派的内核更新可以通过apt命令自动更新到最新的稳定版本。但是如果你需要使用到最新

    2024年02月08日
    浏览(27)
  • 银河麒麟V10 SP1 ARM编译QT源代码

    最近因为一些事情需要在银河麒麟ARM系统上[银河麒麟V10 SP1 ARM 2203 linux5.4.96-11]安装QT5.12.4版本,由于QT官方不提供ARM版的安装包,无奈只能自己手动编译源代码。 后续补充:实际上我要装的是Qt5.14.2 而不是 5.12.4,不过同样的环境下Qt5.14.2也编译成功了。 这是一篇个人笔记,对

    2024年02月05日
    浏览(40)
  • 【Java可执行命令】(一)编译工具javac:从源代码到字节码,深入解析Java编译工具 javac ~

    Java 编程语言的可执行命令程序 javac 是 Java Development Kit (JDK) 的一部分,旨在将 Java 源代码编译为可执行的字节码文件。 javac 的设计目的是为了支持 Java 的跨平台特性,使开发人员能够编写一次代码,然后在不同的操作系统上运行。 javac 是 Java 编译器的命令行前端,它将 Ja

    2024年02月16日
    浏览(19)
  • 【Linux】源代码软件包

    人不走空                                                                            目录         🌈个人主页:人不走空       💖系列专栏:算法专题 ⏰诗词歌赋:斯是陋室,惟吾德馨 1. 什么是源代码软件包? 2. 源代码软件包的主要组成部分 3. 源代码软

    2024年01月16日
    浏览(30)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包