meminfo() 函数为调用进程提供有关系统已分配给此进程的虚拟内存和物理内存的信息。
#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[]);
meminfo() 函数会返回以下类型的信息:
与给定虚拟地址对应的物理内存地址
与给定虚拟地址对应的物理页所属的 lgroup
与给定虚拟地址对应的物理页的大小
与给定虚拟地址对应的已复制物理页数
给定虚拟地址的第 n 个物理副本
给定虚拟地址的第 n 个物理副本所属的 lgroup
给定物理地址所属的 lgroup
meminfo() 函数使用以下参数:
输入地址数组。
传递给 meminfo() 的地址数。
列出所请求的信息类型的数组。
为 inaddr 数组中的每个地址请求的信息数。
meminfo() 函数用于存储结果的数组。此数组的大小等于 info_req 参数值与 addr_count 参数值的乘积。
大小等于 addr_count 参数值的数组。validity 数组中包含按位结果代码。结果代码中的第 0 位评估相应输入地址的有效性。结果代码中的每个后续位依次评估对 info_req 数组成员的响应的有效性。
如果无法写入 outdata 或 validity 数组指向的内存区域,则 meminfo() 函数将返回 EFAULT。如果无法读取 info_req 或 inaddr 数组指向的内存区域,则 meminfo() 函数将返回 EFAULT。如果 info_count 的值大于 31 或小于 1,则 meminfo() 函数将返回 EINVAL。如果 addr_count 的值小于零,则 meminfo() 函数将返回 EINVAL。
void
print_info(void **addrvec, int how_many)
{
static const int info[] = {
MEMINFO_VPHYSICAL,
MEMINFO_VPAGESIZE};
uint64_t * inaddr = alloca(sizeof(uint64_t) * how_many);
uint64_t * outdata = alloca(sizeof(uint64_t) * how_many * 2;
uint_t * validity = alloca(sizeof(uint_t) * how_many);
int i;
for (i = 0; i < how_many; i++)
inaddr[i] = (uint64_t *)addr[i];
if (meminfo(inaddr, how_many, info,
sizeof (info)/ sizeof(info[0]),
outdata, validity) < 0)
...
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 * 2 +
1]);
printf("address 0x%llx is backed by physical
page 0x%llx of size %s\n",
inaddr[i], outdata[i * 2], buff);
}
}
}