プログラミングインタフェース

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_reqaddr_count パラメータに指定した値の積になります。

validity

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 を返します。


例 5–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);
                }
        }
}