void mem_map() { static char *p; if (flag_allocated) { if (munmap(p, memsize) == -1) err(5, "munmap failed"); } else { p = mmap(NULL, memsize, PROT_READ | PROT_WRITE, MAP_SHARED | MAP_ANONYMOUS, 0, 0); if (p == MAP_FAILED) err(4, "mmap failed"); touch_memory(p); } flag_allocated = !flag_allocated; }
/* * segment_touch() - "touch" [read or write] each page of specified range * -- from offset to offset+length -- to fault in or to * test protection. * NOTE: offset is relative to start of mapping, not start of file! */ int segment_touch(char *name, range_t *range, int rw) { glctx_t *gcp = &glctx; segment_t *segp; off_t offset; size_t length, maxlength; unsigned long *memp; struct timeval t_start, t_end; segp = segment_get(name); if (segp == NULL) { fprintf(stderr, "%s: no such segment: %s\n", gcp->program_name, name); return SEG_ERR; } offset = round_down_to_pagesize(range->offset); if (offset >= segp->seg_length) { fprintf(stderr, "%s: offset %ld is past end of segment %s\n", gcp->program_name, offset, name); return SEG_ERR; } memp = (unsigned long*)(segp->seg_start + offset); maxlength = segp->seg_length - offset; length = range->length; if (length) length = round_up_to_pagesize(length); /* * note: we silently truncate to max length [end of segment] */ if (length == 0 || length > maxlength) length = maxlength; gettimeofday(&t_start, NULL); touch_memory(rw, memp, length); gettimeofday(&t_end, NULL); printf("%s: touched %d pages in %6.3f secs\n", gcp->program_name, length/gcp->pagesize, (float)(tv_diff_usec(&t_start, &t_end))/1000000.0); return SEG_OK; }