Я хочу иметь кольцевой буфер с огромной страницей (2MByte) с моим необработанным устройством чтения сокетов UDP в linux (Ubuntu 18.04). Я могу создать необработанный сокет:
socket_fd = socket (AF_PACKET, SOCK_RAW, 0);
Я мог бы создать кольцевой буфер обычной памяти (4 КБ) с помощью mmap:
void * rxring_buffer = mmap(nullptr, size_in_bytes, PROT_READ | PROT_WRITE, MAP_SHARED, socket_fd, 0);
Однако я не вижу очевидного пути к использованию кольцевого буфера с огромной страницей. Первоначально я пытался использовать MAP_HUGETLB с mmap. Однако, как видно из https://elixir.bootlin.com/linux/latest/source/tools/testing/selftests/vm/map_hugetlb.c, эта опция, похоже, работает только с MAP_ANONYMOUS, который не допускает поддержку файла (или сокета).
Я могу создать огромный буфер общей памяти с помощью:
int mem_fd = open("/mnt/huge/hugepagefs", O_CREAT | O_RDWR, 0755);
void * big_buff_ptr = mmap(nullptr, size_in_bytes,
PROT_READ | PROT_WRITE,
MAP_SHARED, mem_fd, 0));
, но я не вижу пути для его назначения кольцевому буферу сокета.
Есть ли способ назначить общую память огромной страницы кольцевому буферу?