#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;
}
Question> 我理解MEMBER_OFFSET的意思。但是,我没有得到以下行的含义:
pb->dma_buf_addr += MEMBER_OFFSET(struct pkt_buf, dma_buf)
基本上, 的值MEMBER_OFFSET(struct pkt_buf, dma_buf)
是成员变量dma_buf
in的字节偏移值struct pkt_buf
。