Сопоставление дескриптора Rx dma в драйвере устройства, что это на самом деле означает, означает ли это сопоставление пакетов на физическом сетевом адаптере со структурным объектом в памяти

Я просматриваю драйвер realtek r8169 и немного застрял в этой строке.

    tp->RxDescArray = dma_alloc_coherent(&pdev->dev, R8169_RX_RING_BYTES,
                     &tp->RxPhyAddr, GFP_KERNEL);

В книге «Драйвер устройства Linux» написано, что это ...Function handles both the allocation and the mapping of the buffer, ...arguments are device structure and the size of buffer needed

Что это значит: распределение я мог бы понять, но что это значит под mapping

означает ли это, что то, что я когда-либо имел в pdev, представляло дескриптор rx устройства, то же самое, что я буду иметь в том, что возвращается из dma_alloc_coherent, который является tp->RxDescArray дескриптором как программный объект? tp-›RxDescArray имеет тип RxDesc в драйвере, который выглядит следующим образом:

    struct RxDesc {
        __le32 opts1;
        __le32 opts2;
        __le64 addr;
     };

если это то, что представляет собой сопоставление: означает, что все, что у меня есть в pdev, представляет дескриптор rx устройства на физическом устройстве, то же самое, что у меня будет в программном объекте tp->RxDescArray, - это то, что означает сопоставление. тогда кто определяет структуру RxDesc, включено ли это в таблицу данных. Если да, то в каком разделе? В таблице данных есть множество разделов. должно быть яснее `

Обновить Также хотелось бы знать, что делает эта строка

  tp->RxDescArray[NUM_RX_DESC - 1].opts1 |= cpu_to_le32(RingEnd);

tp->RxDescArray имеет тип RxDesc (не массив RxDesc) этот оператор отмечает end переменной RxDescArray означает, что каждый следующий будет происходить после этого end адреса

Обновление 2

Мне нужна информация о том, есть ли у меня таблица данных, скажем, из драйвера Intel E1000E или драйвера r8169 от RealTek, а затем, как я создаю структуру Rx Descrptor, в приведенном выше коде она делает что-то вроде этого

    struct RxDesc {
    __le32 opts1;
    __le32 opts2;
    __le64 addr;
     }

что такое opts1, opts2 и addr? как автору этого драйвера пришла в голову идея создания этой структуры. Только у него был даташит с множеством шестнадцатеричных значений


person user786    schedule 06.02.2021    source источник
comment
Отображение DMA – это трансляция между адресным пространством ЦП (виртуальный адрес) и адресным пространством устройства (адрес шины).   -  person 0andriy    schedule 06.02.2021
comment
Можете ли вы взять добычу на вопрос об обновлении   -  person user786    schedule 06.02.2021


Ответы (2)


Доступы DMA транслируются IOMMU, который в системах Intel описан в Спецификация технологии виртуализации Intel® для направленного ввода-вывода (VT-d).

Функция dma_alloc_coherent выделяет память и вводит отображение в таблицы страниц DMA, чтобы память была доступна для устройства. Возвращаемый адрес не является виртуальным или физическим адресом памяти, а является виртуальным адресом ввода-вывода (IOVA), который устройство может использовать для доступа к памяти. IOVA преобразуется IOMMU в адрес физической памяти, когда устройство выполняет DMA.

IOMMU предотвращает доступ любого устройства к физической памяти, которая не была сопоставлена ​​с адресным пространством ввода-вывода этого конкретного устройства.

person prl    schedule 14.02.2021
comment
Итак, для IOMMU мне нужно включить физический уровень в драйвере RTL r8169, он регистрирует mdio: phy in mac и инициализирует физический уровень, назначая mii_bus->read=someting_function ns mii_bis->write=something_write_function. и в функции инициализации phy он просто выполняет phy_write_paged и writel и т. д. Итак, мне нужно зарегистрировать и инициализировать phy, чтобы начать с MMIO/DMA/или любого взаимодействия с устройством? - person user786; 14.02.2021
comment
Инициализация phy не имеет ничего общего с DMA. Но вы должны инициализировать phy, прежде чем сможете отправлять или получать что-либо по сети. - person prl; 14.02.2021
comment
Значит ли это, что я не могу записывать данные или значения в регистр nic, используя writel, если я не зарегистрировал или не инициализировал phy - person user786; 14.02.2021
comment
phy не имеет ничего общего с доступом процессора к регистрам NIC. Вы, кажется, очень запутались в том, как работает сетевая карта, и продолжать задавать вопросы здесь — не лучший способ получить понимание. Кроме того, ваш вопрос продолжает расширяться от исходного вопроса о сопоставлениях DMA до совершенно не связанных между собой областей о том, как работает сетевой адаптер. Переполнение стека пытается сохранить каждый вопрос по одной теме. - person prl; 14.02.2021
comment
Хорошо, я думаю, что понял, поэтому mdio/media access controller/phy (из модели OSI) должен быть в драйвере, чтобы заставить драйвер подключаться к сети из you have to initialize the phy before you can send or receive anything on the network для этого, я также вижу, что его необходимо настроить для регистрации устройства NIC. это просто делается с помощью записи на устройство, например, с использованием семейства функций writel/writeb/writew. Реализовано mdio, для которого требуется запись/настройка ввода/вывода на устройство для phy/mdio. Это из кода таких драйверов, как E1000E/r8169 драйверы. - person user786; 15.02.2021
comment
последний вопрос. Таким образом, в init_phy из r8169 используются следующие функции: , phy_write_paged, так что есть и физические регистры. Существуют ли эти физические регистры для реализации физического уровня OSI и таких функций, как phy_write_paged, куда после выполнения они записываются? эти вызовы функций находятся в phy_init и вызываются, когда устройство переходит в открытую функцию netdev_ops - person user786; 15.02.2021

RingEnd отмечает конец кольцевого буфера для сетевой карты. Так что механизм DMA NIC знает, куда перейти к началу кольцевого буфера.

person hkall    schedule 07.02.2021
comment
Почему конец кольцевого буфера должен был быть записан? Вы имеете в виду, что сетевая карта может не знать о программном объекте struct RxDesc, какая переменная начинается, где и где заканчивается, пожалуйста, уточните - person user786; 09.02.2021
comment
Как сетевая карта должна знать размер кольцевого буфера, который вы установили в драйвере? Вот для чего хорош маркер конца кольца. - person hkall; 10.02.2021
comment
Должен ли каждый элемент RxDesc, указанный в указателе tp->RxDescArray, быть помечен маркером конца кольца, например tp->RxDescArray[NUM_RX_DESC - 1].opts1 |= cpu_to_le32(RingEnd);? - person user786; 10.02.2021
comment
Конечно нет. Сколько концов может иметь кольцевой буфер? Вы задаете ряд низкоуровневых вопросов, которые показывают, что вы упускаете из виду основы. Поэтому я бы рекомендовал вам сначала понять общую картину и такие понятия, как кольцевые буферы дескрипторов DMA. Вместо того, чтобы спрашивать, что делает функция, посмотрите на код, где и в каком контексте эта функция используется. - person hkall; 11.02.2021