如何理解 mmap 的 offset

2022-09-19 12:12:05 +08:00
 lxz6597863

最近看到 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,为什么不会出错呢

847 次点击
所在节点    问与答
3 条回复
lxz6597863
2022-09-19 12:13:37 +08:00
lxz6597863
2022-09-19 12:30:30 +08:00
或者说


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 多少呢?
zzxgz
2023-01-14 01:08:27 +08:00
我认为 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

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/881224

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX