Базовое понимание карты памяти PCI Express BAR

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

Я понимаю, что регистры базового адреса (BAR) в пространстве конфигурации PCIE содержат адрес памяти, на который PCI Express должен отвечать / на который разрешена запись. (Это правильно?)

Мои вопросы следующие:

  • Что такое «адрес конкретной шины» по сравнению с физическим адресом, когда речь идет о PCIE?
  • Когда и как BAR заполняется адресами? Отвечает ли драйвер за выделение памяти и запись адреса на периферийный BAR?
  • Используется ли DMA при передаче данных из периферийного устройства в память хоста?

Я ценю ваше время.

С наилучшими пожеланиями,


person user3156702    schedule 03.01.2014    source источник


Ответы (3)


Из вашего запроса ясно, что вы хотите написать драйвер для ведомого устройства PCIe. Чтобы понять схему того, что происходит за передачей PCIe, в Интернете доступно множество материалов (например, перечисление шины PCIe, отображение периферийных адресов в память и т. Д.).

Да, вы правильно поняли сопоставление регистров PCIe с памятью, и вы можете их читать / записывать (например, в случае драйвера устройства Linux PCIe вы можете сделать это с помощью «ioremap»).

Адресная шина используется для указания физического адреса. Когда процессору или устройству с поддержкой DMA необходимо прочитать или записать в ячейку памяти, он указывает эту ячейку памяти на адресной шине. Больше нечего добавить. Тема «Перечисление шины PCIe» ответит на ваш второй вопрос.

Твой третий вопрос расплывчатый. Вы имеете в виду подчиненное устройство PCIe. Если это так, да, вы можете передавать данные между подчиненным устройством PCIe и хостом с помощью контроллера DMA. Я работаю над проектом, который включает «PCIe-DMA», подключенный к хосту через шину PCIe. На самом деле зависит от вашего дизайна и реализации. Итак, в моем случае PCIe-DMA сам по себе является подчиненным устройством PCIe на целевой плате, подключенным к хосту через PCIe.

person Sumeet_Jain    schedule 11.01.2014
comment
Здравствуйте, большое спасибо за ваш ответ. Таким образом, адрес конкретной шины совпадает с физическим адресом. Например. они одинаковы для хоста и подчиненного устройства PCIe. - person user3156702; 13.01.2014
comment
Наиболее желанный. да. Вам просто нужно позаботиться об адресах регистров, указанных в таблице данных ведомого устройства PCIe. Итак, как только вы сопоставите эти адреса регистров с вашей системной памятью, вы можете получить доступ к регистрам устройства PCIe, обратившись (чтение / запись) к сопоставленной системной памяти. - person Sumeet_Jain; 14.01.2014
comment
Привет @sumeet, это окно BAR переключается между одной картой pci на другую? Я предполагаю, что это не изменится, потому что это окно, которое процессор использует для доступа к физическому адресу карты pci, верно? - person ransh; 04.11.2015

Я также работаю над драйвером устройства (хотя и на Linux) с настраиваемой платой. Вот моя попытка ответить на ваши вопросы:

Полоски представляют собой окна памяти, которые видит хост-система (ЦП) для взаимодействия с устройством. Устройство не записывает данные в это окно, а просто отвечает на запросы TLP (пакетов уровня транзакции) (MRd *, MWr *).

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

На всех потребительских ПК x86, которые я использовал до сих пор, адрес BAR, казалось, выделялся либо BIOS, либо при загрузке ОС. Драйвер должен работать с любым адресом, который был назначен.

Похоже, что термин DMA используется вместо управления шиной, что, по моему мнению, является правильным термином для PCIe. В PCIe каждое устройство может быть мастером шины (если это разрешено в его бите 2 регистра команд). Он делает это, отправляя TLP MRd, MWr другим устройствам на шине (но обычно в системную память) и сигнализируя о прерываниях в ЦП.

person Claudio    schedule 07.02.2014
comment
Спасибо за пояснение - person user3156702; 05.05.2014
comment
Привет, Клаудио, это окно BAR переключается между одной картой pci на другую? Я предполагаю, что это не изменится, потому что это окно, которое процессор использует для доступа к физическому адресу карты pci, верно? - person ransh; 04.11.2015
comment
Привет @ransh, размер окна BAR размер определяется картой PCI. Расположение этой панели зависит от программного обеспечения (BIOS или ОС), которое необходимо настроить. Например, карта PCI может иметь BAR0 размером 1 МБ, другая карта PCI может иметь BAR0 размером 16 КБ. - person Claudio; 04.11.2015
comment
Привет, Кладио, спасибо. Если я правильно понял, чем регистры базового адреса в пространстве конфигурации PCI (регистр, который определяет физический адрес памяти устройства с точки зрения процессора), вероятно, будет таким же при замене одной карты PCI на другую, только содержимое + размер этого Память различается в зависимости от конкретных регистров устройства pci и карты памяти. Пожалуйста, поправьте меня, если ошиблись. Большое спасибо! - person ransh; 04.11.2015
comment
Привет, ранш, может все еще путаница. Доступ к пространству конфигурации PCI (где находятся регистры BAR) обычно осуществляется через специальную адресацию, которая имеет форму шины / устройства / функции или шины linux (lspci): slot.func (00: 01.0). Протокол PCIe использует специальные пакеты для такой адресации (тип конфигурации 0/1 запросы чтения / записи). Это не доступ к памяти или пространству ввода-вывода (хотя механизм доступа к ним может быть ... это уже другая история). Поэтому, если вы замените карту PCI другой (в том же слоте), они, вероятно, будут использовать тот же адрес шины: слот. Надеюсь это поможет. Клаудио - person Claudio; 05.11.2015

разъяснения по поводу ваших сомнений / вопросов здесь.

1> Есть много устройств, которые находятся на шине, например PCI, которые рассматривают Memeory в терминах, отличных от физического адреса, они называются адресами шины. Например, если вы инициируете DMA с устройства, находящегося на шине, в основную память системы, тогда адрес назначения должен быть соответствующим адресом шины того же физического адреса в Memmory.

2> BARS заполняется во время перечисления, в типичном ПК именно во время загрузки, когда ваше программное обеспечение с поддержкой PCI перечисляет устройства PCI, представленные в слоте, и выделяет адреса и размер для BARS.

3> Да, вы можете использовать как операции, инициированные DMA, так и операции, инициированные процессором на этих BARS.

- летать высоко

person flying-high    schedule 19.02.2014
comment
Спасибо за ваше время - очень признателен - person user3156702; 05.05.2014
comment
кто является репозиторием для данного адреса BAR? Это зависит от карты pci? или это процессор, который выбирает адрес (так что если я заменю карту на другую, я, вероятно, получу тот же адрес)? - person ransh; 04.11.2015