kazmax - Linux で自宅サーバー

alloc_hugepages - システムコールの説明 - Linux コマンド集 一覧表

  1. 名前
  2. 書式
  3. 説明
  4. 返り値
  5. エラー
  6. 準拠
  7. ファイル
  8. 注意

名前

alloc_hugepages, free_hugepages - ヒュージページ (huge page) の割り当てと解放を行う

書式

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) と ヒュージページ (2 または 4 MiB) について知っている。 同様に ia64 はいくつかのサイズのヒュージページについて知っている。 これらのシステムコールは、ヒュージページをプロセスのメモリにマップしたり、 再び解放したりする。 ヒュージページはメモリ内にロックされ、スワップされない。

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

free_hugepages ()の addr 引き数は、どのページを解放するかを指定する: addralloc_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
このシステムコールはカーネルでサポートされていない。

準拠

このシステムコールは Linux 2.5.36 から 2.5.54 にのみ存在する。 このシステムコールは Intel プロセッサ上の Linux に固有のものであり、 移植性を意図したプログラムでは使うべきでない。 実際、システムコール番号は再利用するためにマークされており、 この番号を使うプログラムは、将来のカーネルにおいて 何かでたらめな動作をするかもしれない。

ファイル

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

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

注意

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

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