首页 > 其他分享 >树莓派-内核开发-说明 下载代码 编译 替换内核

树莓派-内核开发-说明 下载代码 编译 替换内核

时间:2023-08-29 21:33:59浏览次数:43  
标签:KERNEL 树莓 编译 内核 linux config arm

  

树莓派运行linux系统,内核代码开源,我们可以自己修改内核代码、编写驱动。

本文介绍如何获取linux内核代码,并完成编译、内核替换。

一、概述

树莓派的github主页:https://github.com/raspberrypi,里面包含了linux源码、交叉编译工具链等内容。

对于我们要用到的有两个仓库:

https://github.com/raspberrypi/linux 内核源码

https://github.com/raspberrypi/tools 交叉编译工具链(仅在交叉编译时用到)

注:
1、树莓派里安装的系统镜像版本要和kernel代码对应。因为树莓派系统是在不断开发和升级的,如果你的树莓派使用的是某个时间的系统镜像,那么最好也使用当时的kernel代码。
2、关于内核编译方法,官网有很详细的介绍:https://www.raspberrypi.org/documentation/linux/kernel/building.md,这里算是翻译和补充。
3、以下编译过程在树莓派1和树莓派3B上测试ok。

二、ubuntu里交叉编译

1、获取交叉编译工具和源码

源码:git clone [email protected]:raspberrypi/linux

交叉编译工具:git clone [email protected]:raspberrypi/tools

2、配置编译环境变量

2.1 手动配置环境变量

编译工具下载后,在64位ubuntu上编译我们需要的编译工具bin文件在:tools/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian-x64/bin 目录下,将此目录添加到环境变量PATH中,添加方法:

PATH=$PATH:/home/nicek/githubProjects/raspberrypi/tools/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian-x64/bin

如果是在32位系统中编译则要选择32位的交叉编译工具。

配置完成之后可以用编译工具命令查看到版本号:
arm-linux-gnueabihf-gcc -v

之后,所有的make命令都要指明一些环境变量:
ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- KERNEL=kernel7

ARCH=arm 指明当前要编译arm,虽然树莓派是64位的,这里仍然选择arm,而不是arm64。
CROSS_COMPILE 指明交叉工具链名称。
KERNEL 指明kernel类型,树莓派1设置为kernel,树莓派2、3设置为kernel7。

每次make都需要指明这些环境变量,如:
ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- KERNEL=kernel7 make menuconfig
ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- KERNEL=kernel7 make -j4 zImage

2.2 自动配置环境变量

上面这些环境变量每次命令都要写很麻烦,可以通过export一次设置:
export PATH=$PATH:/home/nicek/githubProjects/raspberrypi/tools/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian-x64/bin ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- KERNEL=kernel7
之后在本终端里执行的所有命令都带有这些环境变量信息。

此 export 命令可以写成一个脚本,然后在编译前在终端里source一下这个脚本即可设置好所有的环境变量。就像android编译前也要先source一下envsetup.sh一样。

1
2
3
4
#!/bin/bash
DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
export PATH="$PATH:$DIR/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian-x64/bin/"
export ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- KERNEL=kernel7

上述命令中的路径可能和你实际不同,注意修改。

export环境变量后,在本终端里的后续命令都可以不用再指明这些环境变量,如:
配置之前的命令:ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- KERNEL=kernel7 make menuconfig
配置之后的命令:make menuconfig

3、配置config

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

3.1 使用源码里自带的config

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

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

3.2 获取当前树莓派的config

已经开机的树莓派上会有这个节点:/proc/config.gz,从这个节点可以获取本树莓派的config。
如果没有这个节点的话则需要先加载模块:sudo modprobe configs

把 config.gz 内容复制到要编译的电脑上:
scp pi@[ip]:/proc/config.gz .

解压,保存为.confg文件。
zcat config.gz > .config
注:必须在linux环境下解压,在mac下会乱码。

把此config文件复制到linux源码的根目录。

4、编译

安装必要的库:
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

1、执行menuconfig
ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- KERNEL=kernel7 make menuconfig
如果没什么改的就不用执行这一步。

2、编译
ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- KERNEL=kernel7 make -j4 zImage modules dtbs 2>&1 | tee build.log
以n进程编译。不指明几进程的话则默认以单进程编译。

3、打包zImage文件
直接用linux源码包里的工具:
./scripts/mkknlimg arch/arm/boot/zImage ./kernel_new.img
在本目录生成一个kernel_new.img文件,这个文件就是要放到sd卡中的文件。
注:网上很多地方说的用 tools/mkimage/imagetool-uncompressd.py 的方法不行!!

5、挂载树莓派sd卡,并安装编译出的DIRECTLY 到sd卡

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

我们生成的文件涉及到这两个分区的内容,一般插入ubuntu后会自动挂载,fat分区可以不用root权限操作,ext4分区需要root权限操作。
两个分区具体挂载在什么地方可以自己决定,以下用[fat]表示boot挂载的路径,[ext4]表示ext4挂载的路径。

1、安装modules
sudo ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- KERNEL=kernel7 make INSTALL_MOD_PATH=[ext4] modules_install
操作ext4分区,需要root权限。

2、更新 kernel.img 文件
前面已经用 mkknlimg 工具打包了kernel_new.img文件了,把它复制到boot分区并配置使用即可:
cp kernel_new.img [fat]/
编辑 [fat]/config.txt 文件,在最后加入一行:
kernel=kernel_new.img

3、复制其他相关文件
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/

更新完成后插回树莓派即可开机,开机后可以用 uname -a 命令查看kernel信息已经改变。

三、树莓派本地编译

树莓派上本地编译和上面交叉编译原理基本相同,由于是本地编译,在编译工具和环境变量配置方面还简单一些。
树莓派上编一次内核花了将近2小时。

1、获取源码

git clone [email protected]:raspberrypi/linux

2、配置编译环境

在ubuntu里交叉编译时需要配置的环境变量有:

  • PATH: 添加交叉工具链的目录
  • ARCH: 配置成arm
  • CROSS_COMPILE: 配置成ubuntu上使用的交叉工具链arm-linux-gnueabihf- KERNEL=kernel7
  • KERNEL: 配置成kernel7

而在树莓派本地编译:
关于交叉工具链,本身的编译工具就可以编译给自己使用,所以不用配置;
只需要配置 KERNEL=kernel7 即可。

和上面相同,可以用 export KERNEL=kernel7,一次设置之后此终端里所有命令都带有此环境变量。
也可以更进一步写成脚本,不过这里这一行命令很简单,不写脚本也可以。

3、配置config

和上面一样,
树莓派1使用的是 bcmrpi_defconfig,
树莓派2、3使用的是 bcm2709_defconfig。
例:KERNEL=kernel7 make bcm2709_defconfig

如果要使用树莓派自带的config的话:
sudo modprobe configs # 加载模块
zcat config.gz > .config # 获取配置

4、编译

安装必要的库:
sudo apt-get install bc
sudo apt-get install libncurses5-dev libncursesw5-dev
sudo apt-get install zlib1g
sudo apt-get install libc6

1、执行menuconfig
KERNEL=kernel7 make menuconfig
没什么要改的话就不用执行这一步。

2、编译
KERNEL=kernel7 make -j4 zImage modules dtbs 2>&1 | tee build.log
以n进程编译。不指明几进程的话则默认以单进程编译。

3、打包zImage文件
直接用linux源码包里的工具:
./scripts/mkknlimg arch/arm/boot/zImage ./kernel_new.img
在本目录生成一个kernel_new.img文件,这个文件就是要放到sd卡中的文件。

5、更新系统

1、安装模块
sudo make modules_install

2、复制dtb文件
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/

3、更新kernel.img文件
sudo cp arch/arm/boot/zImage /boot/$KERNEL.img

