[インデックス 14474] ファイルの概要
このコミットは、Go言語のランタイムにおいて、OpenBSDオペレーティングシステム向けにSysUnused
関数の実装を追加するものです。具体的には、メモリ領域が不要になったことをシステムに通知するためにmadvise
システムコール(MADV_FREE
オプション付き)を使用するように変更しています。これにより、OpenBSD上でのGoプログラムのメモリ管理効率が向上します。
コミット
commit c6afb781e271eb349fa846a8d90960fc5b66b16c
Author: Joel Sing <jsing@google.com>
Date: Mon Nov 26 22:32:59 2012 +1100
runtime: implement SysUnused for openbsd
R=golang-dev, minux.ma
CC=golang-dev
https://golang.org/cl/6854079
---
src/pkg/runtime/defs_openbsd.go | 2 ++\n src/pkg/runtime/defs_openbsd_386.h | 2 ++\n src/pkg/runtime/defs_openbsd_amd64.h | 2 ++\n src/pkg/runtime/mem_openbsd.c | 4 +---\n src/pkg/runtime/sys_openbsd_386.s | 7 +++++++\n src/pkg/runtime/sys_openbsd_amd64.s | 10 ++++++++++\n 6 files changed, 24 insertions(+), 3 deletions(-)
GitHub上でのコミットページへのリンク
https://github.com/golang/go/commit/c6afb781e271eb349fa846a8d90960fc5b66b16c
元コミット内容
runtime: implement SysUnused for openbsd
このコミットは、OpenBSDプラットフォームにおけるGoランタイムのSysUnused
関数を実装します。
変更の背景
Goランタイムは、ガベージコレクション(GC)によって不要になったメモリを解放する際に、オペレーティングシステム(OS)に対してそのメモリ領域がもう使用されないことを通知する必要があります。この通知は、OSがそのメモリを再利用したり、スワップアウトしたりする際のヒントとして利用されます。
以前のOpenBSD向けのSysUnused
関数は、単に引数を使用済みとしてマークするだけで、実際のOSへの通知を行っていませんでした(コメントにTODO(rsc): call madvise MADV_DONTNEED
と記載されていました)。これは、メモリが解放されてもOSがその事実を認識せず、物理メモリの再利用が遅れる可能性を意味します。
このコミットは、この問題を解決し、OpenBSD上でGoプログラムがより効率的にメモリを使用できるようにするために、madvise
システムコールとMADV_FREE
オプションを導入しています。これにより、Goランタイムが不要になったメモリをOSに明示的に通知し、OSがそのメモリをより適切に管理できるようになります。
前提知識の解説
Goランタイムとメモリ管理
Go言語は独自のランタイムを持っており、メモリの割り当て、解放、ガベージコレクションなどを管理しています。Goのガベージコレクタは、不要になったオブジェクトが占めるメモリを自動的に回収しますが、回収されたメモリをOSに返すかどうか、どのように返すかはOSやランタイムの実装に依存します。
SysUnused
関数
Goランタイムには、OSに対して特定のメモリ領域がもう使用されないことを通知するための抽象化された関数群が存在します。SysUnused
はその一つで、特定の仮想メモリ領域がアプリケーションによって使用されなくなったことをOSに伝える役割を担います。これにより、OSは物理メモリを解放したり、他のプロセスに割り当てたりするなどの最適化を行うことができます。
madvise
システムコール
madvise
は、Unix系OSで利用可能なシステムコールの一つで、プロセスが仮想メモリ領域の使用方法についてカーネルに助言(advise)するために使用されます。これにより、カーネルはメモリ管理の最適化を行うことができます。例えば、特定のメモリ領域が今後アクセスされないことを示したり、アクセスパターンをヒントとして提供したりすることができます。
madvise
にはいくつかのオプション(behavior
)があり、それぞれ異なる助言をカーネルに与えます。
MADV_FREE
オプション
MADV_FREE
は、madvise
システムコールで使用されるオプションの一つです。このオプションは、指定されたメモリ領域がアプリケーションによってもう使用されないことをカーネルに通知します。カーネルは、このヒントを受け取ると、そのメモリ領域に対応する物理ページを解放し、他の用途に再利用することができます。ただし、MADV_FREE
はMADV_DONTNEED
とは異なり、メモリの内容をすぐに破棄するわけではありません。メモリが実際に再利用されるまでは、その内容が保持される可能性があります。これは、メモリがすぐに必要になった場合に、再割り当てのコストを削減するための一種の最適化です。
OpenBSD
OpenBSDは、セキュリティとコードの品質に重点を置いたUnix系オペレーティングシステムです。メモリ管理やシステムコールインターフェースは、他のUnix系OS(LinuxやFreeBSDなど)と類似していますが、細部で異なる場合があります。
技術的詳細
このコミットの主要な目的は、OpenBSDにおけるGoランタイムのSysUnused
関数が、実際にOSにメモリの解放を通知するようにすることです。これを実現するために、以下の技術的変更が行われています。
-
MADV_FREE
定数の追加:src/pkg/runtime/defs_openbsd.go
src/pkg/runtime/defs_openbsd_386.h
src/pkg/runtime/defs_openbsd_amd64.h
これらのファイルに、MADV_FREE
という定数が追加されています。これは、OpenBSDのmadvise
システムコールで使用するMADV_FREE
オプションの値をGoランタイムが認識できるようにするためです。OpenBSDでは、MADV_FREE
の値は0x6
(10進数で6)です。
-
SysUnused
の実装変更:src/pkg/runtime/mem_openbsd.c
このファイルでは、runtime·SysUnused
関数の実装が変更されています。以前はUSED(v); USED(n);
というダミーの処理とコメントアウトされたTODO
がありましたが、これがruntime·madvise(v, n, MADV_FREE);
という実際のmadvise
システムコールを呼び出すコードに置き換えられました。これにより、SysUnused
が呼び出された際に、指定されたメモリ領域v
とサイズn
がMADV_FREE
オプション付きでOSに通知されるようになります。
-
madvise
システムコールラッパーの追加:src/pkg/runtime/sys_openbsd_386.s
(32-bit x86)src/pkg/runtime/sys_openbsd_amd64.s
(64-bit x86-64) これらのアセンブリファイルには、runtime·madvise
という新しい関数が追加されています。この関数は、GoランタイムからC言語の関数として呼び出されるmadvise
システムコールのラッパーです。- 32-bit (i386):
sys_madvise
システムコール番号(OpenBSDでは75)をAX
レジスタにロードし、INT $0x80
命令を使ってシステムコールを呼び出します。引数はスタックから取得されます。 - 64-bit (amd64):
sys_madvise
システムコール番号(OpenBSDでは75)をAX
レジスタにロードし、引数(アドレス、長さ、振る舞い)をそれぞれDI
,SI
,DX
レジスタにロードした後、SYSCALL
命令を使ってシステムコールを呼び出します。 システムコールの呼び出し後、エラーが発生した場合は0xf1
にジャンプしてクラッシュするようになっています。これは、システムコールが失敗した場合にGoランタイムがパニックを起こすための一般的なパターンです。
これらの変更により、GoランタイムはOpenBSD上で不要になったメモリをOSに効率的に通知できるようになり、システム全体のメモリ利用効率が向上します。
コアとなるコードの変更箇所
-
src/pkg/runtime/defs_openbsd.go
:const ( MAP_PRIVATE = C.MAP_PRIVATE MAP_FIXED = C.MAP_FIXED MADV_FREE = C.MADV_FREE // 新規追加 SA_SIGINFO = C.SA_SIGINFO SA_RESTART = C.SA_RESTART SA_ONSTACK = C.SA_ONSTACK )
MADV_FREE
定数の追加。 -
src/pkg/runtime/defs_openbsd_386.h
:enum { MAP_PRIVATE = 0x2, MAP_FIXED = 0x10, MADV_FREE = 0x6, // 新規追加 SA_SIGINFO = 0x40, SA_RESTART = 0x2, SA_ONSTACK = 0x1, };
MADV_FREE
定数の追加(32-bit)。 -
src/pkg/runtime/defs_openbsd_amd64.h
:enum { MAP_PRIVATE = 0x2, MAP_FIXED = 0x10, MADV_FREE = 0x6, // 新規追加 SA_SIGINFO = 0x40, SA_RESTART = 0x2, SA_ONSTACK = 0x1, };
MADV_FREE
定数の追加(64-bit)。 -
src/pkg/runtime/mem_openbsd.c
:void runtime·SysUnused(void *v, uintptr n) { // 変更前: // USED(v); // USED(n); // // TODO(rsc): call madvise MADV_DONTNEED // 変更後: runtime·madvise(v, n, MADV_FREE); // madvise呼び出しに置き換え }
SysUnused
関数の実装をmadvise
呼び出しに変更。 -
src/pkg/runtime/sys_openbsd_386.s
:TEXT runtime·madvise(SB),7,$-4 MOVL $75, AX // sys_madvise システムコール番号 INT $0x80 JAE 2(PC) MOVL $0xf1, 0xf1 // crash RET
32-bit OpenBSD向け
madvise
システムコールラッパーの追加。 -
src/pkg/runtime/sys_openbsd_amd64.s
:TEXT runtime·madvise(SB),7,$0 MOVQ addr+0(FP), DI // arg 1 - addr MOVQ len+8(FP), SI // arg 2 - len MOVQ behav+16(FP), DX // arg 3 - behav MOVQ $75, AX // sys_madvise システムコール番号 SYSCALL JCC 2(PC) MOVL $0xf1, 0xf1 // crash RET
64-bit OpenBSD向け
madvise
システムコールラッパーの追加。
コアとなるコードの解説
このコミットの核となる変更は、GoランタイムがOpenBSD上でメモリを解放する際に、OSに対してそのメモリが不要になったことを明示的に通知するようになった点です。
-
定数の定義:
defs_openbsd.go
,defs_openbsd_386.h
,defs_openbsd_amd64.h
でMADV_FREE
という定数を定義しています。これは、OpenBSDのmadvise
システムコールが期待するMADV_FREE
オプションの数値(0x6
)をGoランタイムが利用できるようにするためです。これにより、GoコードからCの定数を参照する形で、OS固有の値を安全に利用できます。 -
SysUnused
の変更:mem_openbsd.c
内のruntime·SysUnused
関数は、Goランタイムがメモリ領域を「未使用」とマークする際に呼び出されます。この変更により、以前のダミー実装(USED(v); USED(n);
)が削除され、代わりにruntime·madvise(v, n, MADV_FREE);
が呼び出されるようになりました。これは、指定されたメモリブロックv
(アドレス)とn
(サイズ)が、MADV_FREE
という振る舞い(behavior)でmadvise
システムコールに渡されることを意味します。これにより、OSはこれらの物理ページを解放し、他の用途に再利用できるようになります。 -
アセンブリによる
madvise
ラッパー:sys_openbsd_386.s
とsys_openbsd_amd64.s
に追加されたruntime·madvise
関数は、Goランタイムが直接OSのmadvise
システムコールを呼び出すための低レベルなインターフェースを提供します。- アセンブリコードは、システムコール番号(OpenBSDの
madvise
は75
)を適切なレジスタ(32-bitではAX
、64-bitではAX
)にロードします。 - システムコールに必要な引数(メモリのアドレス、長さ、振る舞い)を、OSのABI(Application Binary Interface)に従って適切なレジスタ(64-bitでは
DI
,SI
,DX
)またはスタック(32-bit)に配置します。 - 最後に、
INT $0x80
(32-bit)またはSYSCALL
(64-bit)命令を実行して、カーネルにシステムコールを要求します。 - システムコールが成功したかどうかは、キャリーフラグ(
JAE
またはJCC
)でチェックされ、失敗した場合は0xf1
にジャンプしてプログラムをクラッシュさせます。これは、メモリ管理の失敗が致命的であるため、早期に問題を検出するためのGoランタイムの一般的なエラーハンドリングパターンです。
- アセンブリコードは、システムコール番号(OpenBSDの
これらの変更により、GoランタイムはOpenBSDのメモリ管理機能とより密接に連携し、不要になったメモリをOSに効率的に返却することで、システム全体のメモリフットプリントを削減し、パフォーマンスを向上させることが期待されます。
関連リンク
- Go CL 6854079: https://golang.org/cl/6854079
参考にした情報源リンク
- OpenBSD madvise(2) man page (一般的な
madvise
の動作とMADV_FREE
について): https://man.openbsd.org/madvise.2 - OpenBSD syscalls(2) man page (システムコール番号について): https://man.openbsd.org/syscalls.2
- Go言語のランタイムとメモリ管理に関する一般的な情報 (Goのドキュメントやブログ記事など)
- x86/x86-64 アセンブリ言語とシステムコール呼び出し規約に関する情報 (Linux/Unix系OSのABIドキュメントなど)
- Goのソースコード内の他のOS向けの
SysUnused
実装やmadvise
の利用例。 MADV_FREE
とMADV_DONTNEED
の違いに関する情報。# [インデックス 14474] ファイルの概要
このコミットは、Go言語のランタイムにおいて、OpenBSDオペレーティングシステム向けにSysUnused
関数の実装を追加するものです。具体的には、メモリ領域が不要になったことをシステムに通知するためにmadvise
システムコール(MADV_FREE
オプション付き)を使用するように変更しています。これにより、OpenBSD上でのGoプログラムのメモリ管理効率が向上します。
コミット
commit c6afb781e271eb349fa846a8d90960fc5b66b16c
Author: Joel Sing <jsing@google.com>
Date: Mon Nov 26 22:32:59 2012 +1100
runtime: implement SysUnused for openbsd
R=golang-dev, minux.ma
CC=golang-dev
https://golang.org/cl/6854079
---
src/pkg/runtime/defs_openbsd.go | 2 ++\n src/pkg/runtime/defs_openbsd_386.h | 2 ++\n src/pkg/runtime/defs_openbsd_amd64.h | 2 ++\n src/pkg/runtime/mem_openbsd.c | 4 +---\n src/pkg/runtime/sys_openbsd_386.s | 7 +++++++\n src/pkg/runtime/sys_openbsd_amd64.s | 10 ++++++++++\n 6 files changed, 24 insertions(+), 3 deletions(-)
GitHub上でのコミットページへのリンク
https://github.com/golang/go/commit/c6afb781e271eb349fa846a8d90960fc5b66b16c
元コミット内容
runtime: implement SysUnused for openbsd
このコミットは、OpenBSDプラットフォームにおけるGoランタイムのSysUnused
関数を実装します。
変更の背景
Goランタイムは、ガベージコレクション(GC)によって不要になったメモリを解放する際に、オペレーティングシステム(OS)に対してそのメモリ領域がもう使用されないことを通知する必要があります。この通知は、OSがそのメモリを再利用したり、スワップアウトしたりする際のヒントとして利用されます。
以前のOpenBSD向けのSysUnused
関数は、単に引数を使用済みとしてマークするだけで、実際のOSへの通知を行っていませんでした(コメントにTODO(rsc): call madvise MADV_DONTNEED
と記載されていました)。これは、メモリが解放されてもOSがその事実を認識せず、物理メモリの再利用が遅れる可能性を意味します。
このコミットは、この問題を解決し、OpenBSD上でGoプログラムがより効率的にメモリを使用できるようにするために、madvise
システムコールとMADV_FREE
オプションを導入しています。これにより、Goランタイムが不要になったメモリをOSに明示的に通知し、OSがそのメモリをより適切に管理できるようになります。
前提知識の解説
Goランタイムとメモリ管理
Go言語は独自のランタイムを持っており、メモリの割り当て、解放、ガベージコレクションなどを管理しています。Goのガベージコレクタは、不要になったオブジェクトが占めるメモリを自動的に回収しますが、回収されたメモリをOSに返すかどうか、どのように返すかはOSやランタイムの実装に依存します。
SysUnused
関数
Goランタイムには、OSに対して特定のメモリ領域がもう使用されないことを通知するための抽象化された関数群が存在します。SysUnused
はその一つで、特定の仮想メモリ領域がアプリケーションによって使用されなくなったことをOSに伝える役割を担います。これにより、OSは物理メモリを解放したり、他のプロセスに割り当てたりするなどの最適化を行うことができます。
madvise
システムコール
madvise
は、Unix系OSで利用可能なシステムコールの一つで、プロセスが仮想メモリ領域の使用方法についてカーネルに助言(advise)するために使用されます。これにより、カーネルはメモリ管理の最適化を行うことができます。例えば、特定のメモリ領域が今後アクセスされないことを示したり、アクセスパターンをヒントとして提供したりすることができます。
madvise
にはいくつかのオプション(behavior
)があり、それぞれ異なる助言をカーネルに与えます。
MADV_FREE
オプション
MADV_FREE
は、madvise
システムコールで使用されるオプションの一つです。このオプションは、指定されたメモリ領域がアプリケーションによってもう使用されないことをカーネルに通知します。カーネルは、このヒントを受け取ると、そのメモリ領域に対応する物理ページを解放し、他の用途に再利用することができます。ただし、MADV_FREE
はMADV_DONTNEED
とは異なり、メモリの内容をすぐに破棄するわけではありません。メモリが実際に再利用されるまでは、その内容が保持される可能性があります。これは、メモリがすぐに必要になった場合に、再割り当てのコストを削減するための一種の最適化です。
OpenBSD
OpenBSDは、セキュリティとコードの品質に重点を置いたUnix系オペレーティングシステムです。メモリ管理やシステムコールインターフェースは、他のUnix系OS(LinuxやFreeBSDなど)と類似していますが、細部で異なる場合があります。
技術的詳細
このコミットの主要な目的は、OpenBSDにおけるGoランタイムのSysUnused
関数が、実際にOSにメモリの解放を通知するようにすることです。これを実現するために、以下の技術的変更が行われています。
-
MADV_FREE
定数の追加:src/pkg/runtime/defs_openbsd.go
src/pkg/runtime/defs_openbsd_386.h
src/pkg/runtime/defs_openbsd_amd64.h
これらのファイルに、MADV_FREE
という定数が追加されています。これは、OpenBSDのmadvise
システムコールで使用するMADV_FREE
オプションの値をGoランタイムが認識できるようにするためです。OpenBSDでは、MADV_FREE
の値は0x6
(10進数で6)です。
-
SysUnused
の実装変更:src/pkg/runtime/mem_openbsd.c
このファイルでは、runtime·SysUnused
関数の実装が変更されています。以前はUSED(v); USED(n);
というダミーの処理とコメントアウトされたTODO
がありましたが、これがruntime·madvise(v, n, MADV_FREE);
という実際のmadvise
システムコールを呼び出すコードに置き換えられました。これにより、SysUnused
が呼び出された際に、指定されたメモリ領域v
とサイズn
がMADV_FREE
オプション付きでOSに通知されるようになります。
-
madvise
システムコールラッパーの追加:src/pkg/runtime/sys_openbsd_386.s
(32-bit x86)src/pkg/runtime/sys_openbsd_amd64.s
(64-bit x86-64) これらのアセンブリファイルには、runtime·madvise
という新しい関数が追加されています。この関数は、GoランタイムからC言語の関数として呼び出されるmadvise
システムコールのラッパーです。- 32-bit (i386):
sys_madvise
システムコール番号(OpenBSDでは75)をAX
レジスタにロードし、INT $0x80
命令を使ってシステムコールを呼び出します。引数はスタックから取得されます。 - 64-bit (amd64):
sys_madvise
システムコール番号(OpenBSDでは75)をAX
レジスタにロードし、引数(アドレス、長さ、振る舞い)をそれぞれDI
,SI
,DX
レジスタにロードした後、SYSCALL
命令を使ってシステムコールを呼び出します。 システムコールの呼び出し後、エラーが発生した場合は0xf1
にジャンプしてクラッシュするようになっています。これは、システムコールが失敗した場合にGoランタイムがパニックを起こすための一般的なパターンです。
これらの変更により、GoランタイムはOpenBSD上で不要になったメモリをOSに効率的に通知できるようになり、システム全体のメモリ利用効率が向上します。
コアとなるコードの変更箇所
-
src/pkg/runtime/defs_openbsd.go
:const ( MAP_PRIVATE = C.MAP_PRIVATE MAP_FIXED = C.MAP_FIXED MADV_FREE = C.MADV_FREE // 新規追加 SA_SIGINFO = C.SA_SIGINFO SA_RESTART = C.SA_RESTART SA_ONSTACK = C.SA_ONSTACK )
MADV_FREE
定数の追加。 -
src/pkg/runtime/defs_openbsd_386.h
:enum { MAP_PRIVATE = 0x2, MAP_FIXED = 0x10, MADV_FREE = 0x6, // 新規追加 SA_SIGINFO = 0x40, SA_RESTART = 0x2, SA_ONSTACK = 0x1, };
MADV_FREE
定数の追加(32-bit)。 -
src/pkg/runtime/defs_openbsd_amd64.h
:enum { MAP_PRIVATE = 0x2, MAP_FIXED = 0x10, MADV_FREE = 0x6, // 新規追加 SA_SIGINFO = 0x40, SA_RESTART = 0x2, SA_ONSTACK = 0x1, };
MADV_FREE
定数の追加(64-bit)。 -
src/pkg/runtime/mem_openbsd.c
:void runtime·SysUnused(void *v, uintptr n) { // 変更前: // USED(v); // USED(n); // // TODO(rsc): call madvise MADV_DONTNEED // 変更後: runtime·madvise(v, n, MADV_FREE); // madvise呼び出しに置き換え }
SysUnused
関数の実装をmadvise
呼び出しに変更。 -
src/pkg/runtime/sys_openbsd_386.s
:TEXT runtime·madvise(SB),7,$-4 MOVL $75, AX // sys_madvise システムコール番号 INT $0x80 JAE 2(PC) MOVL $0xf1, 0xf1 // crash RET
32-bit OpenBSD向け
madvise
システムコールラッパーの追加。 -
src/pkg/runtime/sys_openbsd_amd64.s
:TEXT runtime·madvise(SB),7,$0 MOVQ addr+0(FP), DI // arg 1 - addr MOVQ len+8(FP), SI // arg 2 - len MOVQ behav+16(FP), DX // arg 3 - behav MOVQ $75, AX // sys_madvise システムコール番号 SYSCALL JCC 2(PC) MOVL $0xf1, 0xf1 // crash RET
64-bit OpenBSD向け
madvise
システムコールラッパーの追加。
コアとなるコードの解説
このコミットの核となる変更は、GoランタイムがOpenBSD上でメモリを解放する際に、OSに対してそのメモリが不要になったことを明示的に通知するようになった点です。
-
定数の定義:
defs_openbsd.go
,defs_openbsd_386.h
,defs_openbsd_amd64.h
でMADV_FREE
という定数を定義しています。これは、OpenBSDのmadvise
システムコールが期待するMADV_FREE
オプションの数値(0x6
)をGoランタイムが利用できるようにするためです。これにより、GoコードからCの定数を参照する形で、OS固有の値を安全に利用できます。 -
SysUnused
の変更:mem_openbsd.c
内のruntime·SysUnused
関数は、Goランタイムがメモリ領域を「未使用」とマークする際に呼び出されます。この変更により、以前のダミー実装(USED(v); USED(n);
)が削除され、代わりにruntime·madvise(v, n, MADV_FREE);
が呼び出されるようになりました。これは、指定されたメモリブロックv
(アドレス)とn
(サイズ)が、MADV_FREE
という振る舞い(behavior)でmadvise
システムコールに渡されることを意味します。これにより、OSはこれらの物理ページを解放し、他の用途に再利用できるようになります。 -
アセンブリによる
madvise
ラッパー:sys_openbsd_386.s
とsys_openbsd_amd64.s
に追加されたruntime·madvise
関数は、Goランタイムが直接OSのmadvise
システムコールを呼び出すための低レベルなインターフェースを提供します。- アセンブリコードは、システムコール番号(OpenBSDの
madvise
は75
)を適切なレジスタ(32-bitではAX
、64-bitではAX
)にロードします。 - システムコールに必要な引数(メモリのアドレス、長さ、振る舞い)を、OSのABI(Application Binary Interface)に従って適切なレジスタ(64-bitでは
DI
,SI
,DX
)またはスタック(32-bit)に配置します。 - 最後に、
INT $0x80
(32-bit)またはSYSCALL
(64-bit)命令を実行して、カーネルにシステムコールを要求します。 - システムコールが成功したかどうかは、キャリーフラグ(
JAE
またはJCC
)でチェックされ、失敗した場合は0xf1
にジャンプしてプログラムをクラッシュさせます。これは、メモリ管理の失敗が致命的であるため、早期に問題を検出するためのGoランタイムの一般的なエラーハンドリングパターンです。
- アセンブリコードは、システムコール番号(OpenBSDの
これらの変更により、GoランタイムはOpenBSDのメモリ管理機能とより密接に連携し、不要になったメモリをOSに効率的に返却することで、システム全体のメモリフットプリントを削減し、パフォーマンスを向上させることが期待されます。
関連リンク
- Go CL 6854079: https://golang.org/cl/6854079
参考にした情報源リンク
- OpenBSD madvise(2) man page (一般的な
madvise
の動作とMADV_FREE
について): https://man.openbsd.org/madvise.2 - OpenBSD syscalls(2) man page (システムコール番号について): https://man.openbsd.org/syscalls.2
- Go言語のランタイムとメモリ管理に関する一般的な情報 (Goのドキュメントやブログ記事など)
- x86/x86-64 アセンブリ言語とシステムコール呼び出し規約に関する情報 (Linux/Unix系OSのABIドキュメントなど)
- Goのソースコード内の他のOS向けの
SysUnused
実装やmadvise
の利用例。 MADV_FREE
とMADV_DONTNEED
の違いに関する情報。