gpt4 book ai didi

c - dma_buf_addr的地址加上偏移量有什么用?

转载 作者:太空宇宙 更新时间:2023-11-04 04:22:33 25 4
gpt4 key购买 nike

#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)的值是struct pkt_buf中成员变量dma_buf的字节偏移值。

最佳答案

这段代码使用了“struct hack”的变体,后来被“灵活数组成员”所取代。 memregp 都没有在显示的代码中定义,函数(宏?)ef_memreg_dma_addr() 也没有定义,因此存在推测元素在这里。

但是,它正在做这样的计算 if

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 字段之后。

关于c - dma_buf_addr的地址加上偏移量有什么用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45111569/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com