标签:KERNEL,树莓,编译,内核,linux,config,arm
From: https://www.cnblogs.com/keep--fighting/p/17665900.html

相关文章

  • 使用clion阅读任意交叉编译软件的代码
    clion是linux下比较强大的C/C++IDE,通过扩展也可以支持很多其他语言,例如shell,lua,perl,python,rust。唯一缺点是收费,但是相对它给我带来的便利,这点费用不算什么。我一般用来开发C/C++/项目,它支持3种方式解析工程源码,分别是MakefileCMake编译数据库像代码的高亮,跳转,补全,都......
  • zImage的位置对于ARM32内核解压的影响
      ARM32内核解压流程简单总结了解压流程,这里给出zImage加载位置和Image解压位置的不同组合下,zImage,Image和可能存在的重定位zImage在内存上的位置分布。  因为解压过程中的判断是根据zImage和解压后Image的相对位置来进行不同处理,在以下的分析中,可以认为Image位置是固定的,但......
  • 技术分享 | RCU :内核小“马达”,让你的产品弯道超车
    在上一篇文章《编程界也内卷?浅析“斜杠青年”RCU 》中,鼎道智联带着大家一起认识了并行编程,了解了什么是RCU,相信大家已经对RCU的特点和如何实现Reader无锁有了一定的了解。今天就带着大家继续从RCU的实现入手,一起看看在实际操作中,并行编程是如何实现的!RCU的实现原理可以概......
  • ch2_ab1 Linux内核模块
    准备事项:虚拟机系统文件传输工具VMwareCentOSWinscpVitualBoxUbuntuXftp有222种选择,我是Virtualbox+Ubuntu+Winscp下载osc前言中的Linux系统osc10e.ova安装VirtualBox导入osc10e.ovaSilberschatz,Galvin,Gagne:OperatingSystemC......
  • Detours编译
    CMD进入Detours-master目录下nmake会报错 使用VS的本机工具命令提示符进入Detours-master目录下nmake  ......
  • 编译qt mqtt模块
    0. 环境 win10,qt6.3.11.下载源代码  mqtt:  https://github.com/qt/qtmqtt, 找到对应的tag,比如:6.3.1, 然后下载.zip文件。  perl:   https://strawberryperl.com, 选64位下载。2.安装perl,安装完,在环境变量里加上perl的bin目录。如果不加,有可能qt......
  • 编译wasm Web应用
    刚学完WebAssembly的入门课,卖弄一点入门知识。首先我们知道wasm是目标语言,是一种新的V-ISA标准,所以编写wasm应用,正常来说不会直接使用WAT可读文本格式,更不会用wasm字节码;而是使用其他高级语言编写源代码,经过编译后得到wasm应用。课程中使用了C++来编写源代码,所以这里我也用C++来......
  • JAVA编译准备
    1.JAVA语言特点1.Java语言是面向对象的(oop)2.Java语言是健壮的。Java的强类型机制、异常处理、垃圾的自动收集等是Java程序健壮性的重要保证3.Java语言是跨平台性的。[一个编译好的.class文件可以在多个系统下运行]4.Java语言是解释型语言解释型语言:java、javascript、P......
  • 我的Linux网络之行2-初探内核网络
    前言在上一文中,初步了解了一些协议与相关的一些知识,至少已经有了一些概念,OK,那么下面就是我们对于开发的深入了。Linux以太网驱动架构OSI模型中将网络划分为七层,从下到上依次为:物理层(Physical)、数据链路层(DateLink)、网络层(Network)、传输层(Transport)、会话层(Session)、表示层(Pre......
  • python3.8以及更高版本 编译pcl
    github https://github.com/strawlab/python-pcl1.安装Cython当前的Cython的版本如下 由于python-pcl代码仓已经是很老的代码了,没有人在维护,高版本的Cython会导致编译失败报错如下Cython.Compiler.Errors.CompileError:pcl/_pcl_180.pyx 使用Cython==0.29版本即可解决......