lspci 收集信息的常用命令

lspci -tv
lspci -xxx
lspci -vvv

lspci -tv

[longyu@debian-10:08:24:24] tmp $ lspci -tv
-[0000:00]-+-00.0  Intel Corporation Device 3e34+-02.0  Intel Corporation UHD Graphics 620 (Whiskey Lake)+-04.0  Intel Corporation Skylake Processor Thermal Subsystem+-12.0  Intel Corporation Cannon Point-LP Thermal Controller+-14.0  Intel Corporation Cannon Point-LP USB 3.1 xHCI Controller+-14.2  Intel Corporation Cannon Point-LP Shared SRAM+-14.3  Intel Corporation Cannon Point-LP CNVi [Wireless-AC]+-14.5  Intel Corporation Device 9df5+-15.0  Intel Corporation Device 9de8+-15.1  Intel Corporation Device 9de9+-16.0  Intel Corporation Cannon Point-LP MEI Controller+-17.0  Intel Corporation Cannon Point-LP SATA Controller [AHCI Mode]+-1d.0-[01]----00.0  Realtek Semiconductor Co., Ltd. RTL8111/8168/8411 PCI Express Gigabit Ethernet Controller+-1d.4-[02]----00.0  Sandisk Corp WD Black 2018/PC SN520 NVMe SSD+-1f.0  Intel Corporation Cannon Point-LP LPC Controller+-1f.3  Intel Corporation Cannon Point-LP High Definition Audio Controller+-1f.4  Intel Corporation Cannon Point-LP SMBus Controller\-1f.5  Intel Corporation Cannon Point-LP SPI Controller

此命令输出 pci 结构简略树状图。

lspci -xxx

[longyu@debian-10:08:25:51] tmp $ lspci -xxx
00:00.0 Host bridge: Intel Corporation Device 3e34 (rev 0b)
00: 86 80 34 3e 06 00 90 20 0b 00 00 06 00 00 00 00
10: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
20: 00 00 00 00 00 00 00 00 00 00 00 00 3c 10 a5 85
30: 00 00 00 00 e0 00 00 00 00 00 00 00 00 00 00 00

此命令输出 16 进制形式显示的 pci 配置空间 dump 数据。

lspci -vvv

[root@debian-10:08:26:12] tmp # lspci -vvv
00:00.0 Host bridge: Intel Corporation Device 3e34 (rev 0b)Subsystem: Hewlett-Packard Company Device 85a5Control: I/O- Mem+ BusMaster+ SpecCycle- MemWINV- VGASnoop- ParErr- Stepping- SERR- FastB2B- DisINTx-Status: Cap+ 66MHz- UDF- FastB2B+ ParErr- DEVSEL=fast >TAbort- <TAbort- <MAbort+ >SERR- <PERR- INTx-Latency: 0Capabilities: [e0] Vendor Specific Information: Len=10 <?>
.........

此命令显示详细的 pci 信息,这些信息都是通过读取 pci 设备在 /sys 目录下的 config 配置完成的。

lspci 命令的原理

1. 扫描 /sys/bus/pci/devices/ 目录,获取每个 pci 设备信息

................
152 openat(AT_FDCWD, "/sys/bus/pci/devices/0000:00:17.0/irq", O_RDONLY) = 4
153 read(4, "127\n", 1024)                  = 4
154 close(4)                                = 0
155 openat(AT_FDCWD, "/sys/bus/pci/devices/0000:00:17.0/vendor", O_RDONLY) = 4
156 read(4, "0x8086\n", 1024)               = 7
157 close(4)                                = 0
158 openat(AT_FDCWD, "/sys/bus/pci/devices/0000:00:17.0/device", O_RDONLY) = 4
159 read(4, "0x9dd3\n", 1024)               = 7
160 close(4)                                = 0
161 openat(AT_FDCWD, "/sys/bus/pci/devices/0000:00:17.0/class", O_RDONLY) = 4
162 read(4, "0x010601\n", 1024)             = 9
163 close(4)                                = 0
164 openat(AT_FDCWD, "/sys/bus/pci/devices/0000:00:15.1/resource", O_RDONLY) = 4
165 fstat(4, {st_mode=S_IFREG|0444, st_size=4096, ...}) = 0
166 read(4, "0x000000400010f000 0x00000040001"..., 4096) = 741
..............

