Skip to content

Instantly share code, notes, and snippets.

@juniorprincewang
Created September 20, 2019 12:21
Show Gist options
  • Save juniorprincewang/e93621b75615741360621731685817b0 to your computer and use it in GitHub Desktop.
Save juniorprincewang/e93621b75615741360621731685817b0 to your computer and use it in GitHub Desktop.
mmap memory fractions into unified memory address
/*
POSIX:
gcc -std=gnu99 -o mmap_shm mmap_shm.c -lrt
*/
#include <stdio.h>
#include <stdint.h>
#include <assert.h>
#include <stdlib.h>
#include <fcntl.h>
#include <unistd.h>
#include <sys/mman.h>
#include <sys/stat.h>
#include <string.h>
int
main(void)
{
size_t size = 0;
void *addr[5] = {0};
size_t naddr = sizeof(addr) / sizeof(addr[0]);
printf("naddr = %zu\n", naddr);
long pagesz = sysconf(_SC_PAGESIZE);
for(int i=0 ; i<naddr; i++) {
// addr[i] = malloc(pagesz);
addr[i] = mmap(NULL, pagesz, PROT_READ|PROT_WRITE, MAP_SHARED|MAP_ANONYMOUS, -1, 0);
printf("addr[%d]=%p\n", i, addr[i]);
size += pagesz;
}
char path[128];
// snprintf(path, sizeof(path), "/tmp/mmap_pid_%lu",(long)getpid());
// int fd = open(path, O_RDWR|O_CREAT, 0666);
snprintf(path, sizeof(path), "/%s(%lu,%p)",
__FUNCTION__, (long)getpid(), addr);
int fd = shm_open(path, O_RDWR | O_CREAT | O_EXCL, 0600);
if (fd == -1)
return -1;
ftruncate(fd, size);
shm_unlink(path);
size_t offset = 0;
void *p = mmap(addr[0], pagesz, PROT_READ | PROT_WRITE, MAP_SHARED|MAP_FIXED, fd, offset);
assert(addr[0] != MAP_FAILED);
offset += pagesz;
void *p1 = mmap(addr[2], pagesz, PROT_READ | PROT_WRITE, MAP_SHARED|MAP_FIXED, fd, offset);
assert(addr[2] != MAP_FAILED);
offset += pagesz;
void *p2 = mmap(addr[4], pagesz, PROT_READ | PROT_WRITE, MAP_SHARED|MAP_FIXED, fd, offset);
assert(addr[4] != MAP_FAILED);
offset += pagesz;
printf("%p, %p, %p\n", p, p1, p2);
printf("size = 0x%lx\n", offset);
// -----------------------------------------------------------//
char *t = (char*)mmap(0, offset, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
printf("t= %p\n", t);
// memset(t, ~0, offset);
memset(t, 0, offset);
*(char*)addr[0] = 'A';
printf("addr[0][%d]=%x\n", 0, *(char*)(addr[0]));
printf("p[%d]=%x\n", 0, *(char*)p);
printf("t[%d]=%x\n", 0, t[0]);
munmap(addr[0], pagesz);
munmap(addr[2], pagesz);
munmap(addr[4], pagesz);
munmap(t, offset);
for(int i=0 ; i<naddr; i++) {
munmap(addr[i], pagesz);
}
getchar();
close(fd);
// unlink(path);
return 0;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment