Несколько записей диапазона адресов PCIe в / proc / mem log - PullRequest
0 голосов
/ 19 ноября 2018

Я использую dma_alloc_coherent() в своем собственном драйвере для получения виртуальных и шинных адресов.

res->KernelAddress = (u64)dma_alloc_coherent( &DevExt->pdev->dev, size, &res->BusAddress, GFP_ATOMIC );

При печати (% llx) адреса шины (res-> BusAddress) я получил 80009000 в качестве одного. Я проверил журнал / proc / iomem, чтобы проверить диапазон, но есть несколько записей.

Журнал / proc / iomem показан ниже:

10000000-10000fff : /pcie-controller@10003000/pci@1,0
10003000-100037ff : pcie-pads
10003800-10003fff : pcie-afi
10004000-10004fff : /pcie-controller@10003000/pci@3,0
40000000-4fffffff : pcie-config-space
50100000-57ffffff : pcie-non-prefetchable
  50800000-52ffffff : PCI Bus 0000:01
    50800000-5087ffff : 0000:01:00.0
    51000000-51ffffff : 0000:01:00.0
    52000000-52ffffff : 0000:01:00.0
58000000-7fffffff : pcie-prefetchable
  58000000-58ffffff : PCI Bus 0000:01
    58000000-58ffffff : 0000:01:00.0
80000000-d82fffff : System RAM
  80080000-810fafff : Kernel code
  8123f000-814b3fff : Kernel data
d9300000-efffffff : System RAM
f0200000-275ffffff : System RAM
276600000-2767fffff : System RAM
  1. Является ли 80009000 действительным? К какому разделу он относится?
  2. Необходимо ли использовать dma_mmap_coherent() после dma_alloc_coherent() для правильного отображения?

Заранее спасибо !!

1 Ответ

0 голосов
/ 19 ноября 2018

С https://www.kernel.org/doc/Documentation/bus-virt-phys-mapping.txt (некоторые детали этого файла теперь устарели, но это лучший обзор проблемы):

По сути, три способа адресации памяти (это «реальная память», то есть обычное ОЗУ (подробнее об этом см. далее):

  • Процессор не переведен.Это «физический» адрес.Физический адрес 0 - это то, что ЦП видит, когда он обнуляет шину памяти.

  • Преобразованный адрес ЦП.Это «виртуальный» адрес, который полностью встроен в сам ЦП, а ЦП выполняет соответствующие переводы в «ЦП не переведено».

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

Теперь на обычных ПК адрес шины точно такой же, как физический адрес, и все очень просто.Тем не менее, они настолько просты, потому что память и устройства используют одно и то же адресное пространство, и это не всегда верно для других настроек PCI / ISA.

Суть в том, что ответ на ваш вопрос зависит от архитектуры.

В вашем /proc/iomem фрагменте обратите внимание, что этот список вложен.Адрес 80009000 кажется разделенным на две секции, потому что одна из этих секций является подмножеством другой. Если бы этот адрес был физическим адресом памяти, то да, это был бы "адрес кода ядра", что было бы странно, если вернуться из dma_alloc_coherent.Это наводит меня на мысль, что физический адрес не совпадает с адресом шины в вашей архитектуре.

dma_alloc_coherent также отображает память в виртуальном адресном пространстве ядра, поэтому вам не следуетнужно сделать что-нибудь еще для доступа к нему из вашего кода.(dma_mmap_coherent используется для отображения памяти в виртуальном адресном пространстве пользователя.)

...