15AH, San Francisco

California, United States.

Send Your Mail At:

tianyingkejishe@sina.cn

Working Hours

Mon-Sat: 9.30am To 7.00pm

归档标题

Autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et dolore feugait.

月度归档 11月 24, 2025

【Ubuntu】飞腾s5000c移植国产网卡WX1860AL2驱动

硬件平台:

国产飞腾芯片s5000c-16

国产网讯网卡WX1860AL2

软件平台:

Distributor ID: Ubuntu
Description: Ubuntu Built with Buildroot, based on Ubuntu 22.04 LTS
Release: 22.04
Codename: jammy

1、获取网卡驱动

直接从官网下载就好,本实现使用的版本:ngbe-1.2.7.zip

2、编译安装(一定要在目标机操作)

不同平台上编译,安装的命令不同:

Kylin V10/银河麒麟 操作系统:

编译:

make CHNOS=KYLIN

安装:

make CHNOS=KYLIN modules_install

或者

make CHNOS=KYLIN install

UOS 操作系统:

编译:

make CHNOS=UOS

安装

make CHNOS=UOS modules_install

或者

make CHNOS=UOS install

Euler 操作系统:

编译:

make CHNOS=EULER

安装:

make CHNOS=EULER modules_install

或者

make CHNOS=EULER install

其他平台操作系统:

编译:

make

安装:make modules_install

或者

make install

4) 加载驱动:

modprobe txgbe (仅安装完首次需要手动加载,若重启系统,系统会自动加载驱动)。

5)查看驱动是否加载成功:

[root@SW ~]# lsmod | grep txgbe

txgbe 208399 0

表明驱动已经加载上。

3、卸载驱动

1)显示已安装的驱动:

[root@localhost ~]# lsmod | grep txgbe

txgbe 385024 0

2)卸载驱动:rmmod txgbe

[root@localhost ~]# rmmod txgbe

3) 再次查看已安装的驱动,已经没有 txgbe 驱动。

[root@localhost ~]# lsmod | grep txgbe

4、参考资料

5、适配后的网卡驱动

【Linux】内核log打印级别设置

1. 日志级别控制

  • 查看当前日志级别cat /proc/sys/kernel/printk # 输出:4 4 1 7 → 当前控制台阈值为4
  • 启用 pr_info 输出(需级别 ≤6):echo 7 > /proc/sys/kernel/printk # 将阈值设为7(允许INFO及以上日志输出)
  • 持久化配置:在 /etc/sysctl.conf 添加 kernel.printk = 7 4 1 77

2. 查看输出日志

  • 实时监控dmesg -w # 动态显示内核日志
  • 筛选特定日志dmesg --level=info # 仅显示INFO级别日志

[Arm]version magic ‘5.6.0-rc5+ SMP mod_unload ‘ should be…问题研究

1, 首先,为什么会出现修改了kernel重新编译后magic num改变
内核版本是如何生成的:

Linux 内核在进行模块装载时先完成模块的 CRC 值校验,再核对 vermagic 中的字符信息,linux版本在 include/generated/utsrelease.h中定义,文件中的内容如下:

#define UTS_RELEASE "4.9.123"

utsrelease.h是kernel编译后自动生成的,用户更改里面的内容不会有效果。
这个值可以通过修改最顶层的Makefile文件来修改。

VERSION = 4
PATCHLEVEL = 9                
SUBLEVEL = 123                
EXTRAVERSION =
...

init/version.c中,定义了kernel启动时的第一条打印信息:

/* FIXED STRINGS! Don't touch! */
const char linux_banner[] =
  "Linux version " UTS_RELEASE " (" LINUX_COMPILE_BY "@"
  LINUX_COMPILE_HOST ") (" LINUX_COMPILER ") " UTS_VERSION "\n";

const char linux_proc_banner[] =
  "%s version %s"
  " (" LINUX_COMPILE_BY "@" LINUX_COMPILE_HOST ")"
  " (" LINUX_COMPILER ") %s\n";

这里UTS_RELEASE在kernel编译时自动生成

init/main.casmlinkage __visible void __init start_kernel(void)函数中,有kernel启动的第一条打印信息,这条信息是dmesg命令打印出来:

pr_notice("%s", linux_banner);

驱动模块的version magic信息是怎么生成的:

4.x 内核下,在include/linux/vermagic.h中定义有VERMAGIC_STRING,如下:

#include <generated/utsrelease.h>
              
/* Simply sanity version stamp for modules. */
#ifdef CONFIG_SMP
#define MODULE_VERMAGIC_SMP "SMP "
#else
#define MODULE_VERMAGIC_SMP ""
#endif
#ifdef CONFIG_PREEMPT
#define MODULE_VERMAGIC_PREEMPT "preempt "
#else
#define MODULE_VERMAGIC_PREEMPT ""
#endif
#ifdef CONFIG_MODULE_UNLOAD
#define MODULE_VERMAGIC_MODULE_UNLOAD "mod_unload "
#else
#define MODULE_VERMAGIC_MODULE_UNLOAD ""
#endif 
#ifdef CONFIG_MODVERSIONS
#define MODULE_VERMAGIC_MODVERSIONS "modversions "
#else
#define MODULE_VERMAGIC_MODVERSIONS ""
#endif
#ifndef MODULE_ARCH_VERMAGIC
#define MODULE_ARCH_VERMAGIC ""
#endif  

#define VERMAGIC_STRING             \
  UTS_RELEASE " "             \
  MODULE_VERMAGIC_SMP MODULE_VERMAGIC_PREEMPT       \
  MODULE_VERMAGIC_MODULE_UNLOAD MODULE_VERMAGIC_MODVERSIONS \
  MODULE_ARCH_VERMAGIC

VERMAGIC_STRING不仅包含内核版本号,还包含有内核使用的SMP与preempt, MODULE_UNLOAD, 架构等配置信息。模块在编译时,我们可以看到屏幕上会显示”MODPOST”。

  <~/Documents/Demo/driver/debugfs> make
make -C ~/kernel/ SUBDIRS=~/Documents/Demo/driver/debugfs modules
make[1]: Entering directory '~/kernel'
  CC [M]  ~/Documents/Demo/driver/debugfs/my_debugfs.o
  Building modules, stage 2.
  MODPOST 1 modules
  CC      ~/Documents/Demo/driver/debugfs/my_debugfs.mod.o
  LD [M]  ~/Documents/Demo/driver/debugfs/my_debugfs.ko
make[1]: Leaving directory '~/kernel'

在此阶段, VERMAGIC_STRING会添加到模块的modinfo段。在内核源码目录下scripts\mod\modpost.c文件中可以看到模块后续处理部分的代码。模块编译生成后,通过modinfo my_debugfs.ko命令可以查看此模块的vermagic等信息。

  <~/Documents/Demo/driver/debugfs> modinfo my_debugfs.ko 
filename:      ~/Documents/Demo/driver/debugfs/my_debugfs.ko
license:        GPL
depends:        
vermagic:       4.9.123 SMP preempt mod_unload aarch64

4.x 内核下的模块装载器里保存有内核的版本信息,在装载模块时,装载器会比较所保存的内核vermagic与此模块的modinfo段里保存的vermagic信息是否一致,两者一致时,模块才能被装载。

为了使两个版本一致:可以把 依赖源码中的include/linux/vermagic.h中的UTS_RELEASE修改成与目标机器的版本一致,这样,再次编译模块就可以了。

内核模块版本和内核版本不一致的处理方法

2, 发现版本号会追加git的版本号,还有个“+”
向linux内核版本号添加字符/为何有时会自动添加“+”号,根据这篇文章,一步一步试一下

第一步:去掉git的附加信息
先在menuconfig中找到

  │ Symbol: LOCALVERSION [=]                                                                                                                                                                                   │  
  │ Type  : string                                                                                                                                                                                             │  
  │ Prompt: Local version - append to kernel release                                                                                                                                                           │  
  │   Location:                                                                                                                                                                                                │  
  │ (1) -> General setup                                                                                                                                                                                       │  
  │   Defined at init/Kconfig:81                                                                                                                                                                               │  
  │                                                                                                                                                                                                            │  
  │                                                                                                                                                                                                            │  
  │ Symbol: LOCALVERSION_AUTO [=n]                                                                                                                                                                             │  
  │ Type  : boolean                                                                                                                                                                                            │  
  │ Prompt: Automatically append version information to the version string                                                                                                                                     │  
  │   Location:                                                                                                                                                                                                │  
  │ (2) -> General setup                                                                                                                                                                                       │  
  │   Defined at init/Kconfig:91                                                                                                                                                                               │  
  │   Depends on: !COMPILE_TEST [=n]                                                                                                                                                                           │  
  │                                                           

关掉LOCALVERSION_AUTO并留空LOCALVERSION,发现git版本确实是不见了,但是‘+’还是存在。

第二步:去掉“+”号

scripts/setlocalversion文件中,找到以下语句:

# CONFIG_LOCALVERSION and LOCALVERSION (if set)
res="${res}${CONFIG_LOCALVERSION}${LOCALVERSION}"

# scm version string if not at a tagged commit
if test "$CONFIG_LOCALVERSION_AUTO" = "y"; then
  # full scm version string
  res="$res$(scm_version)"
else
  # append a plus sign if the repository is not in a clean
  # annotated or signed tagged state (as git describe only
  # looks at signed or annotated tags - git tag -a/-s) and
  # LOCALVERSION= is not specified
  if test "${LOCALVERSION+set}" != "set"; then
    scm=$(scm_version --short)
   # res="$res${scm:++}"	//××××××××××××××注释掉这句话××××××××××××
  fi
fi

下面是注释前后的对比

注释前
在这里插入图片描述

问题解决。

Note:在网上还看到两种方法,写在下面:第一种:menuconfig 的时候不要勾选,直接搜MODVERSIONS

注意不要选图中那行

第二种:modprobe –force-vermagic helloworld.ko

这个大家可以自行尝试一下

common.mk:79: *** Kernel header files not in any of the expected locations. common.mk:80: *** Install the appropriate kernel development package, e.g. common.mk:81: *** kernel-devel, for building kernel modules and try again. Stop.

根据错误信息和搜索结果,该报错是由于编译内核模块时系统缺少与当前运行内核完全匹配的内核开发包(kernel-develkernel-headers)导致的。以下是完整解决方案:


🔧 一、安装匹配的内核开发包

  1. 确认当前内核版本
    终端执行:uname -r # 示例输出:3.10.0-1160.81.1.el7.x86_64
  2. 安装对应版本的内核开发包sudo yum install kernel-devel-$(uname -r) kernel-headers-$(uname -r)
    • 若yum仓库无匹配版本(常见于自定义内核或旧系统):
      • 手动下载rpm包:访问 pkgs.org 搜索内核版本对应的包(参考11
      • 强制安装:sudo rpm -ivh --force kernel-devel-*.rpm kernel-headers-*.rpm

📂 二、检查内核头文件路径

  1. 验证文件是否存在
    检查以下目录是否包含当前内核版本的文件夹:ls /usr/src/kernels/$(uname -r)
  2. 修复软链接问题(关键步骤)
    /usr/src/linux指向错误路径或无链接,需重建:sudo rm -f /usr/src/linux sudo ln -s /usr/src/kernels/$(uname -r) /usr/src/linux 注:此操作解决编译脚本查找头文件的路径问题(参考185

⚠️ 三、其他可能原因

  1. 未安装编译工具链
    确保已安装基础开发工具:sudo yum groupinstall "Development Tools" sudo yum install elfutils-libelf-devel # 缺少libelf时报错(引用[10]())
  2. 硬件兼容性问题
    • NVIDIA显卡驱动安装时需先禁用nouveau驱动(参考5):echo "blacklist nouveau" | sudo tee /etc/modprobe.d/blacklist-nouveau.conf sudo update-initramfs -u
    • 虚拟机环境(如VMware)需检查内核模块签名(引用13

📝 四、完整操作流程示例

bash

复制

# 步骤1:安装开发包 sudo yum install -y gcc make kernel-devel-$(uname -r) kernel-headers-$(uname -r) # 步骤2:修复软链接 sudo ln -sfn /usr/src/kernels/$(uname -r) /usr/src/linux # 步骤3:重新编译驱动 cd /path/to/driver/src make clean && make sudo make install

💡 重要提示
若仍报错,请检查:

  1. 内核版本是否完全一致(包含次版本号,如3.10.0-1160.xx.x )
  2. 系统是否更新后未重启(需重启使新内核生效)
  3. Secure Boot是否禁用(部分驱动需关闭安全启动)

此问题90%由内核开发包版本不匹配软链接路径错误导致(综合12718)。如遇特殊情况,可查看具体驱动的common.mk 脚本中定义的路径规则。