读取了如下几个文件内容:

  1. irq
  2. vendor
  3. device
  4. class
  5. resource
    lspci 执行过程中对上述五种文件内容外加 config 文件内容首先读取然后格式化输出。

2. 读取每个 pci 设备的 config 文件,处理后输出

lspci 的一些显示依赖 pci 设备配置空间的内容,这通过读取 /sys/bus/pci/device/ pci 设备子目录中的 config 文件来完成,示例过程如下:

.............
470 openat(AT_FDCWD, "/sys/bus/pci/devices/0000:00:1f.4/config", O_RDONLY) = 3
471 pread64(3, "\206\200\243\235\3\0\200\2\21\0\5\f\0\0\0\0\4\300\20\0@\0\0\0\0\0\0\0\0\0\0\0"..., 64, 0) = 64
472 close(3)                                = 0
473 openat(AT_FDCWD, "/sys/bus/pci/devices/0000:00:14.0/config", O_RDONLY) = 3
474 pread64(3, "\206\200\355\235\6\4\220\2\0210\3\f\0\0\200\0\4\0 \301\0\0\0\0\0\0\0\0\0\0\0\0"..., 64, 0) = 64
475 close(3)                                = 0
....................

3. 使用 vendor id 与 device id 检索数据库以获取 pci 设备对应的英文名称字符串

lspci 执行时一般会显示用户易理解的字符串来表示设备的类型,示例内容如下:

00:00.0 Host bridge: Intel Corporation Device 3e34 (rev 0b)
00:02.0 VGA compatible controller: Intel Corporation UHD Graphics 620 (Whiskey Lake)

这些字符串与 vendor id 及 device id 的对应关系默认在 /usr/share/pci.ids.gz 中存放,lspci 需要解压此文件,然后通过 pci 的 vendor id 与 device id 在其中匹配,匹配到后则输出用户易理解的字符串描述 pci 设备。

当 /usr/share/pci.ids.gz 不存在时 lspci 依次尝试如下文件:

  1. /usr/share/misc/pci.ids
  2. /home/xxx/.pciids-cache
  3. 不同目录中的 hwdb.bin 文件

示例过程如下:

openat(AT_FDCWD, "/usr/share/misc/pci.ids.gz", O_RDONLY) = -1 ENOENT (没有那个文件或目录)
openat(AT_FDCWD, "/usr/share/misc/pci.ids", O_RDONLY) = 4
openat(AT_FDCWD, "/etc/nsswitch.conf", O_RDONLY|O_CLOEXEC) = 4
openat(AT_FDCWD, "/etc/ld.so.cache", O_RDONLY|O_CLOEXEC) = 4
openat(AT_FDCWD, "/lib/x86_64-linux-gnu/libnss_files.so.2", O_RDONLY|O_CLOEXEC) = 4
openat(AT_FDCWD, "/etc/passwd", O_RDONLY|O_CLOEXEC) = 4
openat(AT_FDCWD, "/home/longyu/.pciids-cache", O_RDONLY) = -1 ENOENT (没有那个文件或目录)
openat(AT_FDCWD, "/etc/systemd/hwdb/hwdb.bin", O_RDONLY|O_CLOEXEC) = -1 ENOENT (没有那个文件或目录)
openat(AT_FDCWD, "/etc/udev/hwdb.bin", O_RDONLY|O_CLOEXEC) = -1 ENOENT (没有那个文件或目录)
openat(AT_FDCWD, "/usr/lib/systemd/hwdb/hwdb.bin", O_RDONLY|O_CLOEXEC) = -1 ENOENT (没有那个文件或目录)
openat(AT_FDCWD, "/lib/systemd/hwdb/hwdb.bin", O_RDONLY|O_CLOEXEC) = -1 ENOENT (没有那个文件或目录)
openat(AT_FDCWD, "/lib/udev/hwdb.bin", O_RDONLY|O_CLOEXEC) = 4

