Существуют серьезные проблемы с безопасностью и ремонтопригодностью при отображении и использовании первой страницы виртуальной памяти, но вы можете сделать это, если действительно хотите.
Сначала вам нужно настроить 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 байт.
Вам следует серьезно подумать над тем, что вы пытаетесь сделать, и если это действительно необходимо.