Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

[インデックス 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_FREEMADV_DONTNEEDとは異なり、メモリの内容をすぐに破棄するわけではありません。メモリが実際に再利用されるまでは、その内容が保持される可能性があります。これは、メモリがすぐに必要になった場合に、再割り当てのコストを削減するための一種の最適化です。

OpenBSD

OpenBSDは、セキュリティとコードの品質に重点を置いたUnix系オペレーティングシステムです。メモリ管理やシステムコールインターフェースは、他のUnix系OS(LinuxやFreeBSDなど)と類似していますが、細部で異なる場合があります。

技術的詳細

このコミットの主要な目的は、OpenBSDにおけるGoランタイムのSysUnused関数が、実際にOSにメモリの解放を通知するようにすることです。これを実現するために、以下の技術的変更が行われています。

  1. 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)です。
  2. SysUnusedの実装変更:

    • src/pkg/runtime/mem_openbsd.c このファイルでは、runtime·SysUnused関数の実装が変更されています。以前はUSED(v); USED(n);というダミーの処理とコメントアウトされたTODOがありましたが、これがruntime·madvise(v, n, MADV_FREE);という実際のmadviseシステムコールを呼び出すコードに置き換えられました。これにより、SysUnusedが呼び出された際に、指定されたメモリ領域vとサイズnMADV_FREEオプション付きでOSに通知されるようになります。
  3. 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に対してそのメモリが不要になったことを明示的に通知するようになった点です。

  1. 定数の定義: defs_openbsd.go, defs_openbsd_386.h, defs_openbsd_amd64.hMADV_FREEという定数を定義しています。これは、OpenBSDのmadviseシステムコールが期待するMADV_FREEオプションの数値(0x6)をGoランタイムが利用できるようにするためです。これにより、GoコードからCの定数を参照する形で、OS固有の値を安全に利用できます。

  2. SysUnusedの変更: mem_openbsd.c内のruntime·SysUnused関数は、Goランタイムがメモリ領域を「未使用」とマークする際に呼び出されます。この変更により、以前のダミー実装(USED(v); USED(n);)が削除され、代わりにruntime·madvise(v, n, MADV_FREE);が呼び出されるようになりました。これは、指定されたメモリブロックv(アドレス)とn(サイズ)が、MADV_FREEという振る舞い(behavior)でmadviseシステムコールに渡されることを意味します。これにより、OSはこれらの物理ページを解放し、他の用途に再利用できるようになります。

  3. アセンブリによるmadviseラッパー: sys_openbsd_386.ssys_openbsd_amd64.sに追加されたruntime·madvise関数は、Goランタイムが直接OSのmadviseシステムコールを呼び出すための低レベルなインターフェースを提供します。

    • アセンブリコードは、システムコール番号(OpenBSDのmadvise75)を適切なレジスタ(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ランタイムの一般的なエラーハンドリングパターンです。

これらの変更により、GoランタイムはOpenBSDのメモリ管理機能とより密接に連携し、不要になったメモリをOSに効率的に返却することで、システム全体のメモリフットプリントを削減し、パフォーマンスを向上させることが期待されます。

関連リンク

参考にした情報源リンク

  • 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_FREEMADV_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_FREEMADV_DONTNEEDとは異なり、メモリの内容をすぐに破棄するわけではありません。メモリが実際に再利用されるまでは、その内容が保持される可能性があります。これは、メモリがすぐに必要になった場合に、再割り当てのコストを削減するための一種の最適化です。

OpenBSD

OpenBSDは、セキュリティとコードの品質に重点を置いたUnix系オペレーティングシステムです。メモリ管理やシステムコールインターフェースは、他のUnix系OS(LinuxやFreeBSDなど)と類似していますが、細部で異なる場合があります。

技術的詳細

このコミットの主要な目的は、OpenBSDにおけるGoランタイムのSysUnused関数が、実際にOSにメモリの解放を通知するようにすることです。これを実現するために、以下の技術的変更が行われています。

  1. 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)です。
  2. SysUnusedの実装変更:

    • src/pkg/runtime/mem_openbsd.c このファイルでは、runtime·SysUnused関数の実装が変更されています。以前はUSED(v); USED(n);というダミーの処理とコメントアウトされたTODOがありましたが、これがruntime·madvise(v, n, MADV_FREE);という実際のmadviseシステムコールを呼び出すコードに置き換えられました。これにより、SysUnusedが呼び出された際に、指定されたメモリ領域vとサイズnMADV_FREEオプション付きでOSに通知されるようになります。
  3. 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に対してそのメモリが不要になったことを明示的に通知するようになった点です。

  1. 定数の定義: defs_openbsd.go, defs_openbsd_386.h, defs_openbsd_amd64.hMADV_FREEという定数を定義しています。これは、OpenBSDのmadviseシステムコールが期待するMADV_FREEオプションの数値(0x6)をGoランタイムが利用できるようにするためです。これにより、GoコードからCの定数を参照する形で、OS固有の値を安全に利用できます。

  2. SysUnusedの変更: mem_openbsd.c内のruntime·SysUnused関数は、Goランタイムがメモリ領域を「未使用」とマークする際に呼び出されます。この変更により、以前のダミー実装(USED(v); USED(n);)が削除され、代わりにruntime·madvise(v, n, MADV_FREE);が呼び出されるようになりました。これは、指定されたメモリブロックv(アドレス)とn(サイズ)が、MADV_FREEという振る舞い(behavior)でmadviseシステムコールに渡されることを意味します。これにより、OSはこれらの物理ページを解放し、他の用途に再利用できるようになります。

  3. アセンブリによるmadviseラッパー: sys_openbsd_386.ssys_openbsd_amd64.sに追加されたruntime·madvise関数は、Goランタイムが直接OSのmadviseシステムコールを呼び出すための低レベルなインターフェースを提供します。

    • アセンブリコードは、システムコール番号(OpenBSDのmadvise75)を適切なレジスタ(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ランタイムの一般的なエラーハンドリングパターンです。

これらの変更により、GoランタイムはOpenBSDのメモリ管理機能とより密接に連携し、不要になったメモリをOSに効率的に返却することで、システム全体のメモリフットプリントを削減し、パフォーマンスを向上させることが期待されます。

関連リンク

参考にした情報源リンク

  • 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_FREEMADV_DONTNEEDの違いに関する情報。