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/
に書かれている。