〇  需求

在DPDK程序运行时,希望能够实时的操纵PCI 网卡设备的驱动绑定与解绑。

本文的目的是为了调查满足以上需求的,kernel提供的,标准的API都有几种,分别是什么。以确定实施方案。

一  背景

我们已知有三个方法:

  1. dpdk_devbind.py

  2. driverctl   [administrator][driver] driverctl 是如何在udev上层管理设备驱动的

  3. sysfs

    [knowledge][linux][sysfs] sysfs文件系统

    [dpdk] 读官方文档(2)    这里有个bind/unbind章节。

二  分析

分析driverctl的源码

  driverctl 是一个bash脚本,也是用sysfs实现的。原理如下:

# 加载
> echo pci-stub > /sys/bus/pci/devices/::00.0/driver_override
> echo ::00.0 > /sys/bus/pci/devices/::00.0/driver/unbind
> echo ::00.0 > /sys/bus/pci/drivers_probe
>
# 卸载
> echo > /sys/bus/pci/devices/::00.0/preferred_driver
> echo ::00.0 > /sys/bus/pci/devices/::00.0/driver/unbind
> echo ::00.0 > /sys/bus/pci/drivers_probe
>

分析dpdk_devbind.py的源码

  用lspci配合sysfs实现。

  但是在dpdk-devbind中,做个了一个判断,同时支持新旧两种方式。

  新的方式与 driverctl 的实现相同。

  旧的方式与先前我们在sysfs下的做法一样,用new_id来操作, 如下:

[root@T9 usertools]# echo ::04.0 > /sys/bus/pci/drivers/igb_uio/unbind
[root@T9 usertools]# echo "1af4 1000" > /sys/bus/pci/drivers/virtio-pci/new_id

[root@T9 usertools]# echo "0000:00:04.0" > /sys/bus/pci/drivers/virtio-pci/bind

  根据dpdk-devbind中的注释和邮件列表的patch邮件信息: 新的driver_override方式是kernel version >= 3.15才支持。但是实际调试过程中,我当前在redhat kernel version 3.10的环境里,便已经支持了新的方式了。

  patch: https://patches.linaro.org/patch/27588/

三 结论

1.    以上三种方式是同一套接口,都是通过文件系统对sysfs进行读写操作来实现的。

2.    具体的sysfs操作方法有前文提到的两种。 推荐较新的一种,即通过driver_override.

  https://www.kernel.org/doc/Documentation/ABI/testing/sysfs-bus-platform

[dpdk][sysfs][pci] 在dpdk程序中操纵PCI设备的更多相关文章

  1. 【DPDK】谈谈DPDK如何实现bypass内核的原理 其一 PCI设备与UIO驱动

    [前言] 随着网络的高速发展,对网络的性能要求也越来越高,DPDK框架是目前的一种加速网络IO的解决方案之一,也是最为流行的一套方案.DPDK通过bypass内核协议栈与内核驱动,将驱动的工作从内核态 ...

  2. [中英对照]Introduction to DPDK: Architecture and Principles | DPDK概论: 体系结构与实现原理

    [中英对照]Introduction to DPDK: Architecture and Principles | DPDK概论: 体系结构与实现原理   Introduction to DPDK: ...

  3. VMware上配置DPDK环境并运行实例程序

    1. 在虚拟机VMware上配置环境 VMware安装:http://www.zdfans.com/html/5928.html Ubuntu:https://www.ubuntu.com/downl ...

  4. 错误内存【读书笔记】C程序中常见的内存操作有关的典型编程错误

    题记:写这篇博客要主是加深自己对错误内存的认识和总结实现算法时的一些验经和训教,如果有错误请指出,万分感谢. 对C/C++程序员来讲,内存管理是个不小的挑战,绝对值得慎之又慎,否则让由上万行代码构成的 ...

  5. winform程序中界面的跳转问题

    首先是我们进行窗口间的跳转,尤其注意的是winform程序里面的空间都是中线程安全的.但是注意的是如果你在一个线程中操纵另外的控件,这时候会提示你一个错误,这个错误的解决方法准备单独的在另一篇文章中来 ...

  6. 开发微信小程序中SSL协议的申请、证书绑定、TLS 版本处理等

    在上篇随笔<基于微信小程序的系统开发准备工作>介绍了开发微信小程序的一些前期的架构设计.技术路线 .工具准备等方面内容,本篇随笔继续这个步骤,逐步介绍我们实际开发过程中对SSL协议的申请及 ...

  7. 《Windows核心编程系列》十三谈谈在应用程序中使用虚拟内存

    在应用程序中使用虚拟内存 Windows提供了以下三种机制对内存进行操控: 一:虚拟内存.最适合来管理大型对象数据或大型结构数组. 二:内存映射文件.最适合用来管理大型数据流,以及在同一机 器上运行的 ...

  8. 利用 gnuplot_i 在你的 c 程序中调用 GNUPLOT

    这是一篇非常早曾经写的小文章,最初发表于我的搜狐博客(2008-09-23 22:55).由于自从转移到这里后,sohu 博客就不再维护了,所以把这篇文章也一起挪了过来. GNUPLOT 是一款功能强 ...

  9. 微信小程序中获取高度及设备的方法

    由于js中可以采用操纵dom的方法来获取页面元素的高度,可是在微信小程序中不能操纵dom,经过查找之后发现仅仅只有以下几个方法可以获取到高度 wx.getSystemInfoSync().window ...

