Linux отключить pci устройство

Обновлено: 03.07.2024

ОПИСАНИЕ
lspci это утилита для отображения информации о PCI шинах в системе и устройствах, подключенных к ним.

По умолчанию, она показывает краткий список устройств. Используйте опции, описанные ниже, для более подробного вывода или вывода предназначенного для разбора с помощью других программ.

Если вы собираетесь сообщить об ошибках в PCI устройствах, драйверах или выводе lspci, пожалуйста, вложите вывод «lspci -vvx» или даже лучше «lspci -vvxxx» (впрочем, смотрите ниже возможные предостережения).

Некоторые части вывода, особенно в режиме highly verbose, вероятно, являются понятными только для опытных PCI хакеров. Для точного определений полей, пожалуйста обратитесь к спецификациям PCI или к включенным в header.h и /usr/include/linux/pci.h файлам.

Доступ к некоторым частям конфигурационного пространства PCI ограничен правами root на многих операционных системах, поэтому возможности lspci, доступные обычным пользователям ограничены. Тем не менее, lspci вначале отображает столько, сколько доступно и отмечает другую информацию текстом <access denied - доступ запрещен>.

ОПЦИИ
Основные режимы отображения

Опции для управления разрешений ID`s с именами

Опции выбора устройств

Опции доступа PCI
Утилиты PCI используют библиотеку PCI library для доступа к устройствам PCI (см. pcilib(7) для более подробной информации). Вы можете использовать следующие опции влияющие на их поведение:

МАШИНОСЧИТЫВАЕМЫЙ ВЫВОД
Если вы намерены обрабатывать вывод lspci автоматически, пожалуйста, используйте один из машиночитаемых форматов (-m, -vm, -vmm), описанные в данном разделе. Все другие форматы возможны в выборе между версиями lspci.

Все номера всегда печатаются в шестнадцатеричном виде. Если вы хотите использовать числовой идентификатор вместо имён, пожалуйста, добавьте ключ -n.

Простой формат (-m) В простом формате, каждое устройство описано в одной строке, которая форматируется в качестве параметров подходит для передачи в сценарий оболочки, т.е. значений, разделенных пробелами, цитирует и сбежал если необходимо. Некоторые из аргументов позиционным: слот, класс, имя производителя, название устройства, под- Имя поставщика системы и имя подсистемы (последние два пусты, если устройство не имеет подсистему); Остальные аргументы-опции, как:

-rREV Редакция число.

-pprogif Интерфейс программирования.

Относительный порядок позиционных аргументов и опций не определено. Новые опции могут быть добавлены в будущие версии, но они будут всегда есть один аргумент не отделена от любой вариант пространства, поэтому они могут быть легко игнорируется, если не признается.

Следующие теги определяются:

Слот имя слота, где находится устройство ([домен]: автобус: device.function). Этот тег всегда первый в записи.

Класс Название класса.

Производитель Название поставщика.

Устройство Название устройства.

SVendor Название подсистемы поставщика (по желанию).

SDevice Название подсистемы (опция).

PhySlot Физический слот, где устройство находится (опция, только Linux).

Версия Номер версии (опционально).

Интерфейс программирования ProgIf (по желанию).

Драйвер ядра драйвера в настоящее время работы с устройством (опция, Linux только).

Модуль ядра отчетности модуль, который способен обрабатывать устройство (опционально, Linux только).

Новые теги могут быть добавлены в будущих версиях, так что вы должны игнорировать любые теги, не призна- nize.

Обратную совместимость расширенном формате (-vm) В этом режиме, lspci вначале пытается быть полностью совместимы со старыми версиями. Это почти то же самое как регулярные расширенном формате, но тег Устройство используется как для слота и именем устройства, так это происходит дважды в одной записи. Пожалуйста, не используйте эту форму в любом новом коде.

/usr/share/misc/pci.ids.gz Если lspci вначале составляется с поддержкой сжатия, этот файл судим pci.ids.

/ .pciids-кэша Все идентификаторы найдены в режиме DNS -запросов кэшируются в этом файле.

ОШИБКИ Иногда, lspci вначале не способен декодировать регистры конфигурации полностью. Это, как правило, hap- ручки, когда не хватает Документация была доступна для авторов. В таких случаях, по крайней мере, печатает <?> знак, чтобы сигнализировать, что есть что-то потенциально больше, чтобы сказать. Если вы знаете, Детали, патчи будут, конечно, приветствуется.

Доступ к расширенной конфигурационном пространстве в настоящее время поддерживается только по linux_sysfs обратно- конец.

СМОТРИТЕ ТАКЖЕ setpci (8), изменение-pciids (8), pcilib (7)

pciutils-3.2.1 10 ноября 2013 года lspci вначале (8)

Когда компьютеры назывались «электронно-вычислительными машинами», они были размерами в среднем с кухонный гарнитур и занимались почти исключительно вычислениями. Ввод и вывод данных воспринимался пользователями ЭВМ — учёными-математиками — как нечто необходимое, но к работе ЭВМ имеющее лишь косвенное отношение. Учёного было довольно просто обучить, чтобы он составлял программы и оформлял входные данные для расчётов одним каким-нибудь способом, например, при помощи перфокарт. Подключение к компьютеру какого-нибудь другого устройства было делом трудоёмким, так как требовало усилий и электронщика, и программиста. Да и нужно это было нечасто.

Нынешний компьютер — игрушка не учёного, а любого рядового обывателя. Это бытовой прибор. Мало того, компьютер — это «самый умный» бытовой прибор: если имеется какой-нибудь другой бытовой прибор (скажем, кофеварка), прогрессивный обыватель тут же задумывается, нельзя ли обучить компьютер управлять этим прибором (скажем, варить кофе за минуту до приезда хозяина). В идеале получается «электронный дом», в котором работу любого оборудования можно контролировать, не вставая из-за рабочего места, или даже не садясь за него — посредством сети Интернет.

Самое поверхностное суждение об оборудовании и компьютере — что для подключения прибора нужна волшебная субстанция по имени «драйвер». Есть драйвер — компьютер оборудование «видит», нет драйвера — «не видит».

Это суждение во многом неверно.

Что такое «оборудование»?

Что и как можно подключить к компьютеру? Во-первых, на поверхности его корпуса обычно наблюдается множество разнообразных отверстий и разъёмов, очевидно предназначенных для того, чтобы туда что-то подключали. Уже подключены: клавиатура, мышь, монитор, возможно — принтер, наушники или колонки. Много отверстий остаётся неиспользованными, но и аппаратуры в «электронном доме» ещё много — от КПК до той же кофеварки (если на ней есть соответствующий разъём).

Во-вторых, внутри компьютера имеются специальные разъёмы для подключения к ним плат расширения: устройств, выглядящих не как бытовой прибор, а скорее как деталь самого компьютера. Таковы видеоадаптеры, сетевые адаптеры, «внутренние» модемы и т. п. Эти устройства — главный источник «Саги о Драйверах», потому что их много, и создатели каждого такого устройства желают сохранить его устройство втайне от конкурентов, прилагая к ним вместо документации ту самую волшебную субстанцию с пометкой «нажмите кнопку “ Пуск ” и попытайтесь расслабиться: от вас уже ничего не зависит».

В-третьих, ещё более внутри компьютера есть какие-то устройства, которые нельзя ни отключить, ни подключить, однако они используются при работе, имеют какое-то название и на разных компьютерах могут весьма отличаться. Например, звуковые подсистемы могут быть интегрированными, а могут быть выполненными в виде платы расширения, отличаясь редкостным разнообразием моделей и однообразием функций (разъём для микрофона, разъём (ы) для колонок, линейный вход. что-то ещё?). Или устройство, к которому подключаются жёсткие диски: оно может быть рассчитано на 1 диск, 2, 4, иногда — более, иметь разные дополнительные свойства. и тоже требовать «драйвера» — по крайней мере, поддержки со стороны системы.

Что точно отличает один прибор от другого — это внешний вид разъёма, с помощью которого они подключаются к компьютеру. Очевидно, приборами, подключаемыми к разъёмам разного типа, машина управляет существенно по-разному. Более того, разъёмы настолько различны, что соединительный кабель одного типа просто не влезет в разъём другого 1 . Но всё равно, это не решает проблемы идентификации: например, мышь, подключённая к разъёму (порту) USB, отлично работает, а с цифровой фотокамерой как-то спроста не получается. Опять «драйвер» нужен?

Можно добавить, что некоторое оборудование вообще не нуждается в том, чтобы машине объявляли о его существовании: так, что бы ни подключалось к аналоговому звуковому входу, работать оно будет одинаково, компьютер не отличит колонки от наушников, да и отсутствия их не заметит. Словом, наружное наблюдение не даёт достаточно информации о том, как работать с оборудованием. На помощь должна прийти документация, но если в ней опять встретится слово «драйвер», оно может означать что угодно: слишком оно неопределённое.

Как распознаётся оборудование?

Попробуем внести определённость. Какую информацию относительно подключаемого прибора получает компьютер, и как он её получает?

  • определяет тип подключённого устройства
  • управляет им (может, например, выключить или включить)
  • передаёт на это устройство данные и/или принимает их оттуда

Шин в компьютере несколько (грубо говоря — по количеству различных типов разъёмов). Есть совсем «глупые» шины — например, порт последовательного ввода-вывода (к нему подключаются мыши и прочая аппаратура «старого образца»). Глупость их в том, что информацию о типе подключённого оборудования приходится задавать вручную — либо заранее, либо с помощью наводящих вопросов пользователю.

Есть шины весьма умные, способные опросить и понять множество характеристик подключённого устройства. Такова, например, шина PCI — наиболее распространённое на сегодня оборудование для подключения плат расширения. Любопытный пользователь может посмотреть список устройств, подключённых к шине PCI с помощью команды lspci (от «list PCI», команда из пакета pciutils ):


Из устройств на иллюстрации только одно — видеокарта Radeon 7200 2 — в действительности является платой расширения, все остальные интегрированы в системную плату (бывает и по-другому). Тип устройства — «Multimedia audio controller», «Ethernet controller», «VGA compatible controller» и т. п. — лишь небольшая часть информации, которую шине рассказали о себе подключённые к ней устройства.

К шине PCI в качестве устройства подключена другая шина — USB, служащая для подсоединения внешних устройств. Она тоже довольно умная, а ещё отличается тем, что устройства подключаются к ней и отключаются от неё довольно часто. Существует команда lsusb (из пакета, естественно, usbutils ), но ей, как и lspci приходится пользоваться нечасто (она даже убрана в каталог /usr/sbin , с глаз пользовательских долой):


Пример показывает пять USB-шин (это совпадает с данными lspci ), к первой из которых подключён flash-диск, а ко второй — мышь 3 . Как правило, устройство определяется шиной, после чего специально обученная системная программа производит все действия, необходимые для того, чтобы этим устройством можно было воспользоваться. Например, для flash-диска потребовалось дополнительно загрузить модуль ядра usb_storage , да вдобавок смонтировать содержимое диска в каталог /media/usbdisk .

Специальный каталог /sys отражает представление системы о присоединённых к ней устройствах. В частности, все найденные на шинах устройства перечислены в виде подкаталогов /sys/bus/шина/devices . Если устройство установлено, а умная шина, наподобие PCI или USB, его не заметила — скорее всего неполадка аппаратная (несовместимое или неисправное устройство, таракан в разъёме и т. п.).

Увы. Бывает и так: устройство (видеокарта, модем, кофеварка) на шине появилось, а воспользоваться им не удаётся. Видимо, чего-то не хватает. драйвера?

Что такое «драйвер» и где он находится?

А в самом деле, чего может не хватать, если устройство распозналось, марка устройства — известна и как передавать данные по шине — тоже известно? Не хватает главного: сведений о том, какие данные надо передавать, чтобы добиться от устройства желаемого эффекта. Что передать по шине USB, чтобы кофеварка выключилась? Какие байты записать в последовательный порт модема, чтобы он повесил трубку? Что сделать с видеокартой, чтобы. всё было быстро и непременно 3d!?

В последнем случае нет никакой зримой информации о том, что устройством действительно можно пользоваться — до тех пор, пока не запущена соответствующая прикладная программа с соответствующими настройками (особенно это касается «глупых» шин наподобие последовательного порта). И в любом случае самостоятельная установка «драйвера» должна сопровождаться вдумчивым чтением документации к нему.

Опять «устройство»?

В документации Linux термин «устройство» (device) часто используется не в значении «прибор», а в значении «элемент каталога /dev ». Что это такое?

Прибор подключается к машине, как правило, для того, чтобы передавать на него какие-то данные и/или получать их оттуда. Если задача компьютера — управлять внешним устройством, это всё равно можно рассматривать как передачу управляющих данных и приём диагностических. Во многих случаях передачу данных проще всего вести в синхронном (поточном) режиме, точно так же, как это делается при работе с файлом: открыть файл — записать данные — закрыть файл или открыть — прочитать — закрыть. Если бы можно было представить внутренность прибора в виде файла, работа с ним пошла бы легче: это означало бы, что система знает, как и куда передавать данные, а дело пользовательской программы — эти данные понимать 4 .

В большинстве случаев именно так и устроено в Linux. После того, как система распознала внешнее устройство, а служба hotplug , при необходимости, загрузила соответствующий модуль ядра, в каталоге /dev заводится новый «файл», содержимое которого отражает содержимое подключённого устройства, не занимая при этом места на жёстком диске. Такой файл называется файлом-дыркой, его можно представить как отверстие в файловой системе, через которое видно не содержимое жёсткого диска, а данные, попадающие туда с «другой стороны» — со стороны подключённого внешнего устройства. Например, гибкий диск в дисководе представляется в виде файла-дырки /dev/fd0 , (от floppy disk 0), а мышь — в виде /dev/mouse (строго говоря /dev/mouse — этот обычно символьная ссылка на актуальный файл-дырку — скажем /dev/psaux , порт PS/2).

В документации вместо «файл-дырка» чаще всего пишут просто «устройство» (device), а устройство-прибор — «внешним устройством». Если соответствующего устройства в каталоге /dev/ нет — значит, в цепочке его распознавания есть слабое звено.

Стоит напомнить, что файл-дырка, однако, не обязан существовать и непременно соответствовать одному внешнему устройству. Устройства, подключаемые ко второму последовательному порту, например, всегда видны как /dev/ttyS1 (а к первому — как ttyS0 ). Фактически, ttyS — это файл-дырка шины, настолько простой, что дальнейшее выяснение типа устройства перекладывается на программу пользователя.

Кто виноват и что делать?

1Однако можно, например, подключить наушники вместо микрофона, причём они, скорее всего, будут работать микрофоном. правда, очень тихо.

2Она подключена к шине AGP, которая архитектурно похожа на PCI, поэтому система различия не делает.

3Некоторая путаница может возникнуть из-за того, что строгого соответствия между разъёмами на корпусе и номерами шин нет: «кто первый встал, того и тапки».

отключить конкретное устройство PCI при загрузке

Это также отключает мой интерфейс Bluetooth, но меня это устраивает.

Я бы хотел, чтобы этот параметр сохранялся, чтобы я мог снова безболезненно использовать свою виртуальную консоль, если она мне понадобится. Я хочу, чтобы моя операционная система (Debian amd64) никогда не просыпалась, но я не знаю, как это сделать. Я попытался внести в черный список псевдоним модуля для устройства PCI, но, похоже, он игнорируется:

Как я могу гарантировать, что это конкретное устройство PCI никогда не активируется автоматически, без полного отключения его драйвера?

-редактировать- Модуль недавно переименовали, сейчас из userland работают:

Тем не менее, я ищу способ в первую очередь предотвратить привязку ядра к этому устройству.

  • 1 Будет ли приемлемым подходом отключить это конкретное устройство USB через шину USB, а не через шину PCI?
  • Вы также уверены, что можете добавить в черный список такую ​​строку pci: . Я видел только модули ядра, занесенные в черный список в файле /etc/modprobe.d/blacklist. Не могли бы вы использовать lspci -k, чтобы определить, какой модуль требуется устройству, а затем занести его в черный список?
  • После добавления записи в черный список вы update-initramfs -u -k all ?
  • @StefanSeidel: Хороший вопрос. У меня есть сейчас, но, похоже, это не помогает. Возможно, slm прав, считая, что для внесения в черный список подобных модалий нужен другой синтаксис или другой метод.
  • @slm: я не уверен, смогу ли я заблокировать модалиасы через черный список modprobe (моя система, кажется, игнорирует строку, которую я ей дал), но я не могу просто удалить модуль ( ehci_hcd ), так как это отключит все USB-хосты в моей системе. Я просто хочу отключить это конкретное устройство в зависимости от его поставщика, разработчика, субвендора и subdev.

Недавно я столкнулся с этой проблемой при настройке моего xen-бокса с несколькими USB-устройствами. Я хотел, чтобы один использовался Dom-0, а другой - виртуальной машиной, поэтому мне нужно, чтобы устройство было доступно для xen-pciback. Однако драйвер USB был встроен в мое ядро, поэтому я не мог просто занести драйвер в черный список. Мое решение состояло в том, чтобы создать собственный сценарий initramfs, который отключает привязку конкретного порта pci в самом начале процесса загрузки.

Это Ubuntu 2016.04, но он должен работать в более ранних версиях.

Здесь задействованы три файла. Я назвал их для своего конкретного случая использования, но ymmv:

Первый файл с именем /etc/unbindpci файл, который представляет собой простой csv номер устройства pci и драйвер (настройте как необходимо здесь):

Второй файл /etc/initramfs-tools/hooks/xenfiles , который копирует вышеуказанный конфиг в файл initramfs.

Третий файл - это то, что работает во время загрузки, я поместил его в /etc/initramfs-tools/scripts/init-top/unbind-early-pci :

Наконец, запустите update-initramfs -k all -u и перезагрузитесь.

Я мог бы включить поддержку комментариев в конфигурационный файл, и здесь нужно многое почистить, но у меня это работает.

Вы можете удалить устройство PCI, добавив правило udev в /etc/udev/rules.d:

Заменить 0000:00:03.0 с адресом устройства pci, которое вы хотите удалить

  • Это очень полезно. Однако, как упоминалось в OP, это приведет к отключению всех USB-портов. Есть ли способ добавить правило для определенного устройства и идентификатора поставщика, чтобы устройства работали со всеми другими портами USB, но игнорировали данное устройство?

Моя ошибка системного журнала:

Это внутренний usb-хаб-порт для опции bluetooth, которой у меня нет.

Отмена привязки к устройству pci только что привела к тому, что концентратор снова появился в качестве другого концентратора (в моем случае 5) и продолжил переполнение системного журнала.

Случайно я заметил структуру развязки под /sys/bus/usb/drivers/hub . Используя приведенные выше примеры, я просто добавил в rc.local следующее:

Результат - тишина системного журнала! Теперь добавим пример сценария kshurig для управления питанием, и я должен быть золотым.

Нашел эту ветку на askubuntu:

С помощью lspci -vv Чтобы определить слот PCI устройства, который вы хотите отключить, похоже, вы можете использовать эту команду для выключения устройства этого слота:

  • 2 Я знаю, как отключить его в любое другое время, но я хочу, чтобы ядро ​​не активировало его вообще. Кроме того, поскольку это жесткое устройство PCI (как и большинство контроллеров USB), оно не имеет слота. Машина, о которой я говорю, - это ноутбук, и единственный слот у него есть ( /sys/bus/pci/slots/1 ) - это слот ExpressCard снаружи, который я могу освободить вручную.

Когда у тебя уже есть echo '0000:00:1a.0' > /sys/bus/pci/drivers/ehci_hcd/unbind в /etc/rc.local для загрузки вам просто нужно поместить его в сценарий для демона управления питанием.

Происходит так: Создайте исполняемый файл сценария bash с именем 0_disable_webcam в каталоге /etc/pm/sleep.d/ :

Он должен работать мгновенно. Я попробовал это с флэш-накопителем USB, и он работал (то есть оставался отключенным), пока был подключен диск. Для повторного подключения потребуются правила udev, но поскольку ваша веб-камера не будет отключена, она должна работать. Если это не поможет, у меня есть другое предложение.

не столько ответ на ваш вопрос, сколько обходной путь.

Устройства на шине PCI

Архитектура PCI была разработана в качестве замены стандарту ISA с тремя основными целями: получить лучшую производительность при передаче данных между компьютером и его периферией, быть независимой от платформы, насколько это возможно, и упростить добавление и удаление периферийных устройств в системе. В настоящее время PCI широко используется в разных архитектурах: IA-32 / IA-64, Alpha, PowerPC, SPARC64 . Самой актуальной для автора драйвера является поддержка PCI автоопределения интерфейса плат: PCI устройства настраивается автоматически во время загрузки. Затем драйвер устройства получает доступ к информации о конфигурации устройства, и производит инициализацию. Это происходит без необходимости совершать какое-либо тестирование.

Каждое периферийное устройство PCI идентифицируется по подключению такими физическими параметрами, как: номер шины, номер устройства и номер функции. Linux дополнительно вводит и поддерживает такое логическое понятие как домен PCI. Каждый домен PCI может содержать до 256 шин. Каждая шина содержит до 32 устройств, каждое устройство может быть многофункциональным и поддерживать до 8 функций. В конечном итоге, каждая функция может быть однозначно идентифицирована на аппаратном уровне 16-ти разрядным ключом. Однако, драйверам устройств в Linux, не требуется иметь дело с этими двоичными ключами, потому что они используют для работы с устройствами специальную структуру данных pci_dev .

Адресацию PCI устройств в своей Linux системе смотрим:

Другое представление той же информации (тот же хост) можем получить так:

Здесь отчётливо видно (слева) поля, например для контроллера VGA: 0000:00:02.0 - выделены домен (16 бит), шина (8 бит), устройство (5 бит) и функция (3 бита). Поэтому, когда мы говорим об устройстве (далее), мы имеем в виду набор: номера домена + номер шины + номер устройства + номер функции.

- где from — это NULL при начале поиска (или возобновлении поиска с начала), или указатель устройства, найденного на предыдущем шаге поиска. Если в качестве Vendor ID и/или Device ID указана константа PCI_ANY_ID=-1 , то предполагается выбор всех доступных устройств с таким идентификатором. Если искомое устройство не найдено (или больше таких устройств не находится в цикле), то очередной вызов возвратит NULL . Если возвращаемое значение не NULL , то возвращается указатель структуры описывающей устройство, и счётчик использования для устройства инкрементируется. Когда устройство удаляется (модуль выгружается) для декремента этого счётчика использования необходимо вызвать:

После нахождения устройства, но прежде начала его использования необходимо разрешить использование устройства вызовом: pci_enable_device( struct pci_dev *dev) , часто это выполняется в функции инициализации устройства: поле probe структуры struct pci_driver (см. далее), но может выполняться и автономно в коде драйвера.

Каждое найденное устройство имеет своё пространство конфигурации, значения которого заполнены программами BIOS (или PnP OS, или BSP) — важно, что на момент загрузки модуля эта конфигурационное пространство всегда заполнено, и может только читаться (не записываться). Пространство конфигурации PCI устройства состоит из 256 байт для каждой функции устройства (для устройств PCI Express расширено до 4 Кб конфигурационного пространства для каждой функции) и стандартизированную схему регистров конфигурации. Четыре начальных байта конфигурационного пространства должны содержать уникальный ID функции (байты 0-1 — Vendor ID, байты 2-3 — Device ID), по которому драйвер идентифицирует своё устройство. Вот для сравнения начальные строки вывода команды для того же хоста (видно, через двоеточие, пары: Vendor ID — Device ID):

Первые 64 байт конфигурационной области стандартизованы, остальные зависят от устройства. Самыми актуальными для нас являются (кроме ID описанного выше) поля по смещению:

Вся регистрация устройства PCI и связывание его параметров с кодом модуля происходит исключительно через значения, считанные из конфигурационного пространства устройства. Обработку конфигурационной информации (уже сформированной при установке PCI устройства) показывает модуль (архив pci.tgz ) lab2_pci.ko (заимствовано из [6]):

Небольшой фрагмент результата выполнения этого модуля:

$ sudo insmod lab2_pci.ko

$ lsmod | grep lab

$ dmesg | tail -n221 | head -n30

$ sudo rmmod lab2_pci

$ lsmod | grep lab2

Для использования некоторой группы устройства PCI, код модуля определяет массив описания устройств, обслуживаемых этим модулем. Каждому новому устройству в этом списке соответствует новый элемент. Последний элемент массива всегда нулевой, это и есть признак завершения списка устройств. Строки такого массива заполняются макросом PCI_DEVICE :

Созданная структура pci_device_id должна быть экспортирована в пользовательское пространство, чтобы позволить системам горячего подключения и загрузки модулей знать, с какими устройствами работает данный модуль. Эту задачу решает макрос MODULE_DEVICE_TABLE :

Кроме доступа к области конфигурационных параметров, программный код может получить доступ к областям ввода-вывода и регионов памяти, ассоциированных с PCI устройством. Таких областей ввода-вывода может быть до 6-ти (см. формат области конфигурационных параметров выше), они индексируются значением от 0 до 5. Параметры этих регионов получаются функциями:

- где bar во всех вызовах — это индекс региона: 0 . 5. Первые 2 вызова возвращают начальный и конечный адрес региона ввода-вывода ( pci_resource_end() возвращает последний используемый регионом адрес, а не первый адрес, следующий после этого региона.), следующий вызов — его размер, и последний — флаги. Полученные таким образом адреса областей ввода/вывода от устройства — это адреса на шине обмена (адреса шины, для некоторых архитектур - x86 из числа таких - они совпадают с физическими адресами памяти). Для использования в коде модуля они должны быть отображены в виртуальные адреса (логические), в которые отображаются страницы RAM посредством устройства управления памятью (MMU). Кроме того, в отличие от обычной памяти, часто эти области ввода/вывода не должны кэшироваться процессором и доступ не может быть оптимизирован. Доступ к памяти таких областей должен быть отмечен как «без упреждающей выборки». Всё, что относится к отображению памяти будет рассмотрено отдельно далее, в следующем разделе. Флаги PCI региона ( pci_resource_flags() ) определены в <linux/ioport.h> ; некоторые из них:

IORESOURCE_IO, IORESOURCE_MEM — только один из этих флагов может быть установлен.

IORESOURCE_PREFETCH — определяет, допустима ли для региона упреждающая выборка.

IORESOURCE_READONLY — определяет, является ли регион памяти защищённым от записи.

  • name - имя драйвера, оно должно быть уникальным среди всех PCI драйверов в ядре, обычно устанавливается таким же, как и имя модуля драйвера, когда драйвер загружен в ядре, это имя появляется в /sys/bus/pci/drivers/ ;
  • id_table - только что описанный массив записей pci_device_id ;
  • probe — функция обратного вызова инициализации устройства; в функции probe драйвера PCI, прежде чем драйвер сможет получить доступ к любому ресурсу устройства (область ввода/вывода или прерывание) данного PCI устройства, драйвер должен, как минимум, вызвать функцию :
  • remove — функция обратного вызова удаления устройства;
  • . и другие функции обратного вызова.

Обычно для создания правильную структуру struct pci_driver достаточно бывает определить, как минимум, поля :

Читайте также: