在更改后的 CentOS 7 中构建内核模块 API
Build kernel module in CentOS 7 with changed API
我编写 NIC 模块驱动程序并实现它的基本功能,如 ndo_open
、ndo_stop
、ndo_start_xmit
...
有时 Linux 内核 API 在最近的版本中发生了变化。所以像 LINUX_VERSION_CODE
这样的宏有助于将模块的代码采用到最近的 Linux 内核版本。在 CentOS(RHEL) 中,我遇到了改变 NIC MTU
的函数名称与 vanilla Linux 内核不同的函数名称。在 vanilla Linux 内核 v.3.10.0
中,它的原型是:
int (*ndo_change_mtu)(struct net_device *dev,
int new_mtu);
但在 CentOS 7.6.1810 3.10.0-957.el7.x86_64
中是:
RH_KABI_RENAME(int (*ndo_change_mtu),
int (*ndo_change_mtu_rh74))(struct net_device *dev,
int new_mtu);
所以我必须使用 ndo_change_mtu_rh74
而不是 ndo_change_mtu
,这正如我预期的那样有效。
是否可以使用一些宏来采用不同 Linux 内核版本之间的模块代码而不打补丁代码以防止针对 CentOS(RHEL) Linux 内核的编译错误?
感谢@omajid,他向我提供了有关 kni: Fix build on RHEL 8 的主题。下一个宏解决了我的问题:
#if (defined(RHEL_RELEASE_CODE) && \
(RHEL_RELEASE_CODE >= RHEL_RELEASE_VERSION(7, 5)))
(RHEL_RELEASE_CODE >= RHEL_RELEASE_VERSION(7, 5)) && \
(RHEL_RELEASE_CODE < RHEL_RELEASE_VERSION(8, 0)))
#define ndo_change_mtu ndo_change_mtu_rh74
#endif
我编写 NIC 模块驱动程序并实现它的基本功能,如 ndo_open
、ndo_stop
、ndo_start_xmit
...
有时 Linux 内核 API 在最近的版本中发生了变化。所以像 LINUX_VERSION_CODE
这样的宏有助于将模块的代码采用到最近的 Linux 内核版本。在 CentOS(RHEL) 中,我遇到了改变 NIC MTU
的函数名称与 vanilla Linux 内核不同的函数名称。在 vanilla Linux 内核 v.3.10.0
中,它的原型是:
int (*ndo_change_mtu)(struct net_device *dev,
int new_mtu);
但在 CentOS 7.6.1810 3.10.0-957.el7.x86_64
中是:
RH_KABI_RENAME(int (*ndo_change_mtu),
int (*ndo_change_mtu_rh74))(struct net_device *dev,
int new_mtu);
所以我必须使用 ndo_change_mtu_rh74
而不是 ndo_change_mtu
,这正如我预期的那样有效。
是否可以使用一些宏来采用不同 Linux 内核版本之间的模块代码而不打补丁代码以防止针对 CentOS(RHEL) Linux 内核的编译错误?
感谢@omajid,他向我提供了有关 kni: Fix build on RHEL 8 的主题。下一个宏解决了我的问题:
#if (defined(RHEL_RELEASE_CODE) && \
(RHEL_RELEASE_CODE >= RHEL_RELEASE_VERSION(7, 5)))
(RHEL_RELEASE_CODE >= RHEL_RELEASE_VERSION(7, 5)) && \
(RHEL_RELEASE_CODE < RHEL_RELEASE_VERSION(8, 0)))
#define ndo_change_mtu ndo_change_mtu_rh74
#endif