随机推荐

  1. 【C#】解析C#中管道流的使用

    目录结构: contents structure [+] 匿名管道(anonymous pipe) 命名管道(named pipe) 管道为进程间通信提供了一种可能.管道分为两种,一种是匿名管道,另一 ...

  2. 数字签名与HTTPS详解

    因为HTTP协议本身存在着明文传输.不能很好的验证通信方的身份和无法验证报文的完整性等一些安全方面的确点,所以才有了HTTPS的缺陷.HTTPS确切的的说不是一种协议,而是HTTP + SSL (TS ...

  3. Asp.Net任务Task和线程Thread

    Task是.NET4.0加入的,跟线程池ThreadPool的功能类似,用Task开启新任务时,会从线程池中调用线程,而Thread每次实例化都会创建一个新的线程.任务(Task)是架构在线程之上的, ...

  4. vue2.0 技巧汇总

    /** * Created by */ export default { trim: (str) => { //删除左右两端的空格 return str.replace(/(^\s*)|(\s* ...

  5. 解决git 不同branch 下node_moudes不同步的问题

    做nodejs开发,或者vue react等开发的同学,在使用git 做版本管理的时候肯定碰到过这个问题. 按常规做法node_modules 肯定是被添加到.gitignore中不需要被提交的 但是 ...

  6. shell 十进制数字转十六进制字符串并将结果保存到变量

    . . . . . 今天写测试脚本的时候需要将生成的十六进制值作为参数传递给某个命令,而循环生成的数值都是十进制的.在网上查了好久也没有找到如何将一个变量中的值进行进制转换,并保存到变量中,网上的办法 ...

  7. JS对象与Dom对象与jQuery对象之间的区别

    前言 通过问题看本质: 举例: js的写法:document.getElementById('save').disabled=true; 在jquery中我是这样写的 $("#save&qu ...

  8. 同时安装anaconda2和anaconda3

    安装的过程请参考 Ubuntu14.04下同时安装Anaconda2与Anaconda3 启动的时候cd到$HOME/anaconda2/envs/py3k/bin下 source activate ...

  9. MTK 音量加减键修改为默认控制媒体音量

    frameworks/base/media/java/android/media/AudioService.java: private int getActiveStreamType(int sugg ...

  10. Python的循环导入问题

    循环导入的最好的解决方法是从架构上优化,即调整模块和模块成员变量的设计.一个好的原则是:可导出的成员变量,都不应该依赖于导入进来的成员变量. 但是在业务开发的过程中,总会遇到通过架构层面解决不了的导入 ...