MEMINFO(2) | System Calls | MEMINFO(2) |
#include <sys/types.h> #include <sys/mman.h> int meminfo(const uint64_t inaddr[], int addr_count, const uint_t info_req[], int info_count, uint64_t outdata[], uint_t validity[]);
addr_count
info_req
info_count
outdata
validity
The caller of meminfo() can obtain the following types of information about both virtual and physical memory.
MEMINFO_VPHYSICAL
MEMINFO_VLGRP
MEMINFO_VPAGESIZE
MEMINFO_VREPLCNT
MEMINFO_VREPL | n
MEMINFO_VREPL_LGRP | n
MEMINFO_PLGRP
All but MEMINFO_VLGRP and MEMINFO_VPAGESIZE require the PRIV_PROC_MEMINFO privilege.
All but MEMINFO_VLGRP and MEMINFO_VPAGESIZE require the PRIV_PROC_MEMINFO privilege.
EFAULT
EINVAL
The following example prints the physical pages and page sizes corresponding to a set of virtual addresses.
void print_info(void **addrvec, int how_many) { static const uint_t info[] = { MEMINFO_VPHYSICAL, MEMINFO_VPAGESIZE }; int info_num = sizeof (info) / sizeof (info[0]); int i; uint64_t *inaddr = alloca(sizeof (uint64_t) * how_many); uint64_t *outdata = alloca(sizeof (uint64_t) * how_many * info_num); uint_t *validity = alloca(sizeof (uint_t) * how_many); for (i = 0; i < how_many; i++) inaddr[i] = (uint64_t)addrvec[i]; if (meminfo(inaddr, how_many, info, info_num, outdata, validity) < 0) { perror("meminfo"); return; } for (i = 0; i < how_many; i++) { if ((validity[i] & 1) == 0) printf("address 0x%llx not part of address space\n", inaddr[i]); else if ((validity[i] & 2) == 0) printf("address 0x%llx has no physical page " "associated with it\n", inaddr[i]); else { char buff[80]; if ((validity[i] & 4) == 0) strcpy(buff, "<Unknown>"); else sprintf(buff, "%lld", outdata[i * info_num + 1]); printf("address 0x%llx is backed by physical " "page 0x%llx of size %s\n", inaddr[i], outdata[i * info_num], buff); } } }
ATTRIBUTE TYPE | ATTRIBUTE VALUE |
Interface Stability | Stable |
MT-Level | Async-Signal-Safe |
March 10, 2015 | OmniOS |