Я просматриваю драйвер 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? как автору этого драйвера пришла в голову идея создания этой структуры. Только у него был даташит с множеством шестнадцатеричных значений