Какую инструкцию использует Linux, чтобы направить процессор Intel на настройку передачи DMA?

#linux #linux-kernel #operating-system

#linux #linux-ядро #операционная система

Вопрос:

Я знаю, что существуют API-интерфейсы ядра, которые драйверы устройств могут использовать для установки направления передачи, количества и т.д., Но я хотел бы понять, какую инструкцию CPU использует api для информирования cpu о начале этой передачи DMA?

Комментарии:

1. Какое оборудование DMA? Большинство устройств имеют собственную встроенную DMA или управление шиной, которые использует драйвер устройства (и нет API ядра). Также обратите внимание, что весь смысл DMA заключается в том, что процессор не задействован, поэтому «сообщить процессору …» не имеет смысла.

2. Если я могу обойти процессор, то что мешает пользовательской программе напрямую вызывать мастеринг шины, как это делает драйвер устройства? Где здесь безопасность?

3. Единственная защита заключается в том, что вы не можете получить доступ к отображенным в память регистрам, используемым для связи с контроллером dma из программы пользовательского режима. В конце концов, вы ограничены интерфейсом системного вызова для запроса операций с диском.

4. Пожалуйста, напишите это как ответ. Тогда я могу отдать вам должное, выбрав правильный ответ

Ответ №1:

В большинстве случаев каждое устройство имеет свои собственные возможности управления DMA / bus, встроенные в устройство; и драйвер устройства использует управление DMA / bus устройства («специфичным для устройства» образом) без участия какого-либо API ядра. В этих случаях, как правило, ОС запрещает другому коду использовать регистры устройства (запрещая доступ к портам ввода-вывода или не отображая «регистры ввода-вывода с отображением в памяти» в области, которые могут использоваться обычным кодом); таким образом, другому коду также запрещено использовать управление DMA / bus устройства.

Бывают редкие случаи, когда возможности управления DMA / bus не встроены в конкретное устройство; но являются отдельным устройством сами по себе. Это включает в себя древний «чип контроллера DMA» на ПК и несколько более современных устройств (например, «Ускоритель ввода-вывода Intel Quickdata»). В этих случаях; у вас может быть драйвер устройства для механизма DMA, который могут использовать другие драйверы устройств. какой-то «специфичный для движка DMA» интерфейс, или он может (если аппаратное обеспечение чрезвычайно распространено) быть «более интегрированным» в ядро (таким образом, «код драйвера движка DMA» встроен в ядро, а «специфичный для движка DMA интерфейс» больше похож на API ядра).

Также обратите внимание, что:

a) для современных компьютеров почти все программное обеспечение использует виртуальные адреса, но аппаратные устройства могут использовать только физические адреса. Это означает, что в какой-то момент виртуальные адреса (для одного виртуального адресного пространства) необходимо преобразовать в физические адреса, которые может использовать устройство.

б) для современных операционных систем часто драйверы устройств передают данные непосредственно в / из памяти, принадлежащей процессу (в пользовательском пространстве). В этих случаях драйвер устройства должен убедиться, что управление виртуальной памятью ядра не мешает передаче (например, убедитесь, что ядро не может / не будет отправлять содержимое ОЗУ для подкачки и освобождения ОЗУ, пока устройство передает данные). Обычно драйвер устройства делает это, прося ядро «закрепить» виртуальную память перед запуском DMA / bus mastering (и прося ядро «открепить» после).

c) для современных компьютеров может быть задействован IOMMU. Если IOMMU используется для повышения безопасности (а не только для виртуализации или «сквозного доступа»); тогда драйверу устройства может потребоваться запросить у ядра настройку IOMMU перед началом любого освоения DMA / шины (и если этого не произойдет, аппаратное обеспечение IOMMU может отказаться разрешить устройствупередача данных). В некоторых случаях IOMMU также можно использовать для переназначения ввода-вывода, чтобы исправить / избежать ограничений устройства — например, если устройство может использовать только 32-разрядные адреса, но ему необходимо передавать данные на / с 64-разрядного адреса, тогда IO MMU можно настроить для переназначения области в адресдиапазон, который поддерживает устройство (и предотвращает необходимость использования драйвером устройства «буфера возврата» в ОЗУ, где данные копируются во временный буфер перед передачей DMA или копируются из временного буфера после передачи DMA).

По этим причинам; ядро может предоставить интерфейс, который драйверы устройств должны использовать перед началом передачи DMA / bus mastering и после завершения передачи DMA / bus mastering; но это не следует рассматривать как часть настройки самой передачи DMA / bus mastering.