Проблема, Объединяющая Сырое Сокет с Огромными страницами - PullRequest
1 голос
/ 18 марта 2020

Я хочу иметь кольцевой буфер с огромной страницей (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));

, но я не вижу пути для его назначения кольцевому буферу сокета.

Есть ли способ назначить общую память огромной страницы кольцевому буферу?

...