Skip to content

Instantly share code, notes, and snippets.

@dmikurube
Last active August 29, 2015 14:02
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save dmikurube/d451bc8951b4e799095a to your computer and use it in GitHub Desktop.
Save dmikurube/d451bc8951b4e799095a to your computer and use it in GitHub Desktop.
#include <fcntl.h>
#include <stdio.h>
#include <string.h>
#include <sys/mman.h>
#include <unistd.h>
typedef unsigned long long uint64_t;
int presence(int pagemap_fd, uint64_t address) {
uint64_t index = (address / getpagesize()) * 8;
uint64_t offset = lseek64(pagemap_fd, index, SEEK_SET);
uint64_t pagemap_value;
int result = read(pagemap_fd, &pagemap_value, 8);
return !!(pagemap_value & (((uint64_t)1) << 63));
}
void dump_pagemap_presence(char* pagemap_filename, void* address, size_t size) {
uint64_t address_uint64 = reinterpret_cast<uint64_t>(address);
int pagemap_fd = open(pagemap_filename, O_RDONLY);
uint64_t total = 0;
for (uint64_t offset = 0; offset < size; offset += 4096) {
if (presence(pagemap_fd, address_uint64 + offset))
total += 4096;
}
close(pagemap_fd);
printf("\nPresence in pagemap: %llu\n", total);
}
void dump_smaps(char* smaps_filename) {
FILE *fp = fopen(smaps_filename, "r");
char buf[1024];
while (1) {
char *ret;
ret = fgets(buf, sizeof(buf), fp);
if (ret == NULL) { break; }
fputs(buf, stdout);
}
fclose(fp);
}
int main() {
char pagemap_filename[1024];
char smaps_filename[1024];
snprintf(pagemap_filename, sizeof(pagemap_filename), "/proc/%d/pagemap",
static_cast<int>(getpid()));
snprintf(smaps_filename, sizeof(smaps_filename), "/proc/%d/smaps",
static_cast<int>(getpid()));
char tmp[1024];
void* addr;
printf("<< 1. Initialized >>\n");
dump_smaps(smaps_filename);
addr = mmap(0, 1024 * 1024 * 100, PROT_READ|PROT_WRITE,
MAP_PRIVATE|MAP_ANONYMOUS, -1, 0);
printf("\n\n<< 2. After just mmap() >>\n");
dump_smaps(smaps_filename);
dump_pagemap_presence(pagemap_filename, addr, 1024 * 1024 * 100);
memset(addr, 0, 1024 * 1024 * 99);
printf("\n\n<< 3. After memset() >>\n");
dump_smaps(smaps_filename);
dump_pagemap_presence(pagemap_filename, addr, 1024 * 1024 * 100);
madvise(addr, 1024 * 1024 * 50, MADV_DONTNEED);
printf("\n\n<< 4. After madvise(MADV_DONTNEED) >>\n");
dump_smaps(smaps_filename);
dump_pagemap_presence(pagemap_filename, addr, 1024 * 1024 * 100);
return 0;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment