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