Как разделить часть памяти с помощью mmap - PullRequest
2 голосов
/ 15 апреля 2020

У меня есть 3 инструмента, и мне нужно, чтобы они использовали одни и те же первые 4096 байтов своей собственной памяти. Каждый инструмент может увеличить свою память независимо.

Итак, резюме:

tool1:

0 - 4096: совместно используется 1,2,3

4097 - 8192: внутренний для 1

tool2:

0 - 4096: общий для 1,2,3

4097 - 16384: внутренний для 2

tool3:

0 - 4096: общий для 1,2,3

4097 - 12288: внутренний для 3

Можно ли использовать mmap для достижения моей цели, потому что я предпочитаешь ммап? Если доступно другое решение, возможно, я мог бы адаптировать свой код.

Заранее благодарю за помощь.

1 Ответ

0 голосов
/ 15 апреля 2020

Существуют серьезные проблемы с безопасностью и ремонтопригодностью при отображении и использовании первой страницы виртуальной памяти, но вы можете сделать это, если действительно хотите.

Сначала вам нужно настроить sysctl, который мешает вам что-либо делать вот так (по уважительной причине):

sudo sysctl -w vm.mmap_min_addr=0

Затем используйте mmap как обычно для общей памяти, но с MAP_FIXED. Теперь вы можете читать и записывать на первую страницу (включая указатель NULL):

#include <sys/mman.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdio.h>

int main()
{
        int fd = shm_open("silly_example", O_RDWR | O_CREAT, 0600);
        mmap(0, 4096, PROT_READ | PROT_WRITE, MAP_SHARED | MAP_FIXED, fd, 0);
        ftruncate(fd, 4096);
        int *ptr = (int*) 0;
        *ptr = 123;
        printf("%d\n", *ptr);
        getchar();
}

Вы можете проверить, что сопоставление создано:

$ cat /proc/17444/maps
00000000-00001000 rw-s 00000000 00:12 41774576                           /dev/shm/silly_example

Все процессы отображают общий файл таким образом разделит 4096 байт памяти (сопоставленных с нулевой страницей). В этом примере я использовал разделяемую память POSIX, но вы можете использовать любой файл, если урезаете его до 4096 байт.

Вам следует серьезно подумать над тем, что вы пытаетесь сделать, и если это действительно необходимо.

...