ALLOC_HUGEPAGES(2)

名前
alloc_hugepages, free_hugepages - 大きなサイズのページの割り当てと解放を行う

書式
void *alloc_hugepages(int key, void *addr, size_t len,
                      int prot, int flag);

int free_hugepages(void *addr);

説明
システムコール alloc_hugepages() と free_hugepages() は Linux 2.5.36 で導入され、2.5.54 で再び削除された。 これらのシステムコールは i386 と ia64 のみで (かつ CONFIG_HUGETLB_PAGE を指定してビルドされた場合に) 存在する。 Linux 2.4.20 では syscall 番号が存在するが、 呼び出すとエラー ENOSYS で失敗する。

i386 では、メモリー管理ハードウェアは通常のページ (4 KiB) と 大きなサイズのページ (以下、ヒュージページ; 2MiB または 4 MiB) を 扱うことができる。 同様に、ia64 もいくつかのサイズのヒュージページを扱うことができる。 これらのシステムコールは、ヒュージページをプロセスのメモリーにマップしたり、 再び解放したりする。 ヒュージページはメモリー内にロックされ、スワップされない。

key 引数は識別子である。 0 の場合、ページは非公開になり、子プロセスに継承されない。 正の場合、ページは同じ key を使う他のアプリケーションと共有され、子プロセスに継承される。

free_hugepages() の addr 引数は、どのページを解放するかを指定する: addr は alloc_hugepages() の呼び出しの返り値である (全てのユーザーがメモリーを解放したときに、 そのメモリーは初めて実際に解放される)。 alloc_hugepages() の addr 引数はヒントであり、カーネルはそれに従うかもしれないし、 従わないかもしれない。 アドレスは正しく配置されなければならない。

len 引数は要求されたセグメントの長さである。 これはヒュージページのサイズの倍数にしなければならない。

prot 引数はセグメントのメモリー保護を指定する。 これは PROT_READ, PROT_WRITE, PROT_EXEC のいずれかである。

key が正でない限り、 flag 引数は無視される。 key が正で、かつ flag が IPC_CREAT であり、かつ指定された key で (セグメントが) 何も存在しない場合、 新しいヒュージページセグメントが作成される。 flag が設定されておらず、かつ指定された key のセグメントが存在しない場合、 ENOENT が返される。

返り値
成功した場合、 alloc_hugepages() は割り当てられた仮想アドレスを返し、 free_hugepages() は 0 を返す。 失敗した場合、-1 を返し、 errno が適切に設定される。

エラー

ENOSYS
    このシステムコールはカーネルでサポートされていない。

ファイル

/proc/sys/vm/nr_hugepages
    設定された hugetlb ページの数。 このファイルは読み書きできる。

/proc/meminfo
    設定された hugetlb ページの数と、 3 つの変数 HugePages_Total, HugePages_Free, Hugepagesize の サイズについての情報を提供する。

準拠
このシステムコールは Intel プロセッサ上の Linux に固有のものであり、 移植性が必要なプログラムで使うべきでない。

注意
これらのシステムコールはなくなった。 これらは Linux 2.5.36 から 2.5.54 にのみ存在する。 代わりに今は hugetlbfs ファイルシステムを使うことができる。 (CPU がサポートしている場合) ヒュージページを持つメモリーは、 mmap(2) を使ってこの仮想ファイルシステムでファイルをマップすることで取得できる。

ヒュージページの最大数は、 hugepages= 起動パラメーターを使って指定できる。

この文書について
この man ページは Linux man-pages プロジェクトのリリース 5.10 の一部である。プロジェクトの説明とバグ報告に関する情報は https://www.kernel.org/doc/man-pages/ に書かれている。