Когда компьютер запускается, BIOS или операционная система проверяет каждое устройство PCI, чтобы узнать, сколько адресного пространства оно хочет. Затем он выделяет соответствующее пространство и сообщает каждому устройству PCI, где начинается его пространство, чтобы устройство PCI могло отвечать на запросы чтения и записи в этом диапазоне.

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

На печатной плате уже есть «внеполосный» способ различения PCI-устройств: линия IDSEL. Это то, что используется во время перечисления PCI, прежде чем каждому устройству будет выделено место. Так почему бы не использовать это и для доступа после перечисления, и сохранить некоторую логику декодирования на устройстве PCI? Это было бы как-то медленнее или что-то в этом роде?

1 ответ1

1

Как правило, им не нужно использовать одно и то же адресное пространство. Разделение адресных пространств устройства - это именно то, для чего нужен IOMMU, и может быть полезно по ряду причин:

  • Он может безопасно позволить виртуальной машине получать прямой доступ к физическому оборудованию с помощью собственных драйверов.
  • Он отделяет возможности адресации устройства от физического адресного пространства. Другими словами, он позволяет вам иметь устройства, которые могут выполнять только 32-битную адресацию доступа к данным в любом месте физической памяти, даже выше, чем первый 4G.
  • Это позволяет более тщательно изолировать устройства друг от друга, что может значительно повысить безопасность системы.

Что касается того, почему это не поведение по умолчанию и почему линия IDSEL не используется для этого, я не могу сказать точно, так как я не очень хорошо знаю историю разработок PCI. Моим первым предположением будет то, что изначально так было проще переносить драйверы для карт ISA на PCI (ISA предполагает единое адресное пространство). Кроме того, IOMMU не совсем легкая в разработке аппаратура, и только недавно они стали широко доступны на платформах x86 (и до сих пор не гарантированы, у многих чипов Intel их еще нет, и у многих недорогих чипов AMD). тоже не надо)

Возможно, стоит отметить, что с PCI Express, на самом деле, есть преимущество в разделении адресного пространства между устройствами, а именно в том, что он позволяет вам выполнять передачу между устройствами (хотя большинство платформ не поддерживают это должным образом), что может быть очень полезным в больших сеточных установках, которые используют RDMA (вы можете получать данные с удаленных устройств напрямую, без необходимости в ОС удаленной системы в качестве посредника после настройки передачи).

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .