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

[インデックス 1343] ファイルの概要

このコミットは、Go言語のランタイムの一部である src/runtime/sys_amd64_darwin.s ファイルに対する変更です。このファイルは、macOS (Darwin) 上のAMD64アーキテクチャ向けに、GoランタイムがOSと対話するための低レベルのアセンブリコードを含んでいます。具体的には、スレッド作成などのシステムコールを呼び出すためのコードが含まれています。

コミット

  • コミットハッシュ: 7ca5a0d323058ef6f749f5c3b146081b931da113
  • 作者: Russ Cox rsc@golang.org
  • コミット日時: 2008年12月15日 月曜日 08:56:32 -0800
  • コミットメッセージ: correct arg register in bsdthread_create

GitHub上でのコミットページへのリンク

https://github.com/golang/go/commit/7ca5a0d323058ef6f749f5c3b146081b931da113

元コミット内容

correct arg register in bsdthread_create

R=r
DELTA=1  (0 added, 0 deleted, 1 changed)
OCL=21040
CL=21176
---
 src/runtime/sys_amd64_darwin.s | 2 +--
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/src/runtime/sys_amd64_darwin.s b/src/runtime/sys_amd64_darwin.s
index a276576d9d..92af21c935 100644
--- a/src/runtime/sys_amd64_darwin.s
+++ b/src/runtime/sys_amd64_darwin.s
@@ -157,7 +157,7 @@ TEXT bsdthread_create(SB),7,$-8
  	MOVQ	m+16(SP), SI	// "arg"
  	MOVQ	stk+8(SP), DX	// stack
  	MOVQ	g+24(SP), R10	// "pthread"
-	MOVQ	$0, R10	// flags
+	MOVQ	$0, R8	// flags
  	MOVQ	$(0x2000000+360), AX	// bsdthread_create
  	SYSCALL
  	JCC 2(PC)

変更の背景

このコミットは、macOS (Darwin) 上でスレッドを作成するために使用される bsdthread_create システムコールを呼び出す際のアセンブリコードにおけるレジスタの誤用を修正するものです。

x86-64アーキテクチャにおけるSystem V ABI (Application Binary Interface) は、関数呼び出しの際に引数をどのレジスタに配置するかを厳密に定義しています。macOSは、このSystem V ABIに準拠しています。bsdthread_create システムコールは複数の引数を取りますが、そのうちの1つである flags 引数が、本来渡されるべきレジスタとは異なる R10 レジスタに設定されていました。

この誤ったレジスタの使用は、bsdthread_create システムコールが flags 引数を正しく解釈できない原因となり、スレッド作成時の予期せぬ動作やエラーを引き起こす可能性がありました。Goランタイムは、OSの低レベルな機能と正確に連携する必要があるため、このようなABIの厳密な遵守が不可欠です。このコミットは、このABI違反を修正し、flags 引数が正しいレジスタ (R8) に渡されるようにすることで、bsdthread_create の呼び出しがABIに準拠し、安定して動作するようにしました。

前提知識の解説

Goランタイム

Go言語は、独自のランタイムを持っています。このランタイムは、ガベージコレクション、スケジューリング(ゴルーチンの管理)、メモリ管理、そしてOSとの低レベルな対話(システムコールなど)といった、Goプログラムの実行に必要な多くの機能を提供します。GoプログラムがOSの機能を利用する際には、このランタイムが仲介役となります。

アセンブリ言語 (x86-64/AMD64)

アセンブリ言語は、CPUが直接実行できる機械語に非常に近い低レベルのプログラミング言語です。x86-64 (またはAMD64) は、現代のほとんどのデスクトップおよびサーバーCPUで使用されている64ビット命令セットアーキテクチャです。Goランタイムのようなパフォーマンスが重要で、OSの機能に直接アクセスする必要がある部分では、アセンブリ言語が使用されることがあります。

  • レジスタ: CPU内部にある高速な記憶領域で、データや命令のアドレスを一時的に保持します。x86-64アーキテクチャには、RAX, RBX, RCX, RDX, RSI, RDI, RBP, RSP, R8 から R15 などの汎用レジスタがあります。
  • MOVQ 命令: "Move Quadword" の略で、64ビットのデータをある場所から別の場所へ移動させる命令です。

Darwin (macOS) システムコール

システムコールは、ユーザープログラムがオペレーティングシステムカーネルのサービス(ファイルI/O、メモリ管理、プロセス制御、スレッド作成など)を要求するためのインターフェースです。Goランタイムは、macOS上でスレッドを作成するために bsdthread_create のようなシステムコールを直接呼び出します。

x86-64 System V ABI (Application Binary Interface)

ABIは、オペレーティングシステムとプログラム、またはプログラムの異なるモジュール間で、どのようにデータがやり取りされ、関数が呼び出されるかを定義する一連の規則です。x86-64 System V ABIは、Linux、macOS、FreeBSDなどのUnix系システムで広く採用されています。

特に重要なのは「呼び出し規約 (Calling Convention)」です。これは、関数呼び出しの際に、引数がどのレジスタに渡されるか、戻り値がどのレジスタに格納されるか、スタックがどのように管理されるかなどを定めます。

x86-64 System V ABIにおける関数呼び出しの引数レジスタの一般的な順序は以下の通りです(最初の6つの整数/ポインタ引数):

  1. RDI
  2. RSI
  3. RDX
  4. RCX
  5. R8
  6. R9

これ以降の引数はスタックに積まれます。

技術的詳細

このコミットの技術的な核心は、bsdthread_create システムコールへの引数渡しが、x86-64 System V ABIの呼び出し規約に準拠していなかった点にあります。

bsdthread_create は、新しいスレッドを作成するためのDarwinの低レベルシステムコールです。このシステムコールは複数の引数を取りますが、その中にはスレッドの動作を制御するための flags 引数も含まれます。

元のコードでは、flags 引数(値は 0)を R10 レジスタに設定していました。 MOVQ $0, R10 // flags

しかし、x86-64 System V ABIの呼び出し規約では、6番目の引数(0から数えて5番目)は R8 レジスタに渡されることになっています。bsdthread_create の引数リストにおいて、flags が6番目の引数に相当すると考えられます。

したがって、flags の値を R10 に設定することはABI違反であり、システムコールが flags の値を正しく読み取れない原因となっていました。この修正は、flags の値を正しいレジスタである R8 に設定することで、このABI違反を解消し、システムコールが期待通りに動作するようにします。

MOVQ $(0x2000000+360), AX // bsdthread_create の行は、bsdthread_create システムコールの番号を AX レジスタにロードしていることを示しています。SYSCALL 命令は、AX に格納されたシステムコール番号と、他のレジスタに格納された引数を使用してカーネルにシステムコールを要求します。

コアとなるコードの変更箇所

--- a/src/runtime/sys_amd64_darwin.s
+++ b/src/runtime/sys_amd64_darwin.s
@@ -157,7 +157,7 @@ TEXT bsdthread_create(SB),7,$-8
  	MOVQ	m+16(SP), SI	// "arg"
  	MOVQ	stk+8(SP), DX	// stack
  	MOVQ	g+24(SP), R10	// "pthread"
-	MOVQ	$0, R10	// flags
+	MOVQ	$0, R8	// flags
  	MOVQ	$(0x2000000+360), AX	// bsdthread_create
  	SYSCALL
  	JCC 2(PC)

コアとなるコードの解説

変更された行は以下の通りです。

  • 変更前: MOVQ $0, R10 // flags

    • これは、即値 0R10 レジスタに移動させる命令です。コメントから、この 0flags 引数として意図されていたことがわかります。しかし、前述の通り、R10bsdthread_createflags 引数を受け取るべきレジスタではありませんでした。
  • 変更後: MOVQ $0, R8 // flags

    • これは、即値 0R8 レジスタに移動させる命令です。x86-64 System V ABIの呼び出し規約に従い、6番目の引数(この場合は flags)は R8 レジスタに渡されるべきであるため、この変更は正しいレジスタを使用するように修正しています。

この修正により、GoランタイムがmacOS上でスレッドを作成する際に、bsdthread_create システムコールに flags 引数が正しく渡されるようになり、Goプログラムの安定性と互換性が向上しました。

関連リンク

  • Go言語のランタイムに関するドキュメント (Goの公式ドキュメントを参照)
  • x86-64 System V ABI (特にCalling Conventionsのセクション)
  • Darwin (macOS) のシステムコールに関する情報 (Apple Developer Documentationなどを参照)

参考にした情報源リンク

  • x86-64 System V ABIに関する一般的な情報源
  • Go言語のソースコードとコミット履歴
  • bsdthread_create システムコールに関する情報 (macOSのmanページや関連ドキュメント)
  • Go言語の初期のランタイム実装に関する議論やドキュメント (もしあれば)

[インデックス 1343] ファイルの概要

このコミットは、Go言語のランタイムの一部である src/runtime/sys_amd64_darwin.s ファイルに対する変更です。このファイルは、macOS (Darwin) 上のAMD64アーキテクチャ向けに、GoランタイムがOSと対話するための低レベルのアセンブリコードを含んでいます。具体的には、スレッド作成などのシステムコールを呼び出すためのコードが含まれています。

コミット

  • コミットハッシュ: 7ca5a0d323058ef6f749f5c3b146081b931da113
  • 作者: Russ Cox rsc@golang.org
  • コミット日時: 2008年12月15日 月曜日 08:56:32 -0800
  • コミットメッセージ: correct arg register in bsdthread_create

GitHub上でのコミットページへのリンク

https://github.com/golang/go/commit/7ca5a0d323058ef6f749f5c3b146081b931da113

元コミット内容

commit 7ca5a0d323058ef6f749f5c3b146081b931da113
Author: Russ Cox <rsc@golang.org>
Date:   Mon Dec 15 08:56:32 2008 -0800

    correct arg register in bsdthread_create
    
    R=r
    DELTA=1  (0 added, 0 deleted, 1 changed)
    OCL=21040
    CL=21176
---
 src/runtime/sys_amd64_darwin.s | 2 +--
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/src/runtime/sys_amd64_darwin.s b/src/runtime/sys_amd64_darwin.s
index a276576d9d..92af21c935 100644
--- a/src/runtime/sys_amd64_darwin.s
+++ b/src/runtime/sys_amd64_darwin.s
@@ -157,7 +157,7 @@ TEXT bsdthread_create(SB),7,$-8
  	MOVQ	m+16(SP), SI	// "arg"
  	MOVQ	stk+8(SP), DX	// stack
  	MOVQ	g+24(SP), R10	// "pthread"
-	MOVQ	$0, R10	// flags
+	MOVQ	$0, R8	// flags
  	MOVQ	$(0x2000000+360), AX	// bsdthread_create
  	SYSCALL
  	JCC 2(PC)

変更の背景

このコミットは、macOS (Darwin) 上でスレッドを作成するために使用される bsdthread_create システムコールを呼び出す際のアセンブリコードにおけるレジスタの誤用を修正するものです。

x86-64アーキテクチャにおけるSystem V ABI (Application Binary Interface) は、関数呼び出しの際に引数をどのレジスタに配置するかを厳密に定義しています。macOSは、このSystem V ABIに準拠しています。bsdthread_create システムコールは複数の引数を取りますが、そのうちの1つである flags 引数が、本来渡されるべきレジスタとは異なる R10 レジスタに設定されていました。

この誤ったレジスタの使用は、bsdthread_create システムコールが flags 引数を正しく解釈できない原因となり、スレッド作成時の予期せぬ動作やエラーを引き起こす可能性がありました。Goランタイムは、OSの低レベルな機能と正確に連携する必要があるため、このようなABIの厳密な遵守が不可欠です。このコミットは、このABI違反を修正し、flags 引数が正しいレジスタ (R8) に渡されるようにすることで、bsdthread_create の呼び出しがABIに準拠し、安定して動作するようにしました。

前提知識の解説

Goランタイム

Go言語は、独自のランタイムを持っています。このランタイムは、ガベージコレクション、スケジューリング(ゴルーチンの管理)、メモリ管理、そしてOSとの低レベルな対話(システムコールなど)といった、Goプログラムの実行に必要な多くの機能を提供します。GoプログラムがOSの機能を利用する際には、このランタイムが仲介役となります。

アセンブリ言語 (x86-64/AMD64)

アセンブリ言語は、CPUが直接実行できる機械語に非常に近い低レベルのプログラミング言語です。x86-64 (またはAMD64) は、現代のほとんどのデスクトップおよびサーバーCPUで使用されている64ビット命令セットアーキテクチャです。Goランタイムのようなパフォーマンスが重要で、OSの機能に直接アクセスする必要がある部分では、アセンブリ言語が使用されることがあります。

  • レジスタ: CPU内部にある高速な記憶領域で、データや命令のアドレスを一時的に保持します。x86-64アーキテクチャには、RAX, RBX, RCX, RDX, RSI, RDI, RBP, RSP, R8 から R15 などの汎用レジスタがあります。
  • MOVQ 命令: "Move Quadword" の略で、64ビットのデータをある場所から別の場所へ移動させる命令です。

Darwin (macOS) システムコール

システムコールは、ユーザープログラムがオペレーティングシステムカーネルのサービス(ファイルI/O、メモリ管理、プロセス制御、スレッド作成など)を要求するためのインターフェースです。Goランタイムは、macOS上でスレッドを作成するために bsdthread_create のようなシステムコールを直接呼び出します。

x86-64 System V ABI (Application Binary Interface)

ABIは、オペレーティングシステムとプログラム、またはプログラムの異なるモジュール間で、どのようにデータがやり取りされ、関数が呼び出されるかを定義する一連の規則です。x86-64 System V ABIは、Linux、macOS、FreeBSDなどのUnix系システムで広く採用されています。

特に重要なのは「呼び出し規約 (Calling Convention)」です。これは、関数呼び出しの際に、引数がどのレジスタに渡されるか、戻り値がどのレジスタに格納されるか、スタックがどのように管理されるかなどを定めます。

x86-64 System V ABIにおける関数呼び出しの引数レジスタの一般的な順序は以下の通りです(最初の6つの整数/ポインタ引数):

  1. RDI
  2. RSI
  3. RDX
  4. RCX
  5. R8
  6. R9

これ以降の引数はスタックに積まれます。

技術的詳細

このコミットの技術的な核心は、bsdthread_create システムコールへの引数渡しが、x86-64 System V ABIの呼び出し規約に準拠していなかった点にあります。

bsdthread_create は、新しいスレッドを作成するためのDarwinの低レベルシステムコールです。このシステムコールは複数の引数を取ります。Web検索の結果によると、bsdthread_create の引数リストは以下のようになっています(Goランタイムのソースコードから推測される順序):

  1. stk (スタックポインタ)
  2. mp (Goランタイム内部のmachine構造体へのポインタ)
  3. g (Goランタイム内部のgoroutine構造体へのポインタ)
  4. fn (新しいスレッドが実行を開始する関数へのポインタ)
  5. arg (fn 関数に渡される引数)
  6. flags (スレッドの動作を制御するフラグ)

元のコードでは、flags 引数(値は 0)を R10 レジスタに設定していました。 MOVQ $0, R10 // flags

しかし、x86-64 System V ABIの呼び出し規約では、6番目の引数(0から数えて5番目)は R8 レジスタに渡されることになっています。上記の引数リストを見ると、flags はまさに6番目の引数に相当します。

したがって、flags の値を R10 に設定することはABI違反であり、システムコールが flags の値を正しく読み取れない原因となっていました。この修正は、flags の値を正しいレジスタである R8 に設定することで、このABI違反を解消し、システムコールが期待通りに動作するようにします。

MOVQ $(0x2000000+360), AX // bsdthread_create の行は、bsdthread_create システムコールの番号を AX レジスタにロードしていることを示しています。SYSCALL 命令は、AX に格納されたシステムコール番号と、他のレジスタに格納された引数を使用してカーネルにシステムコールを要求します。

コアとなるコードの変更箇所

--- a/src/runtime/sys_amd64_darwin.s
+++ b/src/runtime/sys_amd64_darwin.s
@@ -157,7 +157,7 @@ TEXT bsdthread_create(SB),7,$-8
  	MOVQ	m+16(SP), SI	// "arg"
  	MOVQ	stk+8(SP), DX	// stack
  	MOVQ	g+24(SP), R10	// "pthread"
-	MOVQ	$0, R10	// flags
+	MOVQ	$0, R8	// flags
  	MOVQ	$(0x2000000+360), AX	// bsdthread_create
  	SYSCALL
  	JCC 2(PC)

コアとなるコードの解説

変更された行は以下の通りです。

  • 変更前: MOVQ $0, R10 // flags

    • これは、即値 0R10 レジスタに移動させる命令です。コメントから、この 0flags 引数として意図されていたことがわかります。しかし、前述の通り、R10bsdthread_createflags 引数を受け取るべきレジスタではありませんでした。
  • 変更後: MOVQ $0, R8 // flags

    • これは、即値 0R8 レジスタに移動させる命令です。x86-64 System V ABIの呼び出し規約に従い、6番目の引数(この場合は flags)は R8 レジスタに渡されるべきであるため、この変更は正しいレジスタを使用するように修正しています。

この修正により、GoランタイムがmacOS上でスレッドを作成する際に、bsdthread_create システムコールに flags 引数が正しく渡されるようになり、Goプログラムの安定性と互換性が向上しました。

関連リンク

  • Go言語のランタイムに関するドキュメント (Goの公式ドキュメントを参照)
  • x86-64 System V ABI (特にCalling Conventionsのセクション)
  • Darwin (macOS) のシステムコールに関する情報 (Apple Developer Documentationなどを参照)

参考にした情報源リンク