Поскольку этот домен для меня новый, у меня есть некоторые затруднения в понимании PCIe. Раньше я работал над некоторыми протоколами, такими как I2c, spi, uart, can, и большинство из этих протоколов имеют четко определенные документы (максимум 300 страниц). Почти во всех упомянутых протоколах с точки зрения программного обеспечения приложение должно было просто записывать данные в регистр данных, а обо всем остальном позаботится оборудование. Как, например, в Uart, мы просто загружаем данные в регистр данных, и данные отправляются со стартовым, контрольным и стоповым битами.
Я прочитал несколько вещей о PCIe в Интернете, и вот понимание, которое у меня есть до сих пор.
Во время загрузки системы микропрограмма BIOS определит объем памяти, необходимый для устройства PCIe, с помощью волшебной процедуры записи и чтения в BAR в устройстве PCIe (конечной точке). Как только он это выяснит, он выделит адресное пространство для устройства в карте системной памяти (фактическая оперативная память не используется в HOST, память находится только в конечной точке. Enpoint - это память, отображаемая в Host). Я вижу, что у PCIe есть несколько полей заголовков, которые микропрограмма BIOS определяет на этапе перечисления шины.
Теперь, если Хост хочет установить бит в регистре конфигурации, расположенном по адресу 0x10000004 (адрес, отображаемый для enpoint), хост сделает что-то вроде (предположим, что существует только 1 enpoint без ветвей):
*(volatile uint32 *)0x10000004 |= (1<<Bit_pos);
1. Как корневой комплекс знает, куда направить эти сообщения, потому что BAR находится в конечной точке. Выполняет ли RC широковещательную рассылку на все конечные точки, а затем каждая конечная точка сравнивает адрес с адресом, запрограммированным в BAR, чтобы увидеть, должен ли он его принимать или нет? (Как фильтр принятия в CAN).
Добавляет ли RC всю информацию, относящуюся к заголовку PCIe (хост просто записывает по адресу)?
Если хост записывает в 0x10000004, будет ли он писать для регистрации в местоположении 0x4 в конечной точке?
Как хост узнает, что конечной точке задано адресное пространство, начинающееся с 0x10000000?
RC похож на роутер?
Вышеупомянутые запросы были связаны с, только если регистр конфигурации в enpoint необходимо было прочитать или записать. Следующие ниже запросы относятся к передаче данных от хоста к конечной точке.
1. Предположим, хост запрашивает конечную точку сохранить определенные данные, присутствующие в драме, на SSD, и, поскольку SSD подключен к слоту PCIe, будет ли PCIe также выполнять передачи DMA? Например, является ли специальный BAR в enpoint, который хост записывает, с начальным адресом в Dram, который должен быть перемещен в ssd, что, в свою очередь, запускает PCIe для выполнения передачи DMA от хоста к enpoint?
Я пытаюсь понять PCIe относительно любых других протоколов, над которыми я работал до сих пор. Мне это кажется немного новым.