\-[0000:00]+-01.4-[03]--+-00.0  Intel Corporation I350 Gigabit Network Connection
                   |                   \-00.1  Intel Corporation I350 Gigabit Network Connection

1、手动remove一个pci设备(bus:device.function 3:0.0和3.0.1)

echo 1 > /sys/bus/pci/devices/0000\:03\:00.0/remove

echo 1 > /sys/bus/pci/devices/0000\:03\:00.1/remove

2、手动扫描pci设备

echo 1 > /sys/bus/pci/rescan

这种方法是使用的bus的rescan,会扫描所有的bus。

当然如果想更精确一点,可以使用父设备下的recan来扫描子设备,两者唯一的区别就是通过bus节点扫描会调用pci_find_next_bus把系统中的所有设备都rescan一遍。

下面的方法是使用的devcie的rescan,只是扫描device下级bus上的的设备

echo 1 >/sys/bus/pci/devices/0000\:00\:01.4/rescan

3、源码到底是怎么实现呢?

pci-sysfs.c - drivers/pci/pci-sysfs.c - Linux source code (v5.3) - Bootlin

sys文件系统的函数里面有3个节点device的remove、bus的rescan和devcie的rescan,当你往文件系统写1时就回调attribute的store函数指针:

/* interface for exporting device attributes */
struct device_attribute {struct attribute   attr;ssize_t (*show)(struct device *dev, struct device_attribute *attr,char *buf);ssize_t (*store)(struct device *dev, struct device_attribute *attr,const char *buf, size_t count);
};
 

remove主要是卸载资源和调用driver的remove

下面是通过kprobe打印出来的remove调用栈

<...>-4114  [059] .... 73835.573048: myprobe: (pci_remove_bus_device+0x0/0x100)
            bash-4114  [059] .... 73835.573066: <stack trace>
 => pci_remove_bus_device
 => pci_stop_and_remove_bus_device_locked
 => remove_store------------------入口
 => kernfs_fop_write
 => vfs_write
 => ksys_write
 => do_syscall_64
 => entry_SYSCALL_64_after_hwframe

rescan主要干两件事

(1)分配资源

(2)调用probe

kprobe打印的分配资源的调用栈
            bash-1596  [026] .... 56128.977294: myprobe: (pci_assign_resource+0x0/0x200)
            bash-1596  [026] .... 56128.977296: <stack trace>
 => pci_assign_resource
 => assign_requested_resources_sorted
 => __assign_resources_sorted
 => __pci_bus_assign_resources
 => __pci_bus_assign_resources
 => pci_assign_unassigned_bus_resources
 => pci_rescan_bus
 => rescan_store--------------------入口

 => kernfs_fop_write
 => vfs_write
 => ksys_write
 => do_syscall_64
 => entry_SYSCALL_64_after_hwframe

pci_assign_resource函数调用_pci_assign_resource分配设备需要的resource

分配完毕打印资源情况:pci_info(dev, "BAR %d: assigned %pR\n", resno, res);打印出就是下面的格式

具体实现原理见

kernel中用%pR来打印resource结构体_jason的笔记-CSDN博客

[72131.692082] pci 0000:03:00.0: BAR 0: assigned [mem 0xef600000-0xef61ffff]
[72131.692087] pci 0000:03:00.1: BAR 0: assigned [mem 0xef620000-0xef63ffff]
[72131.692092] pci 0000:03:00.0: BAR 3: assigned [mem 0xef640000-0xef643fff]
[72131.692097] pci 0000:03:00.0: BAR 7: assigned [mem 0x323a0000000-0x323a001ffff 64bit pref]
[72131.692103] pci 0000:03:00.0: BAR 10: assigned [mem 0x323a0020000-0x323a003ffff 64bit pref]
[72131.692108] pci 0000:03:00.1: BAR 3: assigned [mem 0xef644000-0xef647fff]
[72131.692112] pci 0000:03:00.1: BAR 7: assigned [mem 0x323a0040000-0x323a005ffff 64bit pref]
[72131.692118] pci 0000:03:00.1: BAR 10: assigned [mem 0x323a0060000-0x323a007ffff 64bit pref]
[72131.692123] pci 0000:03:00.0: BAR 2: assigned [io  0x1000-0x101f]
[72131.692128] pci 0000:03:00.1: BAR 2: assigned [io  0x1020-0x103f]

kworker/0:2-336   [000] ....  4201.825660: myprobe: (pci_enable_resources+0x0/0x170)
     kworker/0:2-336   [000] ....  4201.825671: <stack trace>
 => pci_enable_resources
 => pcibios_enable_device
 => do_pci_enable_device
 => pci_enable_device_flags
 => igb_probe
 => local_pci_probe
 => work_for_cpu_fn
 => process_one_work
 => worker_thread
 => kthread
 => ret_from_fork

起worker来调用driver probe。

bash-4872  [026] .... 90924.365341: myprobe: (pci_device_probe+0x0/0x1c0)
            bash-4872  [026] .... 90924.365355: <stack trace>
 => pci_device_probe
 => really_probe
 => driver_probe_device
 => bus_for_each_drv
 => __device_attach
 => pci_bus_add_device
 => pci_bus_add_devices
 => pci_bus_add_devices
 => pci_rescan_bus
 => rescan_store--------------------入口

 => kernfs_fop_write
 => vfs_write
 => ksys_write
 => do_syscall_64
 => entry_SYSCALL_64_after_hwframe

