编程接口指南

使用 meminfo()

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() 函数会返回以下类型的信息:

MEMINFO_VPHYSICAL

与给定虚拟地址对应的物理内存地址

MEMINFO_VLGRP

与给定虚拟地址对应的物理页所属的 lgroup

MEMINFO_VPAGESIZE

与给定虚拟地址对应的物理页的大小

MEMINFO_VREPLCNT

与给定虚拟地址对应的已复制物理页数

MEMINFO_VREPL|n

给定虚拟地址的第 n 个物理副本

MEMINFO_VREPL_LGRP|n

给定虚拟地址的第 n 个物理副本所属的 lgroup

MEMINFO_PLGRP

给定物理地址所属的 lgroup

meminfo() 函数使用以下参数:

inaddr

输入地址数组。

addr_count

传递给 meminfo() 的地址数。

info_req

列出所请求的信息类型的数组。

info_count

inaddr 数组中的每个地址请求的信息数。

outdata

meminfo() 函数用于存储结果的数组。此数组的大小等于 info_req 参数值与 addr_count 参数值的乘积。

validity

大小等于 addr_count 参数值的数组。validity 数组中包含按位结果代码。结果代码中的第 0 位评估相应输入地址的有效性。结果代码中的每个后续位依次评估对 info_req 数组成员的响应的有效性。

如果无法写入 outdatavalidity 数组指向的内存区域,则 meminfo() 函数将返回 EFAULT。如果无法读取 info_reqinaddr 数组指向的内存区域,则 meminfo() 函数将返回 EFAULT。如果 info_count 的值大于 31 或小于 1,则 meminfo() 函数将返回 EINVAL。如果 addr_count 的值小于零,则 meminfo() 函数将返回 EINVAL


示例 4–6 使用 meminfo() 列显与虚拟地址集合对应的物理页和页面大小

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);

                }

        }

}