Обзор PCI в Linux

Как выключить вашу систему Linux Обзоры

Peripheral Component Interconnect или PCI — это протокол, определенный в первые дни вычислений компанией INTEL. Как следует из названия, PCI используется для подключения различных периферийных устройств платформы Linux. Простая блок-схема системы PCI будет выглядеть так:

Обзор PCI в Linux

На приведенном выше рисунке показана система PCI, которая имеет 3 шины PCI. Шина № 0 является основной шиной Системы, поскольку к ней подключен ЦП; кроме того, это шина, на которой присутствует мост корневого порта или корневой комплекс.

Остальные шины, т. Е. Шины № 1 и 2, подключаются к первичной шине с помощью мостов PCI. Шина № 1 подключена к шине № 0 с помощью моста 1. Шина № 2 подключена к шине № 1 с помощью моста № 2. В целом, все устройства подключены, и несколько устройств D1, D2, D3 и т. Д. Присутствуют на разные шины PCI. В любой системе PCI присутствует 3 типа устройств. Корневой порт или сложное устройство, мостовое устройство и конечные устройства. Сравнивая типы устройств с нашим примером диаграммы, ЦП — это корневой порт или сложное устройство. Мост 1, Мост 2 — это устройства моста PCI. D1, D2, D3 и т. Д. Являются оконечными устройствами PCI системы. D3 присутствует на шинах № 2 и № 3, одно и то же устройство на разных шинах.

Пространство или заголовок конфигурации PCI

Все устройства PCI имеют пространство конфигурации или заголовок. Это стандартная область памяти, присутствующая во всех устройствах. Существует два типа заголовка конфигурации PCI, основанные на двух типах (мост и конечная точка) устройств PCI. Конфигурационное пространство известно как Тип 0 для оконечного устройства и Тип 1 для мостов PCI. Поля заголовка конфигурации определены спецификациями PCI.

Заголовок конфигурации типа 0:

Заголовок конфигурации типа 0

Заголовок конфигурации типа 1:

Заголовок конфигурации типа 1

Перечисление шины PCI

Во время загрузки системы выполняется распознавание всех устройств PCI в системе, что называется перечислением шины PCI. BIOS обычно перечисляет все устройства PCI, присутствующие на всех шинах, и помещает их в sysfs. Пользователи могут получить доступ к деталям присутствующих устройств PCI с помощью утилиты lspci. Другой способ — просмотреть файлы sysfs в каталоге / sys / bus / pci / devices. В этом каталоге будут находиться все устройства, известные ядру Linux.

После перечисления шины PCI все устройства получают номер, номер и номер функции. Этих трех компонентов достаточно, чтобы найти любое устройство.

Перечисление шины PCI выполняется BIOS (базовой системой ввода-вывода). BIOS — это встроенное программное обеспечение, предназначенное для Машины / платформы и предоставляемое самим производителем.

Драйвер Linux Kernel Root Complex

На любой платформе Linux на базе x86 есть корневой комплексный драйвер PCI или подсистема PCI Linux, которая считывает информацию, заполняемую BIOS, и экспортирует информацию в файловую систему sysfs. Все устройства PCI, присутствующие в системе, можно найти в каталоге / sys / bus / pci / devices. Драйвер корневого комплекса также обеспечивает гибкость для повторного сканирования или сброса устройств на любой шине PCI. Даже полное повторное сканирование всех шин PCI можно выполнить с помощью / sys / bus / pci / rescan.

Команда для повторного сканирования всех устройств:

echo 1 > /sys/bus/pci/rescan

Пользователи должны иметь права суперпользователя для выполнения этой команды.

Для любого устройства в каталоге sysfs мы можем найти ниже детали / информацию:

sushil-machine$ ls /sys/bus/pci/devices/0000\:00\:00.0/ -l
total 0
-rw-r—r— 1 root root 4096 Oct  4 17:34 broken_parity_status
-r—r—r— 1 root root 4096 Oct  2 18:19 class
-rw-r—r— 1 root root 4096 Oct  2 18:19 config
-r—r—r— 1 root root 4096 Oct  4 17:34 consistent_dma_mask_bits
-rw-r—r— 1 root root 4096 Oct  4 17:34 d3cold_allowed
-r—r—r— 1 root root 4096 Oct  2 18:19 device
-r—r—r— 1 root root 4096 Oct  4 17:34 dma_mask_bits
lrwxrwxrwx 1 root root    0 Oct  2 19:18 driver —> ../../../bus/pci/drivers/agpgart-intel
-rw-r—r— 1 root root 4096 Oct  4 17:34 driver_override
-rw-r—r— 1 root root 4096 Oct  4 17:34 enable
-r—r—r— 1 root root 4096 Oct  2 18:19 irq
-r—r—r— 1 root root 4096 Oct  4 17:34 local_cpulist
-r—r—r— 1 root root 4096 Oct  4 17:34 local_cpus
-r—r—r— 1 root root 4096 Oct  2 19:18 modalias
-rw-r—r— 1 root root 4096 Oct  4 17:34 msi_bus
-rw-r—r— 1 root root 4096 Oct  2 19:18 numa_node
drwxr-xr-x 2 root root    0 Oct  4 17:34 power
—w—w—- 1 root root 4096 Oct  4 17:34 remove
—w—w—- 1 root root 4096 Oct  4 17:34 rescan
-r—r—r— 1 root root 4096 Oct  2 18:19 resource
-r—r—r— 1 root root 4096 Oct  4 17:34 revision
lrwxrwxrwx 1 root root    0 Oct  4 17:34 subsystem —> ../../../bus/pci
-r—r—r— 1 root root 4096 Oct  4 17:34 subsystem_device
-r—r—r— 1 root root 4096 Oct  4 17:34 subsystem_vendor
-rw-r—r— 1 root root 4096 Oct  4 17:34 uevent
-r—r—r— 1 root root 4096 Oct  2 18:19 vendor
sushil-machine$

Выше представлены файлы для каждого устройства по разному пути.

Мы прочитаем содержимое нескольких файлов, чтобы проверить информацию:

sushil-machine$ cat /sys/bus/pci/devices/0000\:00\:00.0/device
0x7190                          // device file provides the deviceid
sushil-machine$ cat /sys/bus/pci/devices/0000\:00\:00.0/vendor
0x8086                       // vendor file provides the vendorid
sushil-machine$

Точно так же другие файлы предоставляют некоторую другую информацию.

Некоторые файлы предназначены только для записи: удалите и повторно просканируйте

Читайте также:  Обзор микрофона для стрима Elgato Wave 3

Удалить файлы можно использовать для удаления устройства. Введите в файл эхо 1, и вы увидите, что lspci не будет отображать это устройство.

эхо 1> /sys/bus/pci/devices/0000\:00\:00.0/remove

Восстановление устройства с предыдущего шага можно выполнить путем повторного сканирования устройства.

Эхо 1 в файл повторного сканирования с помощью следующей команды:

эхо 1> /sys/bus/pci/devices/0000\:00\:00.0/rescan

Чтение и запись в конфигурационное пространство

Доступны команды lspci и setpci, которые можно использовать для чтения и записи пространства конфигурации любого устройства PCI. lspci имеет очень богатые возможности для настройки вывода в соответствии с потребностями пользователя. setpci — еще одна утилита, которую также можно использовать для доступа к пространству конфигурации устройства pci.

Мы не будем здесь подробно обсуждать их, поскольку есть отдельная статья, в которой подробно рассматриваются обе эти утилиты. У нас будет только один пример обеих команд:

lspci:

sushil-machine$ lspci -d :7190
00:00.0 Host bridge: Intel Corporation 440BX/ZX/DX — 82443BX/ZX/DX Host bridge (rev 01) // output

setpci:

sushil-machine$ setpci -s 00:00.0 0.w
8086                   //output ; reading a word from offset 0 in the config space. The vendor id is the output.

Чтение и запись BAR Space

Всего может быть 6 32-битных полос или 3 64-битных панели. К пространству конфигурации типа 0 можно обратиться, чтобы получить сведения о смещении BAR.

Давайте возьмем пример устройства с выводом ниже:

