最近看到 AF_XDP
https://www.kernel.org/doc/html/v4.19/networking/af_xdp.html#rings
/usr/include/linux/if_xdp.h , 系统定义了 4 个 mmap offset
/* Pgoff for mmaping the rings */
#define XDP_PGOFF_RX_RING 0
#define XDP_PGOFF_TX_RING 0x80000000
#define XDP_UMEM_PGOFF_FILL_RING 0x100000000ULL
#define XDP_UMEM_PGOFF_COMPLETION_RING 0x180000000ULL
使用示例
https://github.com/libbpf/libbpf/blob/b91f53ec5f1aba2a9d01dc00c4434063abd921e8/src/xsk.c#L265
https://github.com/libbpf/libbpf/blob/b91f53ec5f1aba2a9d01dc00c4434063abd921e8/src/xsk.c#L282
如上,在这些 mmap 用法上 offset 都远大于 length,为什么不会出错呢
1
lxz6597863 OP |
2
lxz6597863 OP 或者说
fd = socket(AF_XDP, SOCK_RAW, 0); map = mmap(NULL, off.cr.desc + umem->config.comp_size * sizeof(__u64), PROT_READ | PROT_WRITE, MAP_SHARED | MAP_POPULATE, umem->fd, XDP_UMEM_PGOFF_COMPLETION_RING); 这个 fd 能 mmap 映射的最大 offset 多少呢? |
3
zzxgz 2023-01-14 01:08:27 +08:00 1
我认为 offset 大于 length 是没问题的。
我看了一下 mmap 的 man page( https://man7.org/linux/man-pages/man2/mmap.2.html),里面说道: ``` The contents of a file mapping (as opposed to an anonymous mapping; see MAP_ANONYMOUS below), are initialized using length bytes starting at offset offset in the file (or other object) referred to by the file descriptor fd. ``` 我的理解是,这个函数是在 fd+offset 这个地址上,去初始化 length 这么多个 bytes 。所以 offset 跟 length 谁大谁小,应该不重要。 我最近也在看这个 AF_XDP ,一开始看的也是你这个例子。后来我发现了一个可以多线程,每个线程控制一个 AF_XDP socket 的例子,可能你以后也会用上: https://github.com/xdp-project/bpf-examples/commits/master/AF_XDP-forwarding/xsk_fwd.c |