Сравнение памяти PCI Express BAR с базовым пониманием

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

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

Мои вопросы заключаются в следующем:

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

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

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

Ответ 1

Из вашего запроса ясно, что вы хотите написать драйвер для ведомого устройства PCIe. Чтобы понять схему событий, происходящих за переносом PCIe, в Интернете доступно много материала (например, перечисление шины PCIe, периферийное отображение адресов в память и т.д.). Да, ваше понимание правильное в отношении отображения регистров PCIe в память, и вы можете их читать и записывать. (Например, в случае драйвера устройства linux PCIe вы можете сделать это с помощью "ioremap"). Адресная шина используется для указания физического адреса. Когда процессору или устройству, поддерживающему DMA, необходимо прочитать или записать в ячейку памяти, это указывает на расположение памяти на адресной шине. Ничего больше, чтобы добавить к этому. "Перечисление шины PCIe" ответит на ваш второй вопрос. Ваш третий вопрос расплывчатый. Вы имеете в виду подчиненное устройство PCIe. Предполагая, что да, вы можете передавать данные между подчиненным устройством PCIe и хостом с помощью контроллера DMA. Я работаю над проектом, который включает в себя "PCIe-DMA", подключенный к хосту через шину PCIe. Действительно зависит от вашего дизайна и реализации. Так что в моем случае PCIe-DMA сам по себе является подчиненным устройством PCIe на целевой плате, подключенной к хосту через PCIe.

Ответ 2

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

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

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

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

Термин DMA, по-видимому, злоупотребляет, а не мастеринг шины, который, я считаю, является правильным термином в PCIe. В PCIe каждое устройство может быть ведущим шиной (если разрешено в бит 2 командного регистра). Это делается путем отправки MRD, MWr TLP на другие устройства в шине (но, как правило, в системную память) и прерывания сигнализации в CPU.

Ответ 3

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

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

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

3> да, вы можете использовать как инициированные DMA, так и инициированные ЦП операции на этих БАРС.

- flyinghigh