03:00.0 Ethernet controller: VMware VMXNET3 Ethernet Controller (rev 01)
Subsystem: VMware VMXNET3 Ethernet Controller
Physical Slot: 160
Control: I/O+ Mem+ BusMaster+ SpecCycle- MemWINV- VGASnoop- ParErr- Stepping- SERR- FastB2B- DisINTx+
Status: Cap+ 66MHz- UDF- FastB2B- ParErr- DEVSEL=fast >TAbort- <TAbort- SERR-  ../../../../bus/pci/drivers/vmxnet3
-rw-r—r— 1 root root  4096 Oct  4 18:01 driver_override
-rw-r—r— 1 root root  4096 Oct  4 18:01 enable
lrwxrwxrwx 1 root root     0 Oct  4 18:01 firmware_node —> ../../../LNXSYSTM:00/LNXSYBUS:00/PNP0A03:00/device:89/device:8a
-r—r—r— 1 root root  4096 Oct  2 18:19 irq
-r—r—r— 1 root root  4096 Oct  4 17:57 label
-r—r—r— 1 root root  4096 Oct  4 18:01 local_cpulist
-r—r—r— 1 root root  4096 Oct  4 18:01 local_cpus
-r—r—r— 1 root root  4096 Oct  4 18:01 max_link_speed
-r—r—r— 1 root root  4096 Oct  4 18:01 max_link_width
-r—r—r— 1 root root  4096 Oct  4 17:57 modalias
-rw-r—r— 1 root root  4096 Oct  4 18:01 msi_bus
drwxr-xr-x 2 root root     0 Oct  4 18:01 msi_irqs
drwxr-xr-x 3 root root     0 Jul 22 06:53 net
-rw-r—r— 1 root root  4096 Oct  4 17:57 numa_node
drwxr-xr-x 2 root root     0 Oct  4 18:01 power
—w—w—- 1 root root  4096 Oct  4 18:01 remove
—w—w—- 1 root root  4096 Oct  4 18:01 rescan
—w——- 1 root root  4096 Oct  4 18:01 reset
-r—r—r— 1 root root  4096 Oct  2 18:19 resource
-rw——- 1 root root  4096 Oct  4 18:01 resource0
-rw——- 1 root root  4096 Oct  4 18:01 resource1
-rw——- 1 root root  8192 Oct  4 18:01 resource2
-rw——- 1 root root    16 Oct  4 18:01 resource3
-r—r—r— 1 root root  4096 Oct  4 18:01 revision
-rw——- 1 root root 65536 Oct  4 18:01 rom
lrwxrwxrwx 1 root root     0 Oct  4 18:01 subsystem —> ../../../../bus/pci
-r—r—r— 1 root root  4096 Oct  4 18:01 subsystem_device
-r—r—r— 1 root root  4096 Oct  4 18:01 subsystem_vendor
-rw-r—r— 1 root root  4096 Oct  4 18:01 uevent
-r—r—r— 1 root root  4096 Oct  2 18:19 vendor
sushil-machine$

Присутствуют дополнительные файлы с именами resource [0-3]; это файлы, которые можно использовать для доступа к памяти, отображаемой в эти области. Например, для доступа к пространству 4K, отображенному в область 0, файл resource0 можно сопоставить с пространством пользователя с помощью функции mmap (). После сопоставления region0 с пространством пользователя можно получить доступ к пространству 4K в соответствии с потребностями / требованиями.

Читайте также:  Обзор Huawei FreeBuds Pro 2

Заключение

Подсистема Linux PCI перечисляет и заполняет устройства PCI. Устройства lspci и setpci могут использоваться для получения информации об устройствах. Драйвер корневого комплекса Linux также предоставляет всю информацию об устройствах pci в файлах sysfs. Существует возможность сброса, повторного сканирования и удаления устройств из файлов sysfs. BIOS выполняет процесс перечисления, а драйвер Linux анализирует информацию и соответствующим образом заполняет всю информацию об устройстве. Этим продолжительным обсуждением давайте завершим эту тему.

Оцените статью
ПОПУЛЯРНЫЕ ТЕХНОЛОГИИ
Добавить комментарий