homer512 icon

Test mapping smaps flags

homer512 | PRO | 10/12/24 12:25:46 PM UTC (Edited) | 0 ⭐ | 13552 👁️ | Never ⏰ | []
C |

1.44 KB

|

None

|

0 👍

/

0 👎

#include <stdio.h>
 
#include <sys/mman.h>
 
 
int main(void)
{
  void* private_noaccess, *private_read, *private_rw, *private_file;
  FILE* file;
  int i, buf;
  /*
   * Create file to test MAP_PRIVATE of a file
   */
  if(! (file = fopen("/tmp/maptest", "w+b")))
    return 1;
  for(i = 0; i < 4096 / sizeof(int); ++i)
    fwrite(&i, sizeof(i), 1, file);
  fflush(file);
  /*
   * Will appear as rw-p mapping in smaps with Rss = 0 kiB,
   * meaning no anonymous memory is actually consumed until written to
   */
  private_file = mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE,
                     fileno(file), 0);
  fclose(file);
  /*
   * Will appear as rw-p with Rss = 0 kiB
   */
  private_rw = mmap(NULL, 4096, PROT_READ|PROT_WRITE,
                    MAP_PRIVATE|MAP_ANONYMOUS, -1, 0);
  /*
   * Will appear as r--p in smaps
   */
  private_read = mmap(NULL, 4096, PROT_READ, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0);
  /*
   * Will appear as ---p in smaps
   */
  private_noaccess = mmap(NULL, 4096, PROT_NONE, MAP_PRIVATE|MAP_ANONYMOUS,
                          -1, 0);
  /*
   * Print mapping locations so that we can compare them with smaps
   */
  printf("file=%p rw=%p r=%p noaccess=%p\n",
         private_file, private_rw, private_read, private_noaccess);
  /*
   * Print smaps content
   */
  if(! (file = fopen("/proc/self/smaps", "r")))
    return 2;
  while((buf = getc(file)) != EOF)
    putchar(buf);
}
 

Comments

  •  icon
    01/01/70 12:00:00 AM UTC
    Plain Text |

    0 B

    |

    👍

    /

    👎

    
        
  •  icon
    01/01/70 12:00:00 AM UTC
    Plain Text |

    0 B

    |

    👍

    /

    👎