Определить память DMA в / proc / mtrr и / proc / iomem? - PullRequest
0 голосов
/ 31 января 2020

Интересно, есть ли способ определения памяти, используемой для отображения DMA в некоторых файлах pro c, таких как mtrr и iomem, или через lspic -vv.

В моем /proc/mtrr, есть только одна область uncachable, и она, кажется, указывает на «PCI-отверстие» на 3,5-4 ГБ, почти.

base=0x0e0000000 ( 3584MB), size=  512MB, count=1: uncachable

Путем перекрестной проверки с помощью /proc/iomem этого Регион 512 МБ, только последние 21 МБ до 4 ГБ НЕ потребляются шиной PCI, и этот участок размером 21 МБ занят такими вещами, как pnp/IOAPIC/Reserved.

Итак, мои вопросы:

  1. Какова подпись региона DMA в /proc/mtrr и /proc/iomem
  2. Есть ли другие места, такие как другие файлы и команды pro c, которые я могу использовать для просмотра региона DMA?
  3. Кажется, добавив строки в /proc/mtrr, привилегированный пользователь может изменить механизм кэширования любой памяти во время выполнения. Таким образом, помимо того факта, что DMA должен быть меньше 32 бита (при условии, что без DA C), существуют ли другие специальные требования для выделения памяти DMA? Если дальнейших требований нет, возможно, единственная подсказка, которую я могу использовать для идентификации памяти DMA, будет /proc/mtrr?

1 Ответ

1 голос
/ 01 февраля 2020

DMA (прямой доступ к памяти) - это именно то, где устройство получает доступ к самой памяти (без запроса ЦП на передачу данных на устройство). Для (упрощенного) примера прямого доступа к памяти; Представьте, что случайный процесс выполняет write(), и это поднимается вверх (через VFS, через файловую систему, через любой уровень RAID и т. д. c), пока не достигнет какого-либо драйвера контроллера диска; затем драйвер контроллера диска сообщает своему дисковому контроллеру «перенести N байтов с этого физического адреса в это место на диске и сообщить мне, когда передача будет выполнена». Большинство устройств (контроллеры дисков, сетевые карты, видеокарты, звуковые карты, контроллеры USB и т. Д.) Каким-то образом используют DMA. Под нагрузкой все устройства вашего компьютера могут выполнять тысячи передач (через. DMA) в секунду, потенциально разбросанных по всей используемой оперативной памяти.

Насколько я знаю; в /proc/ нет файлов, которые бы помогли (скорее всего, потому что он меняется слишком быстро и слишком часто, чтобы беспокоиться о том, чтобы предоставить какие-либо файлы, и у всех было бы очень мало причин когда-либо захотеть взглянуть на него).

MTTR в основном не имеют значения - они контролируют только кэши ЦП и не влияют на запросы DMA от устройств.

/proc/iomem также не имеет значения. Он только показывает, какие области устройства используют для своих собственных регистров и не имеет ничего общего с оперативной памятью (и, следовательно, не имеет ничего общего с DMA).

Примечание 1: DMA не обязательно должен быть в нижней 32 -бит (например, большинство устройств PCI поддерживают мастеринг 64-битного DMA / шины в течение десяти и более лет); а для редких устройств, которые не поддерживают 64-разрядные, Linux может использовать IOMMU для повторного сопоставления своих запросов (поэтому устройство считает, что оно использует 32-разрядные адреса, хотя на самом деле это не так).

Примечание 2: Когда-то давно (go) были "микросхемы контроллера ISA DMA". Как и сам автобус ISA; они были ограничены первыми 16 МБ физического адресного пространства (и имели другие ограничения - например, не поддерживали передачи, которые пересекают границу 64 КБ). У этих чипов действительно не было причин существовать, так как контроллеры гибких дисков устарели. У вас может быть /proc/dma, описывающий их (но если вы это сделаете, то, вероятно, говорит только «каскад», чтобы указать, как чипы подключаются, без устройств, использующих их).

...