#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 не приведет к желаемому результату.