编译树莓派Linux内核
1、建议边看视频边跟着教程走
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内核的更多相关文章
- linux内核系列(一)编译安装Linux内核 2.6.18
1.配置环境 操作系统:CentOS 5.2 下载linux-2.6.18版本的内核,网址:http://www.kernel.org 说明:该编译文档适合2.6.18以上的Linux内核版本,只需所 ...
- 【转】6.4.6 将驱动编译进Linux内核进行测试
原文网址:http://www.apkbus.com/android-98520-1-1.html 前面几节都是将Linux驱动编译成模块,然后动态装载进行测试.动态装载驱动模块不会随着Android ...
- 将MPLS编译进linux内核中
系统环境:linux kernel 2.6.35.(此环境是上一篇文章中将ubuntu内核替换后的环境) 编译过程如下: 1)首先需要下载patch文件:linux-kernel-v2.6.35-mp ...
- 编译安装linux内核步骤
编译安装linux内核步骤: 一.获取内核源码 源码网址:www.kernel.org 二.解压内核源码 首先以root帐号登录,然后进入/usr/src子目录.如果用户在安装Linux时,安装了内核 ...
- 将驱动编译进Linux内核
*:first-child { margin-top: 0 !important; } body>*:last-child { margin-bottom: 0 !important; } /* ...
- 如何编译安装Linux内核
操作系统环境 VMware workstation15 Pro ubuntu18.04 LTS 待编译内核5.3.10版本 内核下载地址 kernel.org 环境配置 在正式编译前需要安装部分软件. ...
- 编译aarch64 Linux内核并基于qemu运行
核心流程 首先,本文主要讲述如何编译Linux内核并在qemu虚拟机上运行.这里针对的架构是aarch64. 本文的实验平台是Ubuntu 16.04. 为了达成目标,我们需要有qemu.buildr ...
- 编译x86_64 Linux内核并基于QEMU运行
编译并运行内核镜像 安装包准备 $ sudo apt install git $ sudo apt install build-essential kernel-package fakeroot li ...
- 编译最新linux内核(version 4.4.2)
环境:centos6.4 内核版本为2.6.32 目标:编译4.4.2内核,升级到 4.4.2 准备工作: 安装开发库和ncurses库 # yum groupinstall "Develo ...
- Linux课程实践二:编译模块实现内核数据操控
一.内核模块原理 1. Linux内核增加功能 Linux内核整体结构很庞大,包含了很多的组件,现在有两种方法将需要的功能包含进内核当中: - 静态加载:将所有的功能都编译进Linux内核. - 动态 ...
随机推荐
- 买了个mini主机当服务器
虽然有苹果的电脑,但是在装一些软件的时候,从想着能不能有一个小型的服务器,免得各种设置什么帮我强各种别的导致Mac出现各种的异常,整体上的话去看了一些小的主机,看过苹果的MV迷你Mac,但是发现是太贵 ...
- 五分钟掌握Python中配置文件解析器configparser的使用
--- 好的方法很多,我们先掌握一种 --- [背景] 这里描述的配置文件为自动化用例中使用到的信息,非pytest自动化框架中例如pytest.ini, conftest.py等具有特殊意义的配 ...
- 鲜花:bitset求解高维偏序
书接上回 一维偏序直接做.二维偏序套线段树或归并排序.三维偏序可以树套树或者 CDQ 套树,那四维偏序呢?可以 CDQ 套树套树.那五维偏序呢?可以发现,无论是 CDQ 分治还是树,都很难再继续嵌套, ...
- 基于pikachu靶场的水平越权详解
1. pikachu靶场搭建 如果你在之前已经使用过phpstudy了,参考pikachu 靶场环境搭建 如果在靶场搭建中遇到一些问题,参考皮卡丘靶场搭建遇到的问题大全 2. 水平越权简介 水平越权是 ...
- 2024-11-13:求出所有子序列的能量和。用go语言,给定一个整数数组nums和一个正整数k, 定义一个子序列的能量为子序列中任意两个元素之间的差值绝对值的最小值。 找出nums中长度为k的所有子
2024-11-13:求出所有子序列的能量和.用go语言,给定一个整数数组nums和一个正整数k, 定义一个子序列的能量为子序列中任意两个元素之间的差值绝对值的最小值. 找出nums中长度为k的所有子 ...
- 《刚刚问世》系列初窥篇-Java+Playwright自动化测试-4-启动浏览器-基于Maven(详细教程)
1.简介 上一篇文章,宏哥已经在搭建的java项目环境中添加jar包实践了如何启动浏览器,今天就在基于maven项目的环境中给小伙伴们或者童鞋们演示一下如何启动浏览器. 2.eclipse中新建mav ...
- .NET周刊【11月第3期 2024-11-17】
国内文章 .NET 9使用Scalar替代Swagger https://www.cnblogs.com/netry/p/18543378/scalar-an-alternative-to-swagg ...
- Linux管道命令
Linux中常用文件字符串分析的命令 在linux中文件管理与系统管理的方面,经常会用到要从一个文件中或者一长串字符串中提取你所需要的数据,或者某些字段来进行查看或者分析,作为一个初级linux小菜鸟 ...
- 安装cnpm时报错
报错:npm WARN deprecated socks@1.1.10: If using 2.x branch, please upgrade to at least 2.1.6 to avoid ...
- nginx配置之Gzip压缩
Nginx开启Gzip压缩功能, 可以使网站的css.js .xml.html 文件在传输时进行压缩,提高访问速度, 进而优化Nginx性能! Web网站上的图片,视频等其它多媒体文件以及大文件,因 ...