[インデックス 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つの整数/ポインタ引数):
RDI
RSI
RDX
RCX
R8
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
- これは、即値
0
をR10
レジスタに移動させる命令です。コメントから、この0
がflags
引数として意図されていたことがわかります。しかし、前述の通り、R10
はbsdthread_create
のflags
引数を受け取るべきレジスタではありませんでした。
- これは、即値
-
変更後:
MOVQ $0, R8 // flags
- これは、即値
0
をR8
レジスタに移動させる命令です。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つの整数/ポインタ引数):
RDI
RSI
RDX
RCX
R8
R9
これ以降の引数はスタックに積まれます。
技術的詳細
このコミットの技術的な核心は、bsdthread_create
システムコールへの引数渡しが、x86-64 System V ABIの呼び出し規約に準拠していなかった点にあります。
bsdthread_create
は、新しいスレッドを作成するためのDarwinの低レベルシステムコールです。このシステムコールは複数の引数を取ります。Web検索の結果によると、bsdthread_create
の引数リストは以下のようになっています(Goランタイムのソースコードから推測される順序):
stk
(スタックポインタ)mp
(Goランタイム内部のmachine構造体へのポインタ)g
(Goランタイム内部のgoroutine構造体へのポインタ)fn
(新しいスレッドが実行を開始する関数へのポインタ)arg
(fn
関数に渡される引数)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
- これは、即値
0
をR10
レジスタに移動させる命令です。コメントから、この0
がflags
引数として意図されていたことがわかります。しかし、前述の通り、R10
はbsdthread_create
のflags
引数を受け取るべきレジスタではありませんでした。
- これは、即値
-
変更後:
MOVQ $0, R8 // flags
- これは、即値
0
をR8
レジスタに移動させる命令です。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
システムコールに関するWeb検索結果