DPDK创建kni设备

2023-12-19 10:32
文章标签 创建 设备 dpdk kni

本文主要是介绍DPDK创建kni设备,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

DPDK的内核kni驱动程序,在初始化函数kni_init中注册kni设备的时候,使用miscdevice结构的定义kni_misc,其没有明确的指定kni设备的次设备号,使用宏定义MISC_DYNAMIC_MINOR,表示由系统自动分配。misc类型设备的主设备号固定为10(宏MISC_MAJOR)。

#define KNI_DEVICE "kni"static struct miscdevice kni_misc = {.minor = MISC_DYNAMIC_MINOR,.name = KNI_DEVICE,.fops = &kni_fops,
};static int __init kni_init(void)
{rc = misc_register(&kni_misc);
}

如下misc设备注册函数misc_register所示,其在全局的misc_minors位图中查找一个未使用的值为0的比特位,有一点要注意的是,最终找到的位所在位图中的位置要小于64(DYNAMIC_MINORS),即动态分配的misc设备的次设备号满足小于64的条件。次设备号等于(DYNAMIC_MINORS - i - 1),表明动态分配的次设备号有最大值开始,所以第一个分配出去的动态次设备号为63。

#define DYNAMIC_MINORS 64 /* like dynamic majors */
static DECLARE_BITMAP(misc_minors, DYNAMIC_MINORS);int misc_register(struct miscdevice * misc)
{if (misc->minor == MISC_DYNAMIC_MINOR) {int i = find_first_zero_bit(misc_minors, DYNAMIC_MINORS);if (i >= DYNAMIC_MINORS) {mutex_unlock(&misc_mtx);return -EBUSY;}misc->minor = DYNAMIC_MINORS - i - 1;set_bit(i, misc_minors);

如下为ubuntu系统的/dev目录,最大的动态次设备号63被设备vga_arbiter使用。

$ ls -l /dev | awk /10,/
crw-------  1 root root     10,  56 May 19 18:35 cpu_dma_latency
crw-------  1 root root     10,  58 May 19 18:35 tgt
crw-------  1 root root     10,  63 May 19 18:35 vga_arbiter
crw-------  1 root root     10,  55 May 19 18:35 network_latency
crw-------  1 root root     10,  54 May 19 18:35 network_throughput

或者通过PROC系统文件misc的内容查看,次设备号为57的kni设备,没有出现在/dev目录下。

/ # cat /proc/misc54 network_throughput55 network_latency56 cpu_dma_latency57 kni58 tgt63 vga_arbiter
/ # 

在dpdk-19.02/lib/librte_kni目录下的文件rte_kni.c中, KNI模块初始化函数中需要打开/dev/kni设备,并且所以使用kni功能的地方都需要访问此设备。

int rte_kni_init(unsigned int max_kni_ifaces __rte_unused)
{/* Check FD and open */if (kni_fd < 0) {kni_fd = open("/dev/" KNI_DEVICE, O_RDWR);if (kni_fd < 0) {RTE_LOG(ERR, KNI, "Can not open /dev/%s\n", KNI_DEVICE);return -1;}        }    return 0;
}

通常情况下,系统的udev服务程序,例如ubuntu中的systemd-udevd,会自动创建此设备节点。  

但是,如本系统所示情况,就需要通过手动方式创建此设备节点:

$ 
$ sudo mknod kni c 10 57
$ 

或者通过重新挂载设备文件系统,或可解决此问题,没有测试。

$ mount -t devtmpfs devtmpfs /dev

 

END

 

这篇关于DPDK创建kni设备的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/511851

相关文章

Python中使用uv创建环境及原理举例详解

《Python中使用uv创建环境及原理举例详解》uv是Astral团队开发的高性能Python工具,整合包管理、虚拟环境、Python版本控制等功能,:本文主要介绍Python中使用uv创建环境及... 目录一、uv工具简介核心特点:二、安装uv1. 通过pip安装2. 通过脚本安装验证安装:配置镜像源(可

Java中实现线程的创建和启动的方法

《Java中实现线程的创建和启动的方法》在Java中,实现线程的创建和启动是两个不同但紧密相关的概念,理解为什么要启动线程(调用start()方法)而非直接调用run()方法,是掌握多线程编程的关键,... 目录1. 线程的生命周期2. start() vs run() 的本质区别3. 为什么必须通过 st

Macos创建python虚拟环境的详细步骤教学

《Macos创建python虚拟环境的详细步骤教学》在macOS上创建Python虚拟环境主要通过Python内置的venv模块实现,也可使用第三方工具如virtualenv,下面小编来和大家简单聊聊... 目录一、使用 python 内置 venv 模块(推荐)二、使用 virtualenv(兼容旧版 P

Linux lvm实例之如何创建一个专用于MySQL数据存储的LVM卷组

《Linuxlvm实例之如何创建一个专用于MySQL数据存储的LVM卷组》:本文主要介绍使用Linux创建一个专用于MySQL数据存储的LVM卷组的实例,具有很好的参考价值,希望对大家有所帮助,... 目录在Centos 7上创建卷China编程组并配置mysql数据目录1. 检查现有磁盘2. 创建物理卷3. 创

Android与iOS设备MAC地址生成原理及Java实现详解

《Android与iOS设备MAC地址生成原理及Java实现详解》在无线网络通信中,MAC(MediaAccessControl)地址是设备的唯一网络标识符,本文主要介绍了Android与iOS设备M... 目录引言1. MAC地址基础1.1 MAC地址的组成1.2 MAC地址的分类2. android与I

Java 如何创建和使用ExecutorService

《Java如何创建和使用ExecutorService》ExecutorService是Java中用来管理和执行多线程任务的一种高级工具,可以有效地管理线程的生命周期和任务的执行过程,特别是在需要处... 目录一、什么是ExecutorService?二、ExecutorService的核心功能三、如何创建

嵌入式Linux之使用设备树驱动GPIO的实现方式

《嵌入式Linux之使用设备树驱动GPIO的实现方式》:本文主要介绍嵌入式Linux之使用设备树驱动GPIO的实现方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐... 目录一、设备树配置1.1 添加 pinctrl 节点1.2 添加 LED 设备节点二、编写驱动程序2.1

使用Python创建一个功能完整的Windows风格计算器程序

《使用Python创建一个功能完整的Windows风格计算器程序》:本文主要介绍如何使用Python和Tkinter创建一个功能完整的Windows风格计算器程序,包括基本运算、高级科学计算(如三... 目录python实现Windows系统计算器程序(含高级功能)1. 使用Tkinter实现基础计算器2.

CentOS和Ubuntu系统使用shell脚本创建用户和设置密码

《CentOS和Ubuntu系统使用shell脚本创建用户和设置密码》在Linux系统中,你可以使用useradd命令来创建新用户,使用echo和chpasswd命令来设置密码,本文写了一个shell... 在linux系统中,你可以使用useradd命令来创建新用户,使用echo和chpasswd命令来设

使用Python和Pyecharts创建交互式地图

《使用Python和Pyecharts创建交互式地图》在数据可视化领域,创建交互式地图是一种强大的方式,可以使受众能够以引人入胜且信息丰富的方式探索地理数据,下面我们看看如何使用Python和Pyec... 目录简介Pyecharts 简介创建上海地图代码说明运行结果总结简介在数据可视化领域,创建交互式地