linux内核编译不通过问题的两种排查方法(非正式)

news2024/11/29 2:38:18

目录

一、前言

二、 问题现象

三、问题排查思路1:问题所在处向上排查

3.1 整体思路

3.2 排查过程

3.3 资料查询

3.4 尝试动作1:开启相应配置项

3.4.1 检查内核配置项

3.4.2 开启配置项

3.4.3 尝试编译

四、问题排查思路2:从上向下排查

4.1 整体思路

4.2 对比linux内核工程

4.3 对比文件

4.4 尝试排查问题

4.4.1 尝试关闭 CPU idle PM support

五、写在最后

5.1 问题解决

5.2 总结


一、前言

文档背景:使用正点原子的imx6ull开发板,进行内核配置后,编译出现不通过的问题。由于修改内核配置过多,不太确定是什么配置项引起的,针对该内核编译异常问题进行排查。
文档目的:这篇文章针对内核配置后编译异常提出了两个不同的排查思路
板件型号:正点原子的imx6ull开发板
linux内核版本:linux 4.1.15

二、 问题现象

    进行内核编译的时候,提示如下信息

三、问题排查思路1:问题所在处向上排查

3.1 整体思路

   通过全局搜索调用到ldo2p5_dummy_probe函数所在文件,进一步排查是开启什么配置引起的

3.2 排查过程

1、make manuconfig内检索ldo2p5、ldo2等。

       结果:没有找到对应的配置

2、定位出错文件

   内核代码目录下检索调用ldo2p5_dummy_probe函数的文件

grep -R  "ldo2p5_dummy_probe"

可以看到是cpuidle-imx6sl文件使用到未定义的regulator_register函数。
疑问点:regulator_register函数显然是一个注册函数,那么该函数的作用以及如何解决该问题。
   

3.3 资料查询

   在 Linux 内核中,regulator_register 是一个函数,用于注册和初始化电压调节器(voltage regulator)
   如果你在编译内核模块或驱动程序时遇到 regulator_register 未定义的引用错误,可能是由于以下几种情况导致的:
  • 1. 缺少相关的头文件:确保你的代码中包含了正确的头文件。regulator_register 函数的原型通常在 <linux/regulator/consumer.h> 或者 <linux/regulator/regulator.h> 中声明。请检查你的代码中是否包含了这些头文件。
  • 2. 配置选项未启用:某些内核配置选项可能会禁用电压调节器子系统,导致 regulator_register 函数未定义。确保你的内核配置中启用了相关的配置选项,例如 CONFIG_REGULATOR 或 CONFIG_REGULATOR_USERSPACE_CONSUMER。你可以通过 make menuconfig 或者 make xconfig 等命令来打开内核配置界面,检查并启用相应的选项。
  • 3. 编译顺序问题:如果你的代码是作为内核模块进行编译的,并且依赖于 regulator_register 函数,确保你正确地在 Makefile 中指定了依赖的模块。在 Makefile 中,你需要将依赖的模块添加到 obj-m 或 obj-y 变量中,以确保编译顺序正确。
  • 4. 内核版本问题:某些函数或符号可能在不同的内核版本中有所不同。如果你使用的是较旧的内核版本,而你的代码是基于较新的内核版本编写的,那么 regulator_register 可能不存在。请确保你的代码与当前使用的内核版本兼容。

3.4 尝试动作1:开启相应配置项

    根据资料查询可知,出现regulator_register 函数未定义的问题,检查一下相关配置选项。

3.4.1 检查内核配置项

    在内核menuconfig配置界面,查看是否开启CONFIG_REGULATOR配置

可以看到显然该项配置没有开启。通过检查该项的开启条件,针对imx平台需要满足如下依赖配置

DRM_MSM [=n] && HAS_IOMEM [=y] && DRM [=y] && (ARCH_QCOM [=n] || ARM [=y] && COMPILE_TEST [=n]) && OF [=y] && COMMON_CLK [=y]   

    逐项解释一下各依赖项的作用

  • COMPILE_TEST 编译不能加载的驱动程序

  • DRM_MSM (没明白什么作用)

3.4.2 开启配置项

    1、COMPILE_TEST配置项

       通过General setup -> Compile also drivers which will not load 即可开启该配置

    2、DRM_MSM 配置项

       开启COMPILE_TEST后,DRM_MSM自动也开启了配置项

     3、CONFIG_REGULATOR配置项

        开启COMPILE_TEST后,CONFIG_REGULATOR自动也开启了配置项

3.4.3 尝试编译

    修改完上述内核配置后,尝试编译内核看能否编译通过。

        编译结果如上所示。解决了"未定义的regulator_register函数"问题,出现了新的未定义引用问题。
        上述问题如果继续排查可能会牵扯太多的东西,这并不是我的目标任务,尝试使用另一排查思路。
        上述排查过程也算是较为完整的流程,如果后续另一思路没有办法结局,可能会继续沿着这一思路排查。

四、问题排查思路2:从上向下排查

4.1 整体思路

    通过对比修改过的内核配置与原厂提供的能够正常编译的版本,这样一步步修改排查问题所在。

4.2 对比linux内核工程

  • 原厂提供的正常编译的工程:{dir}/alientek_linux/
  • 修改过的编译不通过的工程:{dir}/temp_20221223/
    对比内核工程指令:
cd {dir}
diff -r alientek_linux/ temp_20221223/ > diff.log

4.3 对比文件

    根据生成的diff.log 文件内容提示,一步步排查问题所在。

4.4 尝试排查问题

    由于根据两个工程的对比文件diff.log,能够看出修改的内容,将异常工程一步步修改并且编译测试,知道内核异常消除。

    这个过程比较漫长,下面仅列出两个个测试项目,后续不再赘述。

4.4.1 尝试关闭 CPU idle PM support

1、内核配置路径:通过关闭→ CPU Power Management → CPU Idle ->CPU idle PM support。再次编译

2、结果:仍然存在同样的报错

4.4.2 尝试关闭Suspend to RAM and standby、 Device power management core functionality

1、内核配置项路径:

→ Power management options -> Suspend to RAM and standby

→ Power management options-> Device power management core functionality

2、结果:

会报如下错误,显然关闭pm(power manager)相关功能,需要有相应的修改。

 

3、针对错误struct wiphy相关错误的解决
  • wl_cfg80211是什么? 在 Linux 内核中,cfg80211 是一个用于无线配置的 API 接口。它提供了与无线设备和无线网络配置相关的功能和接口
  • 'struct wiphy'在无线配置中起到的作用? struct wiphy 是用于表示无线设备的结构体,在 Linux 内核中负责管理无线网络的配置和操作
  • 'wowlan'在其中起到什么作用? wowlan 是其中的一个成员,用于配置和管理设备的 Wake-on-Wireless LAN(WoWLAN)功能,即通过无线网络唤醒设备
    经过上面的简单分析,可以得知,是内核配置无线网络功能的时候,同时开启了无线网络唤醒设备的功能,那么可以关闭内核中网络唤醒设备的功能,尝试是否可以解决。

五、写在最后

5.1 问题解决

    经过通过排查思路二,即自上向下的排查,经过漫长的排查后,终于内核工程编译通过。

5.2 总结

    这篇文章针对内核配置后编译异常提出了两个不同的排查思路,各位同学开发过程中显然会遇到各式各样的问题,看文章过程中,其实很多情况下与自身遇到的问题还是有一些不同的,所以我们更应该从文章中学习其排查方式、排查思路、思考逻辑,这样才能更具有通用性。而且遇到问题时,多思考是否有不同的路,多尝试。

    当然上面的排查过程路子也是有点不正规,欢迎各位老哥进行交流指教!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/524103.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

讯飞星火大模型体验报告

近日&#xff0c;科大讯飞召开了星火认知大模型成果发布会&#xff0c;会上表示讯飞星火大模型将突破开放式问答&#xff0c;对标ChatGPT&#xff0c;在中文能力上超过ChatGPT&#xff0c;在英文能力上与ChatGPT相当。对此&#xff0c;你怎么看&#xff1f; 笔者准备给bing/ch…

数据结构第二天:File Transfer 【树的应用:集合】

原题是英文的&#xff1a;题目详情 - 05-树8 File Transfer (pintia.cn) 我用软件翻译了一下: 我们有一个计算机网络和一系列双向连接。这些连接中的每一个都允许文件从一台计算机传输到另一台计算机。有没有可能从网络上的任何一台计算机向其他计算机发送文件? Input Specif…

STM32 学习笔记_7 定时器中断:输出比较

输出比较 电机相关比较重要。 OC Output Compare&#xff08;IC 是输入捕获&#xff0c;CC代指这两个单元&#xff09;&#xff0c;用于输出一定频率和占空比的PWM波形。 右下角四个就是CCR。只有通用计时器和高级计时器有&#xff0c;共用一个cnt计数器&#xff0c;高级计数…

(数字图像处理MATLAB+Python)第七章图像锐化-第四节:频域高通滤波与综合案例

文章目录 一&#xff1a;频域高通滤波&#xff08;1&#xff09;理想的高通滤波器&#xff08;2&#xff09;巴特沃斯高通滤波器&#xff08;3&#xff09;指数高通滤波器&#xff08;4&#xff09;梯形高通滤波器 二&#xff1a;综合案例——人像美化&#xff08;1&#xff09…

C语言函数大全-- w 开头的函数(2)

C语言函数大全 本篇介绍C语言函数大全-- w 开头的函数 1. wcstok 1.1 函数说明 函数声明函数功能wchar_t *wcstok(wchar_t *wcs, const wchar_t *delim, wchar_t **ptr);用于将一个长字符串拆分成几个短字符串&#xff08;标记&#xff09;&#xff0c;并返回第一个标记的地…

非煤矿山电子封条建设算法 yolov8

非煤矿山电子封条建设算法模型通过yolov8网络模型AI视频智能分析技术&#xff0c;算法模型对作业状态以及出井入井人员数量变化、人员睡岗离岗等情况实时监测分析&#xff0c;及时发现异常动态&#xff0c;自动推送生成的违规截图报警信息。现代目标检测器大部分都会在正负样本…

免费下载Sketch模板素材一文搞定!

对于设计师来说&#xff0c;UI 模板素材是提高设计效率和保证设计质量的重要工具。然而&#xff0c;很多设计师在使用 Sketch 时&#xff0c;会遇到 Sketch 模板素材不足、格式不兼容或使用成本高等问题。本文将为你介绍一款资源齐全、跨平台、无需下载、免费使用的 Sketch 模板…

Tips for Deep Learning

目录 Recipe of Deep Learning Good Results on Training Data&#xff1f; New activation function Adaptive learning rate Good Results on Testing Data&#xff1f; Early Stopping Regularization Dropout Recipe of Deep Learning 我们要做的第一件事是&#x…

http协议在万维网的一生

tcp与udp的区别 http协议位于应用程序层&#xff0c;必须经过传输层进行通信 tcp即传输控制协议&#xff0c;首先通过三次握手建立连接&#xff0c;然后传输数据&#xff0c;数据传输成功后 通过四次挥手关闭连接&#xff0c;如有数据丢失则会重试保证数据传输可靠性 是一个面向…

树的前中后序以及广度优先搜索和深度优先搜索

文章目录 基本概念定义一棵树前序遍历中序遍历后序遍历BFS广度优先遍历DFS深度优先遍历 基本概念 树是一个有n个有限节点组成一个具有层次关系的集合&#xff0c;每个节点有0个或者多个子节点&#xff0c;没有父节点的节点称为根节点&#xff0c;也就是说除了根节点以外每个节…

TS38.331中need -M/R/N/S 的含义

need M&#xff1a;这种字段需要UE在不存在时维护&#xff1b;need R&#xff1a;当RRC中此字段不存在时&#xff0c;UE需要释放&#xff1b;need N&#xff1a;当此字段不存在时&#xff0c;UE不需要采取任何行动&#xff08;即UE不需要保持该字段的任何现有值&#xff09;&am…

如何使用单片机点亮LED灯,并使用按键控制[51单片机]

首先先看一下我的板子&#xff0c;如果我们板子不相同&#xff0c;可能操作也不太相同 我们就不讲底层原理了&#xff0c;直接看&#xff0c;我们可以看到板子上有 8个LED灯 那这个8个LED用什么来控制呢&#xff0c;我们先看底层的线路图&#xff0c;所有的LEDD都连接到了P2带后…

云原生技术中的容器技术有哪些?

文章目录 云原生技术中的容器技术有哪些1、云原生的含义2、容器的含义3、云原生的技术的基石&#xff1a;容器技术4、容器技术有哪些? 结语 云原生技术中的容器技术有哪些 在现今的安全行业中云原生安全技术中的容器安全技术有哪些呢&#xff0c;很多用户都不知道具体的含义以…

Linux程序设计之UDP通信

1.UDP通信是不可靠的、无连接的通信&#xff0c;客户端只需要服务器端的地址信息即可与之进行通信。UDP通信的基本流程如下&#xff1a; 2.利用UDP实现服务器端与客户端的通信如下&#xff1a; /*UDP通信*/ //服务端#include <stdio.h> #include <string.h> #incl…

低造价形状记忆合金相变温度DSC热分析替代技术:帕尔贴热电装置和电阻温度测量

摘要&#xff1a;形状记忆合金&#xff08;SMA&#xff09;是一种先进的金属材料&#xff0c;其物理和机械性能本质上依赖于温度。为了快速和低成本的实现SMA相变温度和热滞后性能的测试表征&#xff0c;基于更灵敏的电阻温度依赖关系&#xff0c;本文提出了采用帕尔贴TEC加热制…

论文学习笔记:ViT Vision Transformer An Image is worth 16X16 words

论文阅读&#xff1a;ViT Vision Transformer An Image is worth 16X16 words 今天介绍的是 Transformer 在视觉领域的一篇非常重要的论文&#xff0c;Vision Transformer&#xff0c;这篇文章发表在 2021 ICLR 的会议上。长久以来 CNN 一直是 CV 领域最主流的模型&#xff0c…

从零开始:开发一款应用程序的完整流程技巧

在数字化快速发展的现在&#xff0c;开发一款应用程序已经不是一件困难的事情。低代码应用开发平台的诞生更是让应用开发变成一项人人都能快速掌握的技能。之前&#xff0c;我们使用Java、C语言等传统的语言技术进行应用开发&#xff0c;来满足企业的业务应用需求。但是&#x…

rm / -rf指令的作用是?

学习Linux 指令&#xff0c;它是操作系统的前端&#xff0c;学好这部分内容一方面可以帮助你应对工作场景&#xff0c;另一方面可以让你在学习操作系统底层知识前&#xff0c;对 Linux 有一个大概的了解。 学习 Linux 指令之前&#xff0c;先来说一下什么是 Shell&#xff1f;S…

使用FFMPEG加载外挂字幕小记

ffmpeg版本&#xff1a; FFMEPEG 4.4 继上一篇简易播放器实现后&#xff0c;优化过程中&#xff0c;加载外挂字幕小记的过程和遇到的坑记录如下&#xff1a; 视频字幕分为三种。 内嵌字幕&#xff0c;字幕与视频图像合二为一&#xff0c;成为视频帧的一部分。 内封字幕&…

Python浪漫520表白代码

目录 前言 表白界面 跳动的爱心 漂浮的爱心 满屏表白代码 前言 520是每年的5月20日&#xff0c;因数字“520”与“我爱你”发音相似而被许多年轻人用作表达爱意的节日。这个节日起源于中国互联网文化&#xff0c;逐渐传递到其他国家和地区。在这一天&#xff0c;情侣们通…