
缘起dpdk_devbind.py
运行dpdk程序之前我们一般都会使用dpdk_devbind.py程序对指定的驱动与设备进行绑定与解绑(如下命令)。那么dpdk_devbind.py程序是如何实现驱动与设备的绑定与解绑的?底层的原理是什么?
dpdk_devbind.py –bind igb_uio eth0
dpdk_devbind.py程序主要做了以下几件事(转为shell命令):
- 为igb_uio驱动添加设备id
echo –n “8086 10f5” > /sys/bus/pci/drivers/igb_uio/new_id
8086为设备厂商号,10f5为设备号。
2. 为设备指定驱动
echo–n“igb_uio”> /sys/bus/pci/devices/0000:02:05.0/driver_override
3. 执行绑定操作,触发驱动probe。
echo –n “0000:02:05.0”>/sys/bus/pci/drivers/igb_uio/bind
4. 执行解绑操作
echo -n“0000:02:05.0”>/sys/bus/pci/drivers/e1000/unbind
“0000:02:05.0”为设备标识(域:总线编号:设备编号:功能号).
1与2只执行一个即可,1是配置驱动,让其支持新的设备。2是配置设备,让其选择驱动。
从以上可知设备驱动的解绑与绑定涉及几个方面:
- 驱动:igb_uio, uio, e1000等
- sysfs,用于用户态与内核态进行通讯。 (new_id, driver_override, bind, unbind)
- 传递的消息:设备ID、设备标识
驱动层动作
sysfs文件系统是一种内存文件系统,它提供了一种方法用于导出内核的数据结构、属性以及两者之间的联系到用户空间。用户空间可以通过修改sysfs中的文件来修改设备的属性值。上诉new_id、driver_override、bind、unbind文件对应igb_uio驱动的各属性值。
接下来我们来看一下dpdk_devbind.py通过 sysfs向驱动发送消息后,驱动层做了什么。
igb_uio模块初始化
如上图所示new_id、driver_override、bind、unbind在橙色框处加入sysfs文件系统。

驱动注册成功后,除了上诉sysfs文件外,其实已经建立起一整套为用户态提供服务的接口。
PCI设备驱动属性定义

PCI设备驱动属性的操作
如上所以new_id 对应的驱动处理函数为store_new_id, bind对应的处理函数为driver_bind,unbind对应的处理函数为driver_unbind。