如何检查Linux内核是否支持我的系统设备

时间:2020-03-05 15:26:08  来源:igfitidea点击:

内核如何支持设备及其驱动程序。

查找网络设备的名称

以下是与网络设备关联的名称。
注意:LO是Loopback设备名称,它不添加到任何网络设备。

bobbin@theitroad:~$ls /sys/class/net/
eth0 eth1 lo
bobbin@theitroad:~$

查找添加到上面名称的设备

我们可以看到eth0与IP地址设置并使用Rx/Tx值活动。
它使用具有1500 MTU尺寸的标准帧。

bobbin@theitroad:~$ifconfig -a
eth0 Link encap:Ethernet HWaddr 08:00:27:1d:20:09
inet addr:10.0.3.17 Bcast:10.0.3.255 Mask:255.255.255.0
inet6 addr: fe80::a00:27ff:fe1d:2009/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:124 errors:0 dropped:0 overruns:0 frame:0
TX packets:177 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:33456 (33.4 KB) TX bytes:19854 (19.8 KB)
eth1 Link encap:Ethernet HWaddr 08:00:27:e7:1d:7f
inet6 addr: fe80::a00:27ff:fee7:1d7f/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:0 errors:0 dropped:0 overruns:0 frame:0
TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:0 (0.0 B) TX bytes:0 (0.0 B)
lo Link encap:Local Loopback
inet addr:127.0.0.1 Mask:255.0.0.0
inet6 addr: ::1/128 Scope:Host
UP LOOPBACK RUNNING MTU:65536 Metric:1
RX packets:100 errors:0 dropped:0 overruns:0 frame:0
TX packets:100 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:7864 (7.8 KB) TX bytes:7864 (7.8 KB)
bobbin@theitroad:~$

找到哪些模块支持eth0

哪个司机正在控制eth0设备?
以下输出显示E1000驱动程序正在控制ETH0网卡。

bobbin@theitroad:/$ls /sys/class/net/eth0/device/driver/module/drivers/
pci:e1000
bobbin@theitroad:/$

查找添加到服务器的以太网PCI设备

我们可以从以下输出中看到,服务器上有两个英特尔网卡,具有修订版02. LSPCI命令输出的前几位显示此设备的PCI总线ID,即00:03.0和00:08.0

bobbin@theitroad:~$lspci | grep -i Ethernet
00:03.0 Ethernet controller: Intel Corporation 82540EM Gigabit Ethernet Controller (rev 02)
00:08.0 Ethernet controller: Intel Corporation 82540EM Gigabit Ethernet Controller (rev 02)
bobbin@theitroad:~$

进入/SYS/BUS/PCI /设备/列出所有不同的PCI设备,

bobbin@theitroad:~$cd /sys/bus/pci/devices/
bobbin@theitroad:/sys/bus/pci/devices$ls
0000:00:00.0 0000:00:02.0 0000:00:05.0 0000:00:08.0
0000:00:01.0 0000:00:03.0 0000:00:06.0 0000:00:0d.0
0000:00:01.1 0000:00:04.0 0000:00:07.0
bobbin@theitroad:/sys/bus/pci/devices$

具有前导0000的内核编号PCI设备:在LSPCI程序的输出中不会出现。
因此,将前导0000添加到使用LSPCI并进入该目录中找到的数字。

bobbin@theitroad:/sys/bus/pci/devices$cd 0000:00:03.0
bobbin@theitroad:/sys/bus/pci/devices/0000:00:03.0$ls
broken_parity_status driver net resource2
class enable power subsystem
config irq remove subsystem_device
consistent_dma_mask_bits local_cpulist rescan subsystem_vendor
d3cold_allowed local_cpus reset uevent
device modalias resource vendor
dma_mask_bits msi_bus resource0
bobbin@theitroad:/sys/bus/pci/devices/0000:00:03.0$

在此目录中,我们可以找到供应商和设备文件名

bobbin@theitroad:/sys/bus/pci/devices/0000:00:03.0$cat vendor
0x8086
bobbin@theitroad:/sys/bus/pci/devices/0000:00:03.0$cat device
0x100e
bobbin@theitroad:/sys/bus/pci/devices/0000:00:03.0$

内核使用这些值正确地将驱动程序与设备匹配.PCI驱动程序告诉内核,其中供应商和设备ID它们将支持,以便内核知道如何将驱动程序绑定到正确的设备。

找到内核和驱动程序支持

搜索供应商和设备ID的内核源文件

bobbin@theitroad:/usr/src/linux-headers-3.8.0-29$grep -i 0x8086 include/linux/pci_ids.h
#define PCI_VENDOR_ID_INTEL 0x8086
bobbin@theitroad:/usr/src/linux-headers-3.8.0-29$
bobbin@theitroad:/usr/src/linux-headers-3.8.0-29$grep -i 0x100e include/linux/pci_ids.h
#define 0x100e
bobbin@theitroad:/usr/src/linux-headers-3.8.0-29$

现在在"PCI_VENDOR_ID_INTEL"中搜索驱动程序源文件。
现在,我们需要查找驱动程序的关注C文件,并在文件中查看

bobbin@theitroad:/usr/src/linux-source-3.2.0/drivers/net$grep -Rl PCI_VENDOR_ID_INTEL *
can/pch_can.c
ethernet/dec/tulip/tulip_core.c
ethernet/oki-semi/pch_gbe/pch_gbe_main.c
ethernet/broadcom/tg3.c
ethernet/intel/e100.c
ethernet/intel/e1000/e1000_main.c
ethernet/intel/e1000/e1000.h
irda/smsc-ircc2.c
wireless/iwlegacy/iwl-core.h
wireless/iwlwifi/iwl-pci.c
wireless/ipw2x00/ipw2100.c
wireless/ipw2x00/ipw2200.c
wireless/rtlwifi/pci.c
bobbin@theitroad:/usr/src/linux-source-3.2.0/drivers/net$
bobbin@theitroad:/usr/src/linux-source-3.2.0/drivers/net/ethernet/intel$cat e1000_main.c | more
* {PCI_DEVICE(PCI_VENDOR_ID_INTEL, device_id)}
*/
static DEFINE_PCI_DEVICE_TABLE(e1000_pci_tbl) = {
INTEL_E1000_ETHERNET_DEVICE(0x1000),
INTEL_E1000_ETHERNET_DEVICE(0x1001),
INTEL_E1000_ETHERNET_DEVICE(0x1004),
INTEL_E1000_ETHERNET_DEVICE(0x1008),
INTEL_E1000_ETHERNET_DEVICE(0x1009),
INTEL_E1000_ETHERNET_DEVICE(0x100C),
INTEL_E1000_ETHERNET_DEVICE(0x100D),
INTEL_E1000_ETHERNET_DEVICE(0x100E),
INTEL_E1000_ETHERNET_DEVICE(0x100F),
INTEL_E1000_ETHERNET_DEVICE(0x1010),
INTEL_E1000_ETHERNET_DEVICE(0x1011),
INTEL_E1000_ETHERNET_DEVICE(0x1012),
INTEL_E1000_ETHERNET_DEVICE(0x1013),
INTEL_E1000_ETHERNET_DEVICE(0x1014),

所有PCI驱动程序都包含它们支持的不同设备的列表。
列表包含在define_pci_device_table表中的静态定义中,就像这个一样。
这就是我们需要查看的东西,以确定此驱动程序是否支持我们的设备。
在我们的情况下,供应商值和设备ID匹配,因此此驱动程序将能够支持我们的设备。