lspci 常用命令及其实现原理简述相关推荐

  1. Nmap常用命令及扫描原理

    Nmap常用参数 -sS TCP SYN扫描 -sU UDP扫描 -sA ACK扫描 -sW 窗口扫描 –scanflags RSTSYNFIN 自定义扫描 -O 检测目标操作系统类型 -sV 检测目 ...

  2. apt-get常用命令及工作原理

    https://blog.csdn.net/mosquito_zm/article/details/63684608 转载于:https://www.cnblogs.com/diyunpeng/p/9 ...

  3. ADB原理,Wi-Fi连接,常用命令及拓展

    Android 开发笔记 onGithub 文章多处链接需要科学上网 本文按顺序主要讲解了ADB的原理,使用Wi-Fi连接设备,ADB常用命令,在Java代码中执行shell命令,使用ddmlib进行 ...

  4. cdh mysql sqoop 驱动_大数据技术之Sqoop学习——原理、安装、使用案例、常用命令...

    第1章 Sqoop 简介 Sqoop 是一款开源的工具,主要用于在 Hadoop(Hive) 与传统的数据库 (mysql,postgresql,...) 间进行数据的高校传递,可以将一个关系型数据库 ...

  5. Android ADB原理及常用命令

    Android调试桥(ADB, Android Debug Bridge)是一个Android命令行工具,包含在SDK 平台工具包中,adb可以用于连接Android设备,或者模拟器,实现对设备的控制 ...

  6. Nginx系列1: 正向代理和反向代理、Nginx工作原理、Nginx常用命令和升级、搭建Nginx负载均衡

    一.什么是正向代理.什么是反向代理 1. 正向代理,意思是一个位于客户端和原始服务器(origin server)之间的服务器,为了从原始服务器取得内容,客户端向代理发送一个请求并指定目标(原始服务器 ...

  7. 微机原理与接口技术 汇编语言程序设计DOS常用命令

    OS(磁盘操作系统)命令,是DOS操作系统的命令,是一种面向磁盘的操作命令,主要包括目录操作类命令.磁盘操作类命令.文件操作类命令和其它命令. 使用技巧 DOS命令不区分大小写,比如C盘的Progra ...

  8. docker配置阿里云镜像加速、镜像和容器常用命令、docker镜像原理

    6. Docker 配置阿里镜像加速服务 6.1 docker 运行流程 6.2 docker配置阿里云镜像加速 查看自己的镜像加速地址(链接直达):https://cr.console.aliyun ...

  9. 【基础技术】【adb命令】adb原理与常用命令使用示例

    目录 1 adb是什么 1.1 adb组成 1.2 adb运行原理 2 adb常用命令 2.1 adb基础语法 2.2 常用命令 2.3 模拟按键输入 2.4 无线连接 2.5 dumpsys使用 2 ...

最新文章

  1. linux mysql 5.7.12_Linux环境mysql5.7.12安装教程
  2. JSP显示页面和数据库乱码
  3. 连接oracle内存溢出,Linux主机内存溢出导致oracle的SYS用户无法正常登陆
  4. [python应用案例] 一.BeautifulSoup爬取天气信息并发送至QQ邮箱
  5. oracle.01081 cannot,ORA-01081: cannot start already-running ORACLE - shut it down first
  6. 选定内容没有属性页_宣传单页的效果和作用
  7. 已知前序(先序)与中序输出后序
  8. 迁入阿里云后:解决了一个IIS动态内容压缩的问题
  9. 给IT人的15点建议:苦逼程序员的辛酸反省与总结
  10. 删缓存,数据库更新谁先执行,及延时双删
  11. 如何批量查询ip地址归属地等信息?
  12. H264___DCT蝶形算法____理解
  13. BasicVSR++: Improving Video Super-Resolution with Enhanced Propagation and Alignment阅读笔记
  14. 部分无法打开的pdf文件处理方法
  15. SQL Server之——SQL Server 2005 sa 登录失败,该用户与可信SQL Server连接无关联
  16. 对比PAYPAL和国际信用卡支付的流程
  17. 分享几个DJ网站音乐下载站
  18. 新华三(H3C)的沉浮往事
  19. win7查找计算机图片,如何在 win7电脑上查看 HEIC 照片的内容?
  20. js中every用法_详解JavaScript中的every()方法

热门文章

  1. TouchDesigner 之 幻影之星
  2. C++异常 和 SEH异常 的一点小结
  3. Spark Parquet使用
  4. 基于JAVA房屋租赁平台计算机毕业设计源码+系统+数据库+lw文档+部署
  5. 流程图规范(国家、ISO标准)
  6. 论文笔记:Highly accurate protein structure prediction with AlphaFold (AlphaFold 2 appendix)
  7. zz一个研究生毕业以后的人生规划(转自天涯虚拟社区)
  8. 接口设计中,如何封装对json格式的数据签名
  9. SVN客户端安装及使用说明
  10. Kylin(二)安装使用