C - 在dma_buf_addr地址添加偏移量有什么用?


#define MEMBER_OFFSET(c_type, mbr_name) ((uint32_t) (uintptr_t)(&((c_type*)0)->mbr_name))
#define CACHE_ALIGN __attribute__((aligned(EF_VI_DMA_ALIGN)))
struct pkt_buf {
struct pkt_buf* next;
ef_addr dma_buf_addr;
int id;
uint8_t dma_buf[1] CACHE_ALIGN;
};

struct pkt_buf* pkt_bufs [N_BUFS];
for( i = 0; i < N_BUFS; ++i ) {
struct pkt_buf* pb = (struct pkt_buf*) ((char*) p + i * 2048);
pb->id = i;
pb->dma_buf_addr = ef_memreg_dma_addr(&memreg, i * 2048);
pb->dma_buf_addr += MEMBER_OFFSET(struct pkt_buf, dma_buf); // why do this?
pkt_bufs[i] = pb;
}

问题>我理解MEMBER_OFFSET的含义。但是,我不明白以下行的含义:

pb->dma_buf_addr += MEMBER_OFFSET(struct pkt_buf, dma_buf)

基本上,MEMBER_OFFSET(struct pkt_buf, dma_buf)的值是以字节为单位的成员变量的偏移值,dma_bufstruct pkt_buf为单位。

这段代码使用的是"struct hack"的变体,后来被"灵活的数组成员"所取代。 所示代码中既没有定义memreg也没有定义p,函数(宏?ef_memreg_dma_addr(),所以这里有猜测的成分。

但是,它正在进行计算,如果

pb->dma_buf_addr = ef_memreg_dma_addr(&memreg, i * 2048);

pb->dma_buf_addr点设置为struct pkt_buf的开头,然后在分配之后:

pb->dma_buf_addr += MEMBER_OFFSET(struct pkt_buf, dma_buf);

pb->dma_buf_addr指向数据包中dma_buf阵列的地址。 使用i * 2048表明p是一个连续的内存块,拆分为 2 KiB 页,DMA 缓冲区紧跟在 ID 字段之后。

相关内容

  • 没有找到相关文章

最新更新