Сравнение памяти 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