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. 结构体(C语言)

    目录 1. 结构体类型的声明 1.1 结构体回顾 1.1.1 结构的声明 1.1.2 结构体变量的创建和初始化 1.2 结构的特殊声明 1.3 结构的自引用 2. 结构体内存对齐 2.1 对齐规则 2 ...

  2. 一份阅读量30万+免费且全面的C#/.NET面试宝典

    前言 C#/.NET/.NET Core相关技术常见面试题汇总,不仅仅为了面试而学习,更多的是查漏补缺.扩充知识面和大家共同学习进步.该知识库主要由自己平时学习实践总结.网上优秀文章资料收集(这一部分 ...

  3. C++多线程应用

    一个进程就是一个程序,一个程序里不止一个功能,每个功能的实现就可以交给一个线程去完成.一个进程就像是一个工程,这个工程里,有设计,有监理,有施工,就相当于三个线程,各干各的又相互配合. https:/ ...

  4. 如何使用ConsulManager来优雅的管理主机监控与站点监控

    概述 ConsulManager是一个使用Flask+Vue开发的Consul WEB管理工具,比官方自带的WEB UI实现了更多的功能. 可以方便的对Consul Services进行增删改查,支持 ...

  5. Python 潮流周刊#75:用 Python 开发 NoSQL 数据库(摘要)

    本周刊由 Python猫 出品,精心筛选国内外的 250+ 信息源,为你挑选最值得分享的文章.教程.开源项目.软件工具.播客和视频.热门话题等内容.愿景:帮助所有读者精进 Python 技术,并增长职 ...

  6. 3.5 Linux命令行下如何识别文件类型?

    对于第一次使用 Linux 命令行的用户,可能真的搞不清楚哪个是文件,哪个是目录,究其原因是很难直接通过名字看出来目录和文件的区别. 虽然从名称上不容易分辨,但是可以从颜色上进行区分.一般情况下,Li ...

  7. Abp源码分析之虚拟文件系统Volo.Abp.VirtualFileSystem

    前言 Volo.Abp.VirtualFileSystem 是ABP(ASP.NET Boilerplate)框架中的一个重要组件,它提供了一种抽象文件系统的方式,使得应用程序可以轻松地访问和管理文件 ...

  8. Linux之JSON处理工具jq

    一个灵活的轻量级命令行JSON处理器 补充说明 jq 是 stedolan 开发的一个轻量级的和灵活的命令行JSON处理器,源码请参考 jq 项目主页 jq 用于处理JSON输入,将给定过滤器应用于其 ...

  9. Golang之学习资源参考

    使用golang开发也有一段时间,在此总结一些自己从0入门到掌握所涉及一些资源,希望可以帮助其他人 [初级] 基础语法练习:  https://gobyexample.com/ [中级] 1.gola ...

  10. Winform多线程持续读取PLC数据

    1.Winform窗体界面 2.后台代码 点击查看代码 using Modbus.Device; using System; using System.Collections.Generic; usi ...