当前位置: 首页 > article >正文

正点原子IMX6ULL史诗级新内核移植教程(2)—— 编译内核(新瓶子装旧酒)

正点原子IMX6ULL史诗级新内核移植教程2—— 编译内核新瓶子装旧酒前言为什么这篇文章这么长说实话编译 Linux 内核这件事本身并不复杂——不就是make一下吗但问题在于你第一次编译的时候会报一堆莫名其妙的错误flex: command not found、bc: command not found、error: openssl/bio.h: No such file or directory…这些报错背后的原因是内核编译需要大量的宿主机工具和库。你把源码下载下来直接编译大概率会失败。这篇文章的目标是帮你把环境一次性搭好后续编译时不会再因为缺少依赖而卡住。我们参考了项目里scripts/build_helper/build-mainline-linux.sh的依赖检查逻辑把所有需要的依赖都列出来了。跟着做一遍你就能得到一个可以正常编译主线内核的环境。环境说明开始之前先明确一下我们的目标环境项目说明宿主机Ubuntu 22.04 LTS 或 Debian 12WSL2 也可以目标架构ARMv7 (i.MX6ULL)交叉编译工具链arm-none-linux-gnueabihf-内核版本Linux 7.0-rc4如果你用的是其他发行版包名可能略有不同但依赖本质是一样的。第一步——安装宿主机依赖内核编译需要的依赖可以分为几类基础编译工具、库文件、特定工具。我们一个个来装。基础编译工具这些是编译任何 C 项目都需要的东西sudoaptupdatesudoaptinstallbuild-essentialmakebuild-essential是一个元包会安装 gcc、g、make 等基础工具。如果你已经做过嵌入式开发大概率已经有了。内核特定工具内核编译需要一些特定的工具它们的作用可能不明显但缺一不可sudoaptinstallbcbison flex device-tree-compiler让我解释一下每个工具是干什么的bc任意精度计算器内核配置时会用它计算一些数值比如内存大小bison语法分析器生成器内核的 Kconfig 配置系统需要它flex词法分析器生成器同样用于 Kconfig 系统device-tree-compiler (dtc)设备树编译器把.dts文件编译成.dtb二进制格式如果少了这些编译会在不同阶段报错。错误信息可能不那么直观比如bc: command not found会在配置阶段报错而不是编译阶段。SSL 和加密库内核的模块签名和某些加密功能需要 OpenSSLsudoaptinstalllibssl-dev如果你编译时遇到error: openssl/bio.h: No such file or directory就是缺少这个包。Ncurses 库make menuconfig这个图形化配置工具依赖 ncursessudoaptinstalllibncurses-dev如果你不需要用 menuconfig只准备用现成的 defconfig这个包可以不装。但我强烈建议装上因为调试配置问题时 menuconfig 非常有用。其他可能需要的库某些内核功能可能需要额外的库建议一并装上sudoaptinstalllibgnutls28-dev zlib1g-devlibgnutls28-dev某些内核模块的签名需要zlib1g-dev压缩相关功能需要Python 环境某些内核编译步骤如设备树验证需要 Pythonsudoaptinstallpython3Ubuntu 22.04 默认就有 Python 3但如果是老版本系统可能需要手动安装。第二步——安装交叉编译工具链有了宿主机工具接下来是交叉编译工具链。i.MX6ULL 是 ARMv7 架构你的 x86 电脑不能直接编译出能在板子上跑的程序需要交叉编译。工具链选择有好几种选择gcc-arm-linux-gnueabihfUbuntu 官方仓库版本方便但可能版本较老arm-none-linux-gnueabihfARM 官方工具链版本新需要手动下载Linaro 工具链Linaro 组织维护的 ARM 工具链这个项目用的是arm-none-linux-gnueabihf你可以从 ARM 官网下载。为了方便起见这里用 Ubuntu 仓库版本演示sudoaptinstallgcc-arm-linux-gnueabihf验证工具链安装完成后验证一下是否正常arm-linux-gnueabihf-gcc--version你应该看到类似这样的输出arm-linux-gnueabihf-gcc (Ubuntu 11.4.0-1ubuntu1~22.04) 11.4.0 Copyright (C) 2021 Free Software Foundation, Inc.如果输出版本号说明安装成功。如果提示command not found检查一下是不是 PATH 环境变量的问题如果是从 ARM 官网下载的手动解压版本需要把 bin 目录加到 PATH 里。第三步——验证依赖完整性项目里的构建脚本scripts/build_helper/build-mainline-linux.sh有一个check_host_dependencies()函数它会检查所有依赖是否齐全。我们可以手动运行类似的检查# 检查基础命令forcmdingccmakebcbison flex dtc python3;doifcommand-v$cmd/dev/null;thenecho✓$cmdelseecho✗$cmd(not found)fidone# 检查库文件forheaderinopenssl/openssl.hncursesw/ncurses.h;doif[-f/usr/include/$header]||[-f/usr/include/x86_64-linux-gnu/$header];thenecho✓$(dirname$header)elseecho✗$(dirname$header)(not found)fidone如果所有检查都显示 ✓恭喜你环境已经配好了。如果有 ✗根据缺失项安装对应的包。第四步——测试编译可选如果你想确认环境真的没问题可以先编译一个简单的 ARM 程序测试一下# 创建一个测试程序echo#include stdio.h int main() { printf(Hello from ARM!\n); return 0; }hello.c# 交叉编译arm-linux-gnueabihf-gcc hello.c-ohello_arm# 检查文件类型filehello_arm你应该看到类似ELF 32-bit LSB executable, ARM, EABI5 version 1 (SYSV)的输出说明这是一个 ARM 程序。如果看到x86-64说明你用的是宿主机的 gcc不是交叉编译器。常见问题排查问题一dtc 版本太老某些设备树语法需要较新的 dtc 版本。如果你编译设备树时报错可能是 dtc 版本太老dtc--version如果版本低于 1.4.x建议安装device-tree-compiler包而不是用系统自带的。问题二Python 模块缺失某些内核构建步骤需要特定的 Python 模块如果报错ModuleNotFoundError: No module named xxx用 pip 安装sudoaptinstallpython3-pip pip3install缺失的模块名问题三工具链路径问题如果你下载的是 ARM 官方工具链需要手动添加到 PATH# 添加到 ~/.bashrcechoexport PATH$PATH:/opt/arm-none-linux-gnueabihf/bin~/.bashrcsource~/.bashrc问题四WSL2 的特殊问题如果你在 WSL2 下编译可能会遇到文件系统大小写敏感的问题。Linux 内核源码里有同名不同大小写的文件比如Makefile和makefile在 WSL2 的默认配置下可能出问题。建议把内核源码放在 WSL2 的文件系统内比如~/linux_mainline而不是挂载的 Windows 驱动比如/mnt/c/...。WSL2 的 Linux 文件系统是大小写敏感的Windows 文件系统则不是。下一章预告到这里你的编译环境应该已经准备好了。下一篇文章我们会讲如何获取主线内核源码从 kernel.org 克隆特定版本使用 git worktree 管理多个内核版本如何应用移植补丁源码目录结构快速导读有了源码下一步就是配置和编译。我们一步步来。参考命令速查# 一键安装所有依赖Ubuntu/Debiansudoaptinstallbuild-essentialmakebcbison flex device-tree-compiler\libssl-dev libncurses-dev libgnutls28-dev zlib1g-dev python3# 安装交叉编译工具链sudoaptinstallgcc-arm-linux-gnueabihf# 验证工具链arm-linux-gnueabihf-gcc--version延伸阅读Linux Kernel Build Documentation - 内核构建系统文档ARM GNU Toolchain Download - ARM 官方工具链下载

相关文章:

正点原子IMX6ULL史诗级新内核移植教程(2)—— 编译内核(新瓶子装旧酒)

正点原子IMX6ULL史诗级新内核移植教程(2)—— 编译内核(新瓶子装旧酒) 前言:为什么这篇文章这么长 说实话,编译 Linux 内核这件事本身并不复杂——不就是 make 一下吗?但问题在于,…...

第 2 章 应用层 总述|《计算机网络:自顶向下方法》精读版

本文是计算机网络经典教材精读系列的第二章,承接第一章因特网总述,正式进入自顶向下的核心学习路径 —— 从用户最直观接触的应用层出发,拆解网络应用的工作原理、通信范式与核心协议,搭建应用层完整知识框架。一、应用层定位&…...

ai向量数据化中的余弦相似度计算

这个问题问得特别到位,很多人一开始都会懵:明明数学里余弦是邻边比斜边(x/r),怎么放到文本相似度里就“越大越相近”了? 我用最简单、不绕弯的方式给你讲明白,保证你一下就通。 1. 先记住一句话…...

【Koopman 算子】深度学习用于非线性动力学的通用线性嵌入研究(Python、Matlab代码实现)

💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…...

利用傅立叶变换(FFT)预测股价

一、数学原理 假设股价的对数收益率(为什么用对数收益率呢?是因为对数收益率更能满足平稳性要求)是随时间周期变化的函数,用表示,根据傅立叶变换的原理,可以表示成如下形式: 为复数&#xff0c…...

云原生基础工具:Docker入门:容器化的第一步

云原生基础工具:Docker入门:容器化的第一步📚 本章学习目标:深入理解Docker入门的核心概念与实践方法,掌握关键技术要点,了解实际应用场景与最佳实践。本文属于《云原生、云边端一体化与算力基建&#xff1…...

面试官灵魂一问:MySQL 深度分页如何优化?(修订版)

在线 Java 面试刷题(持续更新):https://www.quanxiaoha.com/java-interview面试考察点问题识别能力:面试官不仅仅是想知道优化方案,更是想看你能否识别出深度分页的性能瓶颈——为什么 LIMIT 1000000, 10 会慢&#xf…...

微电网黑科技】两台三电平逆变器如何玩转线路阻抗差异?手把手拆解下垂控制核心代码

下垂功率均分-两台T型三电平逆变器在不同阻感性线路阻抗下实现有功均分与无功均分,采用积分改进法(阻抗相消法),电压电流双闭环控制,中点电位平衡控制,SPWM调制。 1.下垂,电压电流双闭环控制 2.…...

小程序容器技术方案分析:选型决策框架

本文不推荐任何特定产品,仅提供技术维度对比和决策框架,帮助读者根据自身需求做出判断。 一、技术原理回顾 小程序容器的核心价值在于双线程架构,将业务逻辑与UI渲染隔离: 方案类型 架构特点 性能表现 适用场景 H5 单线程,UI与逻辑互阻塞 启动慢,滑动掉帧 简单展示类页面…...

光伏板在直流母线上抖着腿晒太阳的时候,蓄电池和超级电容这对“储能兄弟“正在后台疯狂抢活。咱们今天要聊的这个光储并网系统,本质上就是个大型动态功率分配现场

光储并网直流微电网simulink仿真模型,光伏采用mppt实现最大功率输出。 储能由蓄电池和超级电容构成的混合储能系统。 为了确保微网并网时电能质量,采用二阶低通滤波法对光伏输出功率进行抑制,通过设置不同截止频率将高频功率给超级电容响应&a…...

Spring Boot 3 + Vue 3 全栈开发课程指南:从零到独立开发通用管理系统,一篇看懂学什么、怎么学

如果你是一名Java后端开发者,你一定听过这样的声音:“后端程序员也要会前端了。” “毕设要做Web项目,Spring Boot Vue到底怎么学?” “网上课程要么只讲后端接口,要么源码堆砌脱离实际,学完还是不会做项目…...

CH32X035 RISC-V USB游戏手柄固件设计与HID协议实现

1. 项目概述CH32X035_USBGamepad 是一款面向沁恒半导体(WCH)CH32X035 系列 RISC-V 架构微控制器的高性能 USB HID 游戏手柄固件库。该库并非通用 HID 抽象层封装,而是深度耦合 CH32X035 特定硬件资源的嵌入式驱动实现,其核心目标是…...

ILI9341 LCD驱动库:新旧芯片版本兼容与确定性初始化

1. 项目概述Bonezegei ILI9341 是一款面向嵌入式系统的轻量级、高兼容性 LCD 驱动库,专为广泛使用的 ILI9341 显示控制器设计。该库不依赖 HAL 或 CMSIS-RTOS 抽象层,采用纯 C 实现,直接操作 GPIO 和 SPI 外设寄存器(或通过标准外…...

面试官问‘JS 和 DOM 啥关系’,我答‘人和房子’,当场发 offer!

这是一个很关键的问题。很多人学前端时,会把 JavaScript 和 DOM 混为一谈,觉得“JS就是用来操作网页元素的”,但实际上,它们是完全不同的两个东西,只是配合得特别紧密。 我用对比的方式来帮你理清。 文章目录一、它们…...

从静态建模到动态建模:仓储空间认知能力的关键跃迁路径—— 基于镜像视界多视角视频融合、无感定位与行为认知的三维空间计算框架

从静态建模到动态建模:仓储空间认知能力的关键跃迁路径—— 基于镜像视界多视角视频融合、无感定位与行为认知的三维空间计算框架一、引言:仓储空间认知的代际跃迁在仓储信息化发展过程中,空间建模技术经历了从二维图纸到三维模型的演进&…...

Git-RSCLIP零样本迁移实战:将预训练能力迁移到极地/海洋等特殊遥感场景

Git-RSCLIP零样本迁移实战:将预训练能力迁移到极地/海洋等特殊遥感场景 1. 引言:当通用模型遇见特殊场景 想象一下,你拿到一张北极冰盖融化的卫星图,或者一片深海珊瑚礁的遥感影像。你想让AI模型告诉你,这张图里到底…...

霜儿-汉服-造相Z-Turbo团队协作开发:使用GitHub进行模型版本管理与代码协作

霜儿-汉服-造相Z-Turbo团队协作开发:使用GitHub进行模型版本管理与代码协作 你是不是也遇到过这样的情况?和几个朋友一起捣鼓“霜儿-汉服-造相Z-Turbo”这个AI模型,想加点新功能或者修个bug。结果,你改的代码发给我,我…...

用过才敢说!千笔AI,风靡全网的AI论文软件

你是否曾为论文选题发愁,绞尽脑汁却找不到方向?是否在深夜面对空白文档无从下笔,反复修改却仍不满意?论文写作不仅是知识的较量,更是时间与耐心的挑战。面对查重率、格式规范、文献检索等重重难题,很多学生…...

CreativeRobotix教育机器人Arduino库深度解析

1. Creative Robotix 教育机器人平台 Arduino 库深度解析Creative Robotix 是由 Creative Science Foundation 发起的开源教育机器人平台,其核心设计理念是“可定制、低成本、全年龄友好”。该平台采用模块化机械结构设计,所有主体部件(如躯干…...

保姆级教程:Windows10修改Users文件夹名称后如何同步注册表设置

Windows10用户文件夹重命名后的注册表同步全指南 1. 为什么修改Users文件夹名称后需要同步注册表? 在Windows操作系统中,用户文件夹名称与注册表中的配置项紧密关联。当你直接重命名C盘下的用户文件夹时,系统并不会自动更新注册表中的相关路径…...

STM32定时器实战:用TIM2实现精准1ms延时(标准库版)

STM32定时器实战:用TIM2实现精准1ms延时(标准库版) 在嵌入式开发中,精准的延时控制往往是项目成败的关键。无论是传感器数据采集、电机控制还是通信协议处理,毫秒级的时序偏差都可能导致整个系统失效。而STM32的通用定…...

手把手用C++实现一个基于Protobuf的简易聊天程序(附完整源码)

从零构建基于Protobuf的C聊天程序:完整实现与深度解析 在分布式系统开发中,高效的数据序列化与网络通信是核心挑战。本文将带您完整实现一个基于Protobuf的聊天程序,涵盖协议设计、网络通信模型到实际部署的全流程。不同于简单的代码示例&…...

LoRa_AT库:面向AT指令型LoRa模块的轻量Arduino驱动

1. LoRa_AT 库概述:面向 AT 指令型 LoRa 模块的轻量级 Arduino 驱动框架LoRa_AT 是一个专为基于 AT 指令通信的 LoRa 模块设计的轻量级 Arduino C 类库。其核心定位并非通用蜂窝通信(如 GSM/LTE),而是聚焦于一类广泛应用于低功耗广…...

Cadence原理图模块化避坑指南:从‘电气检查报错’到‘一键同步更新’的完整流程

Cadence原理图模块化避坑指南:从‘电气检查报错’到‘一键同步更新’的完整流程 在电子设计自动化(EDA)领域,Cadence作为行业标杆工具链,其原理图模块化功能能显著提升复杂电路设计的可维护性。但许多工程师在从单体设…...

LTC230x I²C高精度ADC驱动深度解析与嵌入式实践

1. LTC230x系列ADC库深度解析:面向嵌入式工程师的IC高精度模数转换实践指南Linear Technology(现为Analog Devices)LTC230x系列是工业级12位逐次逼近型(SAR)模数转换器,专为低功耗、高精度、多通道模拟信号…...

5G NR PBCH处理流程详解:从MIB到天线映射的完整指南

5G NR PBCH处理流程详解:从MIB到天线映射的完整指南 在5G通信系统中,物理广播信道(PBCH)承载着网络最基本的配置信息,是终端设备(UE)接入网络的第一道"钥匙"。作为同步信号块(SSB)的核心组成部分,PBCH的处理流程涉及多个…...

5分钟搞懂多项式不可约性:从复数域到有限域的实战指南

5分钟搞懂多项式不可约性:从复数域到有限域的实战指南 多项式不可约性是代数学中的核心概念,也是密码学、编码理论等领域的数学基础。本文将带你快速理解不同数域下的不可约多项式判定方法,并通过Python和SageMath代码示例展示实际操作技巧。…...

FRCRN语音降噪工具实战案例:会议室录音去空调/键盘/人声交叠噪声效果展示

FRCRN语音降噪工具实战案例:会议室录音去空调/键盘/人声交叠噪声效果展示 1. 项目背景与价值 在现代办公环境中,会议录音质量往往受到各种环境噪声的严重影响。空调的低频嗡嗡声、键盘敲击的咔嗒声、多人同时发言的语音交叠,这些噪声不仅影…...

老设备激活指南:使用OpenCore Legacy Patcher实现Mac系统兼容性突破

老设备激活指南:使用OpenCore Legacy Patcher实现Mac系统兼容性突破 【免费下载链接】OpenCore-Legacy-Patcher 体验与之前一样的macOS 项目地址: https://gitcode.com/GitHub_Trending/op/OpenCore-Legacy-Patcher OpenCore Legacy Patcher是一款专为Intel架…...

香橙派5 NPU性能实测:yolov5在RK3588上的推理速度到底有多快?

香橙派5 NPU实战:RK3588芯片如何实现yolov5百帧级实时推理 当我在工作室第一次用香橙派5运行yolov5模型时,监控画面中的人流检测框像被施了魔法般流畅滑动——这完全颠覆了我对单板计算机AI性能的认知。作为RK3588芯片的招牌特性,那颗6TOPS算…...