gpt4 book ai didi

linux-kernel - Centos Kernelheaders 包括来自 future 内核的更改

转载 作者:太空宇宙 更新时间:2023-11-03 17:21:17 25 4
gpt4 key购买 nike

长话短说

我得到的 Kernelheaders 具有正确的版本号,但功能定义仅在稍后的某些内核版本中引入。我如何从 future 摆脱这些定义?


背景

我一直在写一个内核模块,发现它没有在另一台机器上编译,错误是 pci_bus_address没有定义。快速调查得出,它 should not be defined因为它运行的是 3.10 内核,并且此功能仅在 3.14 之后可用。 .

我认为快速 #if (LINUX_VERSION_CODE < KERNEL_VERSION(3,14,0)) block 应该解决这个问题。但是,我的主机也运行 3.10 内核。

为什么我的内核头文件知道一个函数,该函数只应在更高版本的内核中定义?如何获得不包含此功能的正确内核 header ?

我跑了 repoquery -i kernel-devel显示已安装的版本:

Name        : kernel-devel
Version : 3.10.0
Release : 327.18.2.el7
Architecture: x86_64
Size : 34442356
Packager : None
Group : System Environment/Kernel
URL : http://www.kernel.org/
Repository : updates
Summary : Development package for building kernel modules to match the kernel
Source : kernel-3.10.0-327.18.2.el7.src.rpm
Description :
This package provides kernel headers and makefiles sufficient to build modules
against the kernel package.

然而运行grep pci_bus_addr /usr/src/kernels/3.10.0-327.18.2.el7.x86_64/include/linux/pci.h返回 static inline dma_addr_t pci_bus_address(struct pci_dev *pdev, int bar)

最佳答案

@Ian Abbott 为我指出了正确的方法。事实证明,Redhat packports 补丁。在他们的 git 存储库中跌跌撞撞我可以 pinpoint the change to a specific kernel version .

虽然更新日志中的规范显示了一个特定的版本,但我很幸运,并且这些更改与 RHEL_RELEASE_CODE 有关(由 centos 的主要和次要数量组成(即有问题的更改是在 7.1 之后的内核中)而不是更改日志中的发布代码,它只能作为字符串在 <linux/version.h> 中找到。(进行条件编译基于字符串将是一场噩梦(调用额外的工具来解析字符串并基于此生成头文件))。

添加#if (RHEL_RELEASE_VERSION() <= RHEL_RELEASE_CODE)可以解决问题(依赖于 undefined constants being 0 用于非 redhat 发行版)。

关于linux-kernel - Centos Kernelheaders 包括来自 future 内核的更改,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37972433/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com