KVM_GETPCPU(3) | FreeBSD Library Functions Manual | KVM_GETPCPU(3) |
名称
kvm_dpcpu_setcpu kvm_getmaxcpu, kvm_getpcpu — CPU データ毎にアクセスするライブラリ
Kernel Data Access Library (libkvm, -lkvm)書式
#include < sys/param.h>#include < sys/pcpu.h>
#include < sys/sysctl.h>
#include < kvm.h>
int
kvm_dpcpu_setcpu( kvm_t *kd, u_int cpu);
int
kvm_getmaxcpu( kvm_t *kd);
void *
kvm_getpcpu( kvm_t *kd, int cpu);
ssize_t
kvm_read_zpcpu( kvm_t *kd, void *buf, u_long base, size_t size, int cpu);
uint64_t
kvm_counter_u64_fetch( kvm_t *kd, u_long base);
解説
kvm_dpcpu_setcpu(), kvm_getmaxcpu() と kvm_getpcpu() 関数は、 kd によって示されたカーネルのアクティブなプロセッサの CPU データ毎にアクセスするために使用されます。 CPU 毎の記憶域には、2 つの特色があります: 各 CPU に関連している struct pcpu の直接格納されたデータ、と単一のカーネルシンボルがアクセスされるどのような CPU に依存している異なったデータを参照する CPU 毎のダイナミックな記憶域 (DPCPU) です。kvm_getmaxcpu() 関数は、カーネルによってサポートされた CPU の最大数を返します。
kvm_getpcpu() 関数は、単一の CPU のための CPU データ毎に保持されるバッファを返します。このバッファは、 struct pcpu タイプによって記述されます。呼び出し側は、それがもう必要でないときに、 free(3) を呼び出すことによってバッファを解放する責任があります。 cpu がアクティブでないなら、代わりに NULL が返されます。
kvm_read_zpcpu() 関数は、 UMA_ZONE_PCPU zone(9) から CPU ごとのプライベートなコピーを獲得するために使用されます。それは、 cpu にプライベートである割り付けの部分から buf に size バイトの割り付けとコピーのベースアドレスとして base 引数を取ります。
kvm_counter_u64_fetch() 関数は、 base アドレスによって指されている counter(9) の値を取って来ます。
ダイナミックな CPU 毎のデータのシンボルは、他のシンボルのように kvm_nlist(3) を通してアクセスされます。 libkvm は、デフォルトを 0 とする、 kvm_dpcpu_setcpu によって設定される "現在の CPU"の概念を維持します。いったん別の CPU が選択されると、 kvm_nlist(3) は、適切な CPU のそのデータへのポインタを返します。
キャッシング
kvm_getmaxcpu() と kvm_getpcpu() は、連続した呼び出しで再利用される、様々なカーネル変数のための nlist 値をキャッシュします。このキャッシュをクリアするためには、 NULL に設定された kd でいずれかの関数を呼び出します。戻り値
成功すれば、 kvm_getmaxcpu() 関数は、カーネルによってサポートされた CPU の最大数を返します。エラーが発生するなら、代わりに -1 を返します。成功すれば、 kvm_getpcpu() は、割り付けられたバッファ、または NULL へのポインタを返します。エラーが発生するなら、代わりに -1 を返します。
成功すれば、 kvm_dpcpu_setcpu() 呼び出しは、0 を返します。エラーが発生するなら、代わりに -1 を返します。
成功すれば、 kvm_read_zpcpu() 関数は、コピーされたバイト数を返します。エラーが生じるなら、代わりに、-1 を返します。
すべての関数がエラーに遭遇するなら、エラーメッセージは、 kvm_geterr(3) を通して検索されます。
April 11, 2013 | FreeBSD |