【65】如何通过sys文件系统remove和probe一个PCI设备相关推荐

  1. 基于sys文件系统的LED驱动的移植【原创】

    基于RK3188平台LED驱动程序的移植的移植.如有不正确之处,欢迎大家指点. 本文的LED驱动程序不是通过打开设备节点来访问和控制LED的,是通过sys文件系统来控制LED. 板子上有四盏灯以及对应 ...

  2. 使用 /sys 文件系统访问 Linux 内核:比/proc 更为理想的访问内核数据的途径

    使用 /sys 文件系统访问 Linux 内核:比/proc 更为理想的访问内核数据的途径 作者: feng 日期: 2010/12/22发表评论 (0)查看评论 程 任全 (crquan@gmail ...

  3. 使用 /sys 文件系统访问 Linux 内核

    使用 /sys 文件系统访问 Linux 内核 sysfs 虚拟文件系统提供了一种比 proc 更为理想的访问内核数据的途径: 2.6内核要求 sysfs 总是挂载在 /sys 目录上: sysfs ...

  4. uevent 驱动_Linux 内核/sys 文件系统之uevent | 学步园

    在 sysfs 下的很多 kobject 下都有 uevent 属性,它主要用于内核与 udev (自动设备发现程序)之间的一个通信接口:从 udev 本身与内核的通信接口 netlink 协议套接字 ...

  5. 转载:linux驱动层到应用层的重要接口sys文件系统---/sys目录详解

    linux驱动层到应用层的重要接口sys文件系统---/sys目录详解 Linux2.6内核中引入了sysfs文件系统.sysfs文件系统整理的设备驱动的相关文件节点,被视为dev文件系统的替代者.同 ...

  6. Linux sys文件系统

    简述 sys文件系统提供了一个从用户空间通往内核空间的入口,Linux系统中有个sysfs伪文件系统挂载到/sys目录,通过访问这个目录下面的文件,可以获得各种的系统内核信息,例如设备.内核模块.文件 ...

  7. sys文件系统的创建和初始化过程

    在kernal start函数中,创建sys文件系统的函数调用栈: start_kernel >vfs_caches_init >mnt_init >kernfs_init > ...

  8. 什么是sys文件系统

    1. 什么是sysfs sysfs是Linux 内核中设计较新的一种虚拟的基于内存的文件系统,它的作用与 proc 有些类似,但除了与 proc 相同的具有查看和设定内核参数功能之外,还有为 Linu ...

  9. 【30】如何通过pciehp sys文件系统poweron/poweroff对应的slot,及pciehp代码分析

    前言   这篇文章主要是介绍pciehp service在sys文件系统中创建的power节点,以及使用该节点怎么控制对应slot上下电(只能控制到配置空间的slot ctrl reg对应的bit,至 ...

  10. 文件系统(二)—如何设计一个文件系统

    前面一章主要学习了文件系统的存储和分配方式的理论知识,本章接着理论知识,如何设计一个文件系统(本章不涉及任何代码实现),其主要的内容包括如下: 如何一步步设计一个文件系统,了解文件系统由那些组成 当我 ...

最新文章

  1. ASP.NET MVC请求处理管道生命周期的19个关键环节(1-6)
  2. vs2013中的error c4996的问题
  3. CentOS6.2下使用Nokia E72i成功发送短信
  4. SAP Marketing Cloud的双重登录认证
  5. 学习环境配置:Manjaro、MSYS2以及常见软件
  6. 【计算机系统设计】实践笔记(2)插叙:综合与实现
  7. [浏览器]Apple之Safari 5.0.4
  8. 【转】“线程间操作无效: 从不是创建控件的线程访问它”
  9. 我的本科毕业论文——Messar即时通讯系统
  10. android黑域系统文件,优雅地使用安卓手机,黑域免root使用教程
  11. Cocos Creator 3D 摇杆控制器一种简单实现!
  12. 让你搞懂 administrator最高权限
  13. 初中计算机课感悟,初中信息技术课教育随笔
  14. Python交互绘制Julia集
  15. Proxy ARP--即ARP代理
  16. 【深入理解TcaplusDB技术】入门Tcaplus-JDBC开发
  17. 人工智能时代下,Python与C/C++谁将成为人工智能核心算法选择?
  18. Rasa课程、Rasa培训、Rasa面试系列之: Rasa NLU意图和实体-分词器
  19. 软件工程的顶会和顶刊
  20. 着色 Shading,漫反射,高光,环境光,Blinn-Phong 反射模型,Flat Shading,Gouraud Shading,图形管线 Graphics Pipeline渲染总结

热门文章

  1. java判断接口地址是否存在_java.util.Iterator接口中的hashNext()方法是用来判断集合中是否存在下一个元素的()_学小易找答案...
  2. Java电阻计算器(二)
  3. 微信公众号敏感词检测工具
  4. arcgis栅格数据绘制等值线_ArcGIS教程:绘制等值线的工作原理
  5. Python常用模块 之 base64模块
  6. python常用模块之os
  7. RJ45-网口变压器及网口变压器-cpu之间的一些抗干扰防雷设计
  8. win7 桌面html,极品壁纸再一张:Windows7桌面就是我的家
  9. 摄影培训社培训资料(上
  10. 选用什么的域名后缀好