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