1、建议边看视频边跟着教程走

https://www.bilibili.com/video/av91990721?zw

2、准备工作

下载官方提供的交叉编译工具链
git clone https://github.com/raspberrypi/tools 使用vim工具编辑系统环境变量工具,将交叉编译工具链添加到系统的环境变量,vim工具教程请到菜鸟教程官网学习。
sudo vim /etc/bash.bashrc 请按照以下格式添加到最后一行,编译器路径仅供参考,请根据自己的路径来添加,编译32位系统请使用arm-linux-gnueabihf编译器。
export PATH=$PATH:/home/pi/toolchain/toolsraspi/arm-bcm2708/arm-linux-gnueabihf/bin/ 更新环境变量,使之立刻生效。
source /etc/bash.bashrc 测试交叉编译器,添加成功后输入以下命令将会出现gcc的版本信息。交叉编译器的名称和你实际添加的编译器名称对应。
arm-linux-gnueabihf-gcc -v 安装编译的必备软件。
sudo apt update
sudo apt install bc make bison flex libncurses-dev ctags python-sphinx -y

3、编译内核

进入内核源码顶层目录,具体路径看实际情况
cd linux 查看帮助,本步骤可忽略
make help 清理工程,清理编译生成的二进制文件以及各种配置文件,防止出错
make distclean 生成32位.config 板级配置,不同树莓派板子设定值不同
树莓派1, Pi Zero, Pi Zero W使用以下命令
KERNEL=kernel
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- bcmrpi_defconfig 树莓派2, Pi 3, Pi 3+,CM3使用以下命令
KERNEL=kernel7
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- bcm2709_defconfig 树莓派4使用以下命令
KERNEL=kernel7l
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- bcm2711_defconfig 编译32位内核、内核模块、设备树,生成内核压缩镜像
make ARmake ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- zImage modules dtbs 多线程编译可以在make 传参中加入 -j8,数字代表编译程序将使用多少个线程,这里建议设置为cpu逻辑处理器的1.5倍,如我使用的amd 处理器为6核心12线程,那么可以使用-j18。 在内核顶层目录下创建一个文件夹
mkdir modules_install 拷贝编译生成的内核模块到modules_install文件夹
make modules_install ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf-INSTALL_MOD_PATH=./modules_install 拷贝编译生成的设备树文件到modules_install文件夹
make dtbs_install ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- INSTALL_DTBS_PATH=./modules_install 使用工程自带的脚本将编译出来的压缩镜像转换成可树莓派启动的镜像文件
./scripts/mkknlimg ./arch/arm/boot/zImage ./kernel.img 将编译生成的文件拷贝到SD卡
树莓派的sd卡存在两个分区,可以通过 lsblk 查看
sdb
|-sdb1 (第一个一般是rootfs分区)
|-sdb2 (第二个一般是boot分区) 这里提示以下,如何找到U盘在Linux下的路径。一般ubuntu会将U盘自动挂载到
/media/usrname/ 下面,以下所有命令的路径都仅供参考,具体路径请按照自己实际情况来。 备份boot分区中的文件
mv /media/pi/boot/kernel.img /media/pi/boot/kernel.img.bak
mv /media/pi/boot/overlays /media/pi/boot/overlays.bak 拷贝编译生成的文件到SD卡
cp ./kernel.img /media/pi/boot/
cp -r ./modules_install/overlays /media/pi/boot/
cp ./modules_install/*.dtb /media/pi/boot/
sudo cp -r ./modules_install/lib /media/pi/rootfs/ 关于uboot启动阶段: 阶段1:汇编阶段
1> 构建异常向量表
2> 切换到svc模式,禁止看门狗
3> 关闭MMU和icache
4> 清除bss段,完成uboot代码到内存的自搬移
5> 初始化栈
阶段2:C语言阶段
1> 完成对gd(global data)结构体的初始化
2> 完成大部分硬件的初始化(串口\网卡\flash\电源\使能中断)
3> 根据用户命令或者预设命令,切换进入自启动模式或交互模式
4> 执行bootcmd中的命令参数
5> 将bootargs中的参数传递给内核 内核源码顶层目录简介:
--------------------------------------------------------------------------------
| arch |架构和设备树 | block | 块 |
| certs |证书 | crypto | 加解密子系统 |
| Documentation |文档 | drivers | 驱动 |
| firmware |固件 | fs | 文件系统 |
| include |头文件 | init | 初始化 |
| ipc |进程 | kernel | 内核 |
| lib |库 | LICENSES | 许可证 |
| mm |内存 |
| net |网络 | samples | 案例 |
| scripts |脚本 | security | 安全 |
| sound |声卡 | tools | 工具 |
| usr |用户 | virt | 虚拟机 |
-------------------------------------------------------------------------------- 遇到错误:
scripts/extract-cert.c:21:25: fatal error: openssl/bio.h: No such file or directory
原因:主机没有安装libssl-dev,安装即可$sudo apt-get install libssl-dev

树莓派Zero W成功运行编译好的内核并查看版本

参考文档:
1、Ubuntu 16.04 (x64)下从源代码为Raspberry Pi Zero W编译实时内核
2、Kernel building

由于服务器带宽和流量有限,交叉编译器和内核源码采用百度网盘分享。
链接: https://pan.baidu.com/s/1wFUDr5xIDtolbsVTex-B3w 提取码: nrua

编译树莓派Linux内核的更多相关文章

  1. linux内核系列(一)编译安装Linux内核 2.6.18

    1.配置环境 操作系统:CentOS 5.2 下载linux-2.6.18版本的内核,网址:http://www.kernel.org 说明:该编译文档适合2.6.18以上的Linux内核版本,只需所 ...

  2. 【转】6.4.6 将驱动编译进Linux内核进行测试

    原文网址:http://www.apkbus.com/android-98520-1-1.html 前面几节都是将Linux驱动编译成模块,然后动态装载进行测试.动态装载驱动模块不会随着Android ...

  3. 将MPLS编译进linux内核中

    系统环境:linux kernel 2.6.35.(此环境是上一篇文章中将ubuntu内核替换后的环境) 编译过程如下: 1)首先需要下载patch文件:linux-kernel-v2.6.35-mp ...

  4. 编译安装linux内核步骤

    编译安装linux内核步骤: 一.获取内核源码 源码网址:www.kernel.org 二.解压内核源码 首先以root帐号登录,然后进入/usr/src子目录.如果用户在安装Linux时,安装了内核 ...

  5. 将驱动编译进Linux内核

    *:first-child { margin-top: 0 !important; } body>*:last-child { margin-bottom: 0 !important; } /* ...

  6. 如何编译安装Linux内核

    操作系统环境 VMware workstation15 Pro ubuntu18.04 LTS 待编译内核5.3.10版本 内核下载地址 kernel.org 环境配置 在正式编译前需要安装部分软件. ...

  7. 编译aarch64 Linux内核并基于qemu运行

    核心流程 首先,本文主要讲述如何编译Linux内核并在qemu虚拟机上运行.这里针对的架构是aarch64. 本文的实验平台是Ubuntu 16.04. 为了达成目标,我们需要有qemu.buildr ...

  8. 编译x86_64 Linux内核并基于QEMU运行

    编译并运行内核镜像 安装包准备 $ sudo apt install git $ sudo apt install build-essential kernel-package fakeroot li ...

  9. 编译最新linux内核(version 4.4.2)

    环境:centos6.4 内核版本为2.6.32 目标:编译4.4.2内核,升级到 4.4.2 准备工作: 安装开发库和ncurses库 # yum groupinstall "Develo ...

  10. Linux课程实践二:编译模块实现内核数据操控

    一.内核模块原理 1. Linux内核增加功能 Linux内核整体结构很庞大,包含了很多的组件,现在有两种方法将需要的功能包含进内核当中: - 静态加载:将所有的功能都编译进Linux内核. - 动态 ...

随机推荐

  1. 轻量级网络-RepVGG 论文解读

    背景知识 VGG 和 ResNet 回顾 MAC 计算 卷积运算与矩阵乘积 点积 ACNet 理解 ACBlock 的 Pytorch 代码实现 摘要 RepVGG 模型定义 RepVGG Block ...

  2. 一文彻底弄懂JUC工具包的Semaphore

    Semaphore 是 Java 并发包 (java.util.concurrent) 中的重要工具,主要用于控制多线程对共享资源的并发访问量.它可以设置"许可证"(permit) ...

  3. 开源 - Ideal库 -获取特殊时间扩展方法(四)

    书接上回,我们继续来分享一些关于特殊时间获取的常用扩展方法. 01.获取当前日期所在月的第一个指定星期几 该方法和前面介绍的获取当前日期所在周的第一天(周一)核心思想是一样的,只是把求周一改成求周几而 ...

  4. .NET 创建动态方法方案及 Natasha V9

    前言 本篇文章前面客观评估了 .NET 创建动态方方案多个方面的优劣,后半部分是 Natasha V9 的新版特性. .NET 中创建动态方法的方案 创建动态方法的不同选择 以下陈列了几种创建动态方法 ...

  5. Docker私有仓库操作----命令行

    查看所有镜像 http://10.206.29.162:5000/v2/_catalog {"repositories":["dashboard"," ...

  6. 使用YARP来实现负载均衡

    YARP ("Yet Another Reverse Proxy") 是一个库,可帮助创建高性能.生产就绪且高度可自定义的反向代理服务器. YARP 是使用 ASP.NET 和 . ...

  7. Java虚拟机深入研究

    文章来自:http://www.qqread.com/java/w872354600.html Java技术与Java虚拟机  说起Java,人们首先想到的是Java编程语言,然而事实上,Java是一 ...

  8. 解密Facebook产品的开发流程

    作者: 王淮  来源: <程序员>  发布时间: 2013-03-25 17:22  阅读: 3750 次  推荐: 6   原文链接   [收藏]   [编者注]王淮是Facebook第 ...

  9. PythonDay1Base

    PythonDay1Base 变量 即python运行过程中可以发生改变的量,如同数学中的未知数X,将一个确定的量赋值给变量. 变量定义原则 由英文大小写,数字以及下划线_组成 不能以数字开头 不能以 ...

  10. [Cnblogs.Architecture][v20.5.1] 使用 AddLongToJsonConverter() 将 long 序列化为 string

    场景 浏览器的 JSON 反序列化无法完整将 long 类型转换为 number,最后一位会被四舍五入. 因此需要将 long 类型转为 string 发送到前端. 适用版本 v20.5.1 使用方法 ...