Как работают базовые регистры адресов (BAR) на плате PCI?

Я пытаюсь понять, как работают базовые регистры адресов (BAR) на плате PCI, вот как я думаю, они работают:

  • Каждая функция на карте PCI имеет 6 полей BAR, и каждое поле BAR 32-разрядный размер.
  • Производитель PCI-карты будет записывать в каждом поле BAR, сколько памяти, которую хочет выделить операционная система, и каждое поле BAR также укажет, хочет ли эта выделенная память использовать IO с отображением памяти или отображаемый порт IO .
  • Операционная система будет считывать каждое поле BAR и будет выделять указанную память, и будет записывать начальный адрес для каждой выделенной памяти блок в соответствующем поле BAR.

Правильно ли я?

3 голоса | спросил Christopher 9 +03002017-10-09T10:15:45+03:00312017bEurope/MoscowMon, 09 Oct 2017 10:15:45 +0300 2017, 10:15:45

1 ответ


4

Этот вопрос следует перенести в stackoverflow. Может быть, кто-то это сделает.

  

Правильно ли я?

По существу, да.

Каждый БАР содержит адрес области связи. Этот адрес может быть установлен и считываться операционной системой как часть более крупной конфигурации устройства.

Для каждого БАР (независимо) устройство хранит только некоторые из бит, которые процессор может написать, и он игнорирует другие. Из 28 возможных бит (в 32-битной конфигурации BAR) устройство хранит только некоторое количество верхних бит и игнорирует оставшиеся младшие бит.

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

Если операционная система записывает -1 (т.е. все 1) в BAR и считывает ее обратно, она вернет те 1 только для (верхних) битов, которые этот BAR в устройстве сохраняет /представляет, и получает обратные нули для младших бит, этот BAR не сохраняет /не представляет.

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

После выделения соответствующего адресного пространства он записывает это реальное значение в BAR (заменяя предыдущую запись -1). Теперь BAR настроен правильно.

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

Операционная система официально не запрашивает аппаратное обеспечение для размера и amp; выравнивание области связи, а использует этот трюк для записи всех 1 и наблюдения эффекта.

Аппаратное обеспечение не обязательно должно знать, что операционная система «просто шутит» об -1 (или, в противном случае, фактически идет о создании запроса); он просто выполняет то, что он всегда делает с записью в BAR (т. е. сохраняет верхние N бит), и он чтит запрос чтения (BAR), как обычно (путем возврата тех верхних N бит, которые объединены с нулями для неструктурированных младших бит ).

ответил Erik Eidt 10 +03002017-10-10T21:42:53+03:00312017bEurope/MoscowTue, 10 Oct 2017 21:42:53 +0300 2017, 21:42:53

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132