Какова цель обхода переназначения в драйвере Thunderbolt?

#macos #dma #iokit #kernel-extension #iommu

#macos #dma #iokit #расширение ядра #iommu

Вопрос:

Мой вопрос просто из любопытства, я не являюсь разработчиком драйверов macOS Thunderbolt, поэтому у меня нет опыта в этом.
Я наткнулся на эту страницу о драйверах thunderbolt и IOMMU в macOS. Из того, что я понял, когда драйвер запрашивает адрес памяти, полученный адрес не является физическим, а представляет собой виртуальный адрес, отображаемый IOMMU. Я думаю, это связано с рисками безопасности при использовании DMA без IOMMU. Однако у драйвера есть несколько вариантов обхода переназначения, например, вызов IODMACommand initWithSpecification метода объекта с mappingOptions установленным значением kBypassed . Однако на странице говорится, что вызов подобного метода для получения немаркированного физического адреса и использования его для DMA приведет к поломке драйвера.
Итак, мой вопрос: в драйвере thunderbolt с какой целью запрашивается не сопоставленный физический адрес, если этот адрес нельзя использовать для DMA?
Извините, если этот вопрос может показаться глупым, но, как я уже сказал, у меня нет опыта работы с такого рода материалами, мне просто очень любопытно.

Ответ №1:

На самом деле нет причин делать это в драйвере Thunderbolt, потому что, как вы говорите, устройство Thunderbolt может «видеть» адреса только в виртуальном адресном пространстве IOMMU.

Вы бы использовали неотмеченные адреса, если бы писали драйвер для чего-то, что взаимодействует с системной памятью, используя реальные физические адреса с точки зрения процессора. У сторонних разработчиков не так много возможностей делать подобные вещи на реальном Mac, но при написании драйверов для (пара-) виртуализированного «оборудования» в виртуальных машинах или, предположительно, при написании драйверов для Hackintoshes, безусловно, бывают ситуации, когда вы разговариваете с реальным или виртуальным устройством илислужба, которая не находится «за» IOMMU — обычно это означает что-либо, чего нет ни на одной шине PCIe.

Например, я использовал kIOMemoryMapperNone опцию to IOMemoryDescriptor:: getPhysicalSegment() в своем драйвере для Virtio memory balloon. Устройство memory balloon на самом деле представляет собой некоторый код на хосте виртуальной машины, который работает с адресами физических страниц VM-CPU, поэтому, если в системе виртуальной машины есть (виртуализированный) IOMMU, отправка «отображенных» физических адресов memory balloon не приведет к желаемому результату.