DPU上查看mst status报错MST PCI module is not loaded处理办法?如何安装mft和kernel mft?(mst start、status、stop)

快速回忆要点

  • 2个内核模块:mst_pci, mst_pciconf
  • 3个命令:mst start、mst status、mst stop。这三个命令围绕提供mst的服务,提供前端后端的能力。
  • mst本质是提供一条通道,走pcie,提供用户态命令,内核驱动,以及网卡端提供对应的处理消息处理模块进行操作。
  • mst需要start才会加载对应module,以及告知网卡将会做相关处理,相当于是这个功能的开关。

相关命令:

mst start
mst status
modprobe mst_pci #加载mst_pci
mst stop

报错

MST modules:
------------
    MST PCI module is not loaded
    MST PCI configuration module loaded

在这里插入图片描述

分析与解决办法

查看原因

原因是没有加载mst的相关内核driver。
查看方式:

lsmod |grep -i mst

看到只有mst_pciconf,没有mst_pci
在这里插入图片描述

加载mst依赖的ko

使用modprobe自动加载mst_pci,如果系统没有需要单独编译

modprobe mst_pci

再次查看lsmod:可以看到已经加载
在这里插入图片描述

再次执行mst status查看

在这里插入图片描述

注意

  • mst_pci默认不会加载,mst start后注意查看status是否启动

原理解析

  • 因为mst是操作通过pcie接入主机的网卡,所以mst提供内mst_pci和mst_pciconf的内核模块用来操作pcie总线,进而和网卡通信。就好比嵌入式的i2c操作设备,只是i2c是标准接口不用单独加载驱动。
  • mst start会自动加载mst_pci和mst_pciconf,可以在加载前查看lsmod |grep mst
  • mst stop会自动卸载mst_pci和mst_pciconf,可以在stop前后查看lsmod |grep mst
    比如:可以看到stop前后mst的module被卸载了。
    在这里插入图片描述

要点

  • 2个内核模块:mst_pci, mst_pciconf
  • 3个命令:mst start、mst status、mst stop。这三个命令围绕提供mst的服务,提供前端后端的能力。
  • mst本质是提供一条通道,走pcie,提供用户态命令,内核驱动,以及网卡端提供对应的处理消息处理模块进行操作。
  • mst需要start才会加载对应module,以及告知网卡将会做相关处理,相当于是这个功能的开关。

–2024-10-09 增加–

如果modprobe找不到解决办法

modprobe报错:

modprobe: FATAL: Module mst_pci not found in directory /lib/modules/4.18.0-553.22.1.0.1.an8.x86_64

可以看到modprobe后还是没有。
在这里插入图片描述

这是因为没有安装内核模块,内核模块是在lkernel-mft里面。
mst隶属于mft,mft除了四大金刚,在软件形态上是一个用户态库和内核态共同运行。

分析

可以看到只有用户态mft,没有安装kernel-mft。kernel-mft提供了ko的支持,mft工具通过pcie通路和底层通信。kernel-mft提供类似封装PCIe TLP报文的能力。
更多参考mft的介绍:
https://docs.nvidia.com/networking/display/mftv4290/user+manual
在这里插入图片描述

解决办法

下载最新版mft工具

https://network.nvidia.com/products/adapter-software/firmware-tools/
根据OS和arch选择代码下载并上传到服务器。
在这里插入图片描述

解压并且根据提示安装

解压后可以看到有mft的多个用户态包和kernel mft。并且还有一些安装脚本,这些rpm包不要手动一个个安装,使用标准安装。安装前使用他自带的脚本处理,先卸载原来的,然后安装新的。
在这里插入图片描述
安装:

./old-mft-uninstall.sh  #卸载原来的
./install.sh  #安装新的

在这里插入图片描述

安装后确认安装成功

mst status可以看到依然没有mst device,需要使用mst start启动后便可看见。(mst本质是网卡和host的PCIe管理通道)

mst status
mst start

在这里插入图片描述

综述

这个问题困扰了我一两年,总是有的服务器可以有的不可以。不可以可能是因为没有kernel-mft,也可能是因为版本不匹配。包括mft和fw,mft和kernel-mft。创建mst之后,就建立了一个通过专门的PCIe管理链路来通信,而不仅仅是通过pcie的busid。那么什么时候非他不可呢?比如pcie的busid 用flint升级因为DPU异常busid不可用,便可以用mstdev来处理。

<think> 我们正在处理一个关于MCU8086汇编语言的问题。用户提到语句'DB 100 DPU(?)'报错,需要分析原因并提供解决方案。 首先,我们需要理解'DB'指令在8086汇编中的含义。'DB'是定义字节(Define Byte)的伪指令,用于在内存中分配一个或多个字节,并可以初始化这些字节的值。 在8086汇编中,'DB'指令的常见语法格式为: DB [表达式或数据列表] 表达式或数据列表可以是: - 单个字节值(例如:DB 10) - 多个字节值(例如:DB 10, 20, 30) - 字符串(例如:DB 'Hello') - 问号(?)表示未初始化的字节(例如:DB ? 或 DB 5 DUP(?)) 用户给出的语句是:'DB 100 DPU(?)' 这个语句看起来有问题。让我们分解一下: - 'DB'是伪指令。 - '100':可能表示一个数值(十进制100)。 - 'DPU':这看起来像是一个标识符,但在这里的上下文中,它不符合'DB'指令的语法。 - '(?)':注意,用户输入的是全角括号问号,而在汇编语言中,通常使用半角符号。标准的未初始化字节使用半角问号(?)表示,并且通常不会用括号括起来。 因此,报错的原因可能是语法错误。具体分析如下: 1. **'DPU'不被识别**:在'DB'指令中,在数值100之后出现'DPU',这可能是用户想要使用重复定义(DUP)操作符,但是错误地写成了'DPU'。正确的重复操作符是'DUP'(Duplicate的缩写)。 2. **括号使用错误**:用户使用了全角括号'('')',而汇编语言要求使用半角括号'('')'。 3. **重复操作符的语法**:如果要定义多个相同的值,应使用DUP操作符。例如,定义100个未初始化的字节,正确的写法是:`DB 100 DUP (?)`。 所以,用户可能原本想写的是:`DB 100 DUP (?)`,但是误写成了'DPU',并且使用了全角括号。 **报错原因总结**: - 使用了错误的标识符'DPU',应为'DUP'。 - 使用了全角括号'('')',应改为半角括号'('')'。 **解决方案**: 将语句修改为:`DB 100 DUP (?)` 解释: - `100`:表示重复的次数。 - `DUP`:重复操作符。 - `(?)`:表示每个字节都是未初始化的(即不指定初始值,通常汇编器会将其分配到未初始化的数据段,如.bss段)。 另外,还需要注意: - 在汇编语言中,标识符(如DUP)是大小写不敏感的,所以'DUP'可以写成'dup'、'Dup'等,但必须拼写正确。 - 括号必须使用半角。 因此,正确的语句应该是:`DB 100 DUP (?)` 这个语句的含义是:分配100个未初始化的字节。 如果用户想要初始化这些字节,可以在括号内指定初始值。例如,初始化为0:`DB 100 DUP (0)`。 最后,提醒用户在汇编语言中要使用半角符号,并注意指令操作符的正确拼写。 相关问题: 1. 在8086汇编中,DB伪指令还有哪些常见用法? 2. 除了DB,还有哪些定义数据的伪指令? 3. 如何定义字符串数组? </think> ### MCU8086 中 `DB 100 DPU(?)` 语句报错分析 #### 报错原因: 1. **操作符拼写错误** `DPU` 应为 `DUP`(Duplicate 的缩写)。在 8086 汇编中,`DUP` 用于重复定义数据,而 `DPU` 是无效操作符[^1]。 2. **括号格式错误** 语句中使用了中文全角括号 `( )`,汇编语言要求 **半角括号** `( )`。全角括号会被识别为非法字符[^2]。 3. **语法结构错误** 正确语法应为: `DB [数量] DUP (初始值)` 而 `100 DPU(?)` 不符合该结构(缺少 `DUP` 后的括号合法初始值)。 #### 解决方案: 1. **修正操作符括号** 将语句改为: ```assembly DB 100 DUP (?) ; 分配 100 个未初始化字节 ``` - `DUP` 代替 `DPU` - 半角 `(?)` 代替 `(?)` - `?` 表示未初始化值 2. **初始化数据的正确写法** 若需初始化特定值(如 0): ```assembly DB 100 DUP (0) ; 分配 100 个字节并初始化为 0 ``` 3. **其他合法变体** ```assembly ; 定义字符串 DB 'Hello, 8086!', '$' ; 定义混合数据 DB 10, 20, 30, 'A', 0FFh ``` #### 验证示例: ```assembly DATA SEGMENT Buffer DB 100 DUP (?) ; 正确写法:100 字节未初始化空间 InitData DB 50 DUP (0) ; 正确写法:50 字节初始化为 0 DATA ENDS ``` > **关键点**:8086 汇编器对符号格式敏感,必须使用半角符号精确关键字。错误通常源于拼写错误或全/半角混淆[^1][^2]。 --- ### 相关问题 1. 8086 汇编中 `DUP` 操作符还能用于哪些数据类型? 2. 如何定义并初始化一个包含字符串数字的混合数组? 3. 汇编语言中全角符号会导致哪些其他常见错误? [^1]: CPU 负责应用程序执行,GPU 处理并行计算,DPU 作为粘合剂处理网络/存储等专用功能。汇编中的操作符需严格匹配硬件规范。 [^2]: 类似 `DPM_execute` 函数的数据有效性检查机制,汇编器在解析指令时也依赖精确的语法匹配
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值