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

目录

一、前言

二、 问题现象

三、问题排查思路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 总结

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

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

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
内核编译是将Linux内核源代码转化为可执行的内核映像文件的过程。以下是内核编译的基本方法: 1. 下载内核源代码:首先,我们需要从官方网站或GitHub上下载最新的Linux内核源代码包,解压缩到本地目录。 2. 配置内核选项:进入内核源代码目录后,可以运行"make menuconfig"或"make config"命令,进入内核配置菜单。在这里,你可以根据自己的需求定制内核选项,包括硬件支持、功能模块、文件系统等。 3. 编译内核:配置完成后,运行"make"命令进行内核编译编译过程可能持续几分钟甚至更久,取决于你的计算机性能和内核配置选项。 4. 安装内核编译完成后,运行"make install"命令安装编译好的内核映像文件。这个命令通常会将内核文件复制到"/boot"目录,并更新引导加载程序。 5. 更新引导加载程序:在安装完内核后,需要使用引导加载程序配置工具(如GRUB、LILO)更新引导加载程序的配置文件,以使其能够识别新的内核。 6. 重启系统:完成以上步骤后,就可以通过重启计算机来使用新编译内核了。在重启后,引导加载程序会提供新内核作为启动选项,选择新内核并进入系统。 需要注意的是,内核编译是一项技术要求较高的操作,需要对系统的硬件和软件有一定的了解。此外,编译内核时需要谨慎选择和配置内核选项,以免导致系统出现不稳定或不兼容的问题。因此,对于一般用户来说,建议使用发行版提供的预编译内核,而不是自己编译内核,以确保系统的稳定性和兼容性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值