[インデックス 13075] ファイルの概要
このコミットは、Go言語のランタイムがNetBSDオペレーティングシステム上で正しく動作するために、システムコール(syscall)の番号と呼び出しを修正するものです。特に、i386およびamd64アーキテクチャ向けのNetBSD固有のアセンブリコードにおいて、誤ったシステムコール番号が使用されていた問題を解決しています。これにより、GoプログラムがNetBSD環境でプロセス終了、スレッド管理、時間取得、シグナル処理などの低レベルなOS機能と正確に連携できるようになります。
コミット
commit 0b7bcb84e394755664562fb70cd48c033e61669c
Author: Joel Sing <jsing@google.com>
Date: Wed May 16 03:33:37 2012 +1000
runtime: fix netbsd syscalls
Use correct system calls/syscall numbers for NetBSD.
R=golang-dev, for.go.yong, rsc
CC=golang-dev
https://golang.org/cl/6200070
GitHub上でのコミットページへのリンク
https://github.com/golang/go/commit/0b7bcb84e394755664562fb70cd48c033e61669c
元コミット内容
commit 0b7bcb84e394755664562fb70cd48c033e61669c
Author: Joel Sing <jsing@google.com>
Date: Wed May 16 03:33:37 2012 +1000
runtime: fix netbsd syscalls
Use correct system calls/syscall numbers for NetBSD.
R=golang-dev, for.go.yong, rsc
CC=golang-dev
https://golang.org/cl/6200070
---
src/pkg/runtime/sys_netbsd_386.s | 28 ++++++++++++++--------------
src/pkg/runtime/sys_netbsd_amd64.s | 26 +++++++++++++-------------\n 2 files changed, 27 insertions(+), 27 deletions(-)\n
diff --git a/src/pkg/runtime/sys_netbsd_386.s b/src/pkg/runtime/sys_netbsd_386.s
index 139f20d0f7..9b99807ad6 100644
--- a/src/pkg/runtime/sys_netbsd_386.s
+++ b/src/pkg/runtime/sys_netbsd_386.s
@@ -16,7 +16,7 @@ TEXT runtime·exit(SB),7,$-4
RET
TEXT runtime·exit1(SB),7,$-4
- MOVL $302, AX // sys_threxit
+ MOVL $310, AX // sys__lwp_exit
INT $0x80
JAE 2(PC)
MOVL $0xf1, 0xf1 // crash
@@ -41,17 +41,17 @@ TEXT runtime·usleep(SB),7,$20
LEAL 12(SP), AX
MOVL AX, 4(SP) // arg 1 - rqtp
MOVL $0, 8(SP) // arg 2 - rmtp
- MOVL $240, AX // sys_nanosleep
+ MOVL $430, AX // sys_nanosleep
INT $0x80
RET
TEXT runtime·raisesigpipe(SB),7,$12
- MOVL $299, AX // sys_getthrid
+ MOVL $311, AX // sys__lwp_self
INT $0x80
MOVL $0, 0(SP)
- MOVL AX, 4(SP) // arg 1 - pid
- MOVL $13, 8(SP) // arg 2 - signum == SIGPIPE
- MOVL $37, AX // sys_kill
+ MOVL AX, 4(SP) // arg 1 - target
+ MOVL $13, 8(SP) // arg 2 - signo == SIGPIPE
+ MOVL $318, AX // sys__lwp_kill
INT $0x80
RET
@@ -83,16 +83,16 @@ TEXT runtime·munmap(SB),7,$-4
RET
TEXT runtime·setitimer(SB),7,$-4
- MOVL $83, AX
+ MOVL $425, AX // sys_setitimer
INT $0x80
RET
// func now() (sec int64, nsec int32)
TEXT time·now(SB), 7, $32
- MOVL $116, AX
LEAL 12(SP), BX
- MOVL BX, 4(SP)
- MOVL $0, 8(SP)
+ MOVL BX, 4(SP) // arg 1 - tp
+ MOVL $0, 8(SP) // arg 2 - tzp
+ MOVL $418, AX // sys_gettimeofday
INT $0x80
MOVL 12(SP), AX // sec
MOVL 16(SP), BX // usec
@@ -107,10 +107,10 @@ TEXT time·now(SB), 7, $32
// int64 nanotime(void) so really
// void nanotime(int64 *nsec)
TEXT runtime·nanotime(SB),7,$32
- MOVL $116, AX
LEAL 12(SP), BX
- MOVL BX, 4(SP)
- MOVL $0, 8(SP)
+ MOVL BX, 4(SP) // arg 1 - tp
+ MOVL $0, 8(SP) // arg 2 - tzp
+ MOVL $418, AX // sys_gettimeofday
INT $0x80
MOVL 12(SP), AX // sec
MOVL 16(SP), BX // usec
@@ -307,7 +307,7 @@ TEXT runtime·settls(SB),7,$16
RET
TEXT runtime·osyield(SB),7,$-4
- MOVL $298, AX // sys_sched_yield
+ MOVL $350, AX // sys_sched_yield
INT $0x80
RET
diff --git a/src/pkg/runtime/sys_netbsd_amd64.s b/src/pkg/runtime/sys_netbsd_amd64.s
index 0f70f7cfa0..c57d413bc4 100644
--- a/src/pkg/runtime/sys_netbsd_amd64.s
+++ b/src/pkg/runtime/sys_netbsd_amd64.s
@@ -58,7 +58,7 @@ TEXT runtime·rfork_thread(SB),7,$0
JMP -3(PC) // keep exiting
TEXT runtime·osyield(SB),7,$0
- MOVL $298, AX // sys_sched_yield
+ MOVL $350, AX // sys_sched_yield
SYSCALL
RET
@@ -87,7 +87,7 @@ TEXT runtime·exit(SB),7,$-8
RET
TEXT runtime·exit1(SB),7,$-8
- MOVL $302, AX // sys_threxit
+ MOVL $310, AX // sys__lwp_exit
SYSCALL
MOVL $0xf1, 0xf1 // crash
RET
@@ -112,16 +112,16 @@ TEXT runtime·usleep(SB),7,$16
MOVQ SP, DI // arg 1 - rqtp
MOVQ $0, SI // arg 2 - rmtp
- MOVL $240, AX // sys_nanosleep
+ MOVL $430, AX // sys_nanosleep
SYSCALL
RET
TEXT runtime·raisesigpipe(SB),7,$16
- MOVL $299, AX // sys_getthrid
+ MOVL $311, AX // sys__lwp_self
SYSCALL
- MOVQ AX, DI // arg 1 - pid
- MOVQ $13, SI // arg 2 - signum == SIGPIPE
- MOVL $37, AX // sys_kill
+ MOVQ AX, DI // arg 1 - target
+ MOVQ $13, SI // arg 2 - signo == SIGPIPE
+ MOVL $318, AX // sys__lwp_kill
SYSCALL
RET
@@ -129,7 +129,7 @@ TEXT runtime·setitimer(SB),7,$-8
MOVL 8(SP), DI // arg 1 - which
MOVQ 16(SP), SI // arg 2 - itv
MOVQ 24(SP), DX // arg 3 - oitv
- MOVL $83, AX // sys_setitimer
+ MOVL $425, AX // sys_setitimer
SYSCALL
RET
@@ -137,10 +137,10 @@ TEXT runtime·setitimer(SB),7,$-8
TEXT time·now(SB), 7, $32
LEAQ 8(SP), DI // arg 1 - tp
MOVQ $0, SI // arg 2 - tzp
- MOVL $116, AX // sys_gettimeofday
+ MOVL $418, AX // sys_gettimeofday
SYSCALL
MOVQ 8(SP), AX // sec
- MOVL 16(SP), DX // usec
+ MOVL 16(SP), DX // usec
// sec is in AX, usec in DX
MOVQ AX, sec+0(FP)\n@@ -151,10 +151,10 @@ TEXT time·now(SB), 7, $32
TEXT runtime·nanotime(SB),7,$32
LEAQ 8(SP), DI // arg 1 - tp
MOVQ $0, SI // arg 2 - tzp
- MOVL $116, AX // sys_gettimeofday
+ MOVL $418, AX // sys_gettimeofday
SYSCALL
MOVQ 8(SP), AX // sec
- MOVL 16(SP), DX // usec
+ MOVL 16(SP), DX // usec
// sec is in AX, usec in DX
// return nsec in AX
@@ -224,7 +224,7 @@ TEXT runtime·mmap(SB),7,$0
SUBQ $16, SP
MOVQ R9, 8(SP) // arg 7 - offset (passed on stack)
MOVQ $0, R9 // arg 6 - pad
- MOVL $197, AX
+ MOVL $197, AX // sys_mmap
SYSCALL
JCC 2(PC)
NEGL AX
変更の背景
このコミットの背景には、Go言語のランタイムがNetBSDオペレーティングシステムと正しくインターフェースするための必要性があります。Goのランタイムは、メモリ管理、ゴルーチン(Goの軽量スレッド)のスケジューリング、システムコールへの低レベルなアクセスなど、OSと密接に連携する多くの機能を提供します。
NetBSDのようなUnix系OSでは、アプリケーションがカーネルの機能を利用するために「システムコール」を発行します。これらのシステムコールは、それぞれ固有の番号(システムコール番号)を持っており、OSのバージョンやアーキテクチャによって異なる場合があります。
このコミット以前のGoランタイムは、NetBSD環境において、いくつかの重要なシステムコールに対して誤った番号を使用していたか、あるいはNetBSDのシステムコールインターフェースの変更に対応できていなかったと考えられます。その結果、GoプログラムがNetBSD上で期待通りに動作しない、あるいはクラッシュするなどの問題が発生していた可能性があります。
具体的には、スレッドの終了、時間の取得、シグナルの送信、プロセスの休止といった基本的なOS操作に関連するシステムコールが対象となっています。これらの修正は、GoプログラムのNetBSD上での安定性と互換性を確保するために不可欠でした。
前提知識の解説
Goランタイム (Go Runtime)
Go言語は、独自のランタイムシステムを持っています。このランタイムは、Goプログラムの実行を管理する重要なコンポーネントであり、以下のような役割を担っています。
- ゴルーチン (Goroutine) スケジューリング: Goの軽量な並行処理単位であるゴルーチンを効率的にスケジューリングし、OSのスレッドにマッピングします。
- ガベージコレクション (Garbage Collection): メモリの自動管理を行い、不要になったメモリを解放します。
- システムコールインターフェース: プログラムがOSの機能(ファイルI/O、ネットワーク通信、プロセス管理など)を利用するための低レベルなインターフェースを提供します。
- スタック管理: ゴルーチンのスタックを動的に拡張・縮小します。
Goランタイムの一部は、パフォーマンスとOSとの密接な連携のために、C言語やアセンブリ言語で記述されています。特にシステムコールを直接呼び出す部分は、OSやCPUアーキテクチャに依存するため、アセンブリ言語で実装されることが多いです。
システムコール (System Calls)
システムコールは、ユーザー空間で実行されるプログラムが、カーネル空間で提供されるOSのサービスを要求するためのメカニズムです。例えば、ファイルの読み書き、プロセスの生成、メモリの割り当て、ネットワーク通信などは、すべてシステムコールを通じて行われます。
システムコールは通常、以下のような手順で実行されます。
- プログラムが、呼び出したいシステムコールの番号をCPUのレジスタ(例:
AX
レジスタ)に設定します。 - システムコールに渡す引数を他のレジスタやスタックに設定します。
- 特定の割り込み命令(例:
INT $0x80
for i386,SYSCALL
for amd64)を実行し、カーネルモードに切り替えます。 - カーネルがシステムコール番号を読み取り、対応するカーネル関数を実行します。
- 結果がレジスタに格納され、プログラムはユーザー空間に戻ります。
システムコール番号はOSによって異なり、同じOSでもバージョンアップによって変更されることがあります。
アセンブリ言語 (.s
ファイル)
アセンブリ言語は、CPUが直接理解できる機械語に非常に近い低レベルなプログラミング言語です。Goのランタイムでは、以下のような理由でアセンブリ言語が使用されます。
- システムコール呼び出し: OSのシステムコールを直接、かつ効率的に呼び出すため。
- コンテキストスイッチ: ゴルーチンの切り替えなど、CPUのレジスタ状態を直接操作する必要がある処理。
- パフォーマンスクリティカルな処理: 非常に高速な実行が求められる処理。
このコミットで変更されているファイル (sys_netbsd_386.s
, sys_netbsd_amd64.s
) は、それぞれi386 (32ビット) および amd64 (64ビット) アーキテクチャ向けのNetBSD固有のアセンブリコードです。
NetBSD
NetBSDは、オープンソースのUnix系オペレーティングシステムであり、高い移植性(多くのCPUアーキテクチャで動作する)を特徴としています。様々なハードウェアプラットフォームで動作するため、Goのようなクロスプラットフォーム言語のサポート対象となっています。
NetBSDは、他のBSD系OS(FreeBSD, OpenBSDなど)と同様に、独自のシステムコールインターフェースと番号体系を持っています。また、軽量プロセス(LWP: Lightweight Process)という概念を内部的に使用しており、これはユーザーレベルのスレッドとカーネルレベルのスレッドをマッピングするメカニズムです。
i386 / amd64 アーキテクチャ
- i386 (Intel 80386): 32ビットのx86アーキテクチャを指します。古いシステムや組み込みシステムでまだ使用されることがあります。システムコールは通常、
INT $0x80
命令を使用して呼び出されます。 - amd64 (x86-64): 64ビットのx86アーキテクチャを指し、現在のほとんどのデスクトップやサーバーで使用されています。システムコールは通常、
SYSCALL
命令を使用して呼び出されます。
これらのアーキテクチャでは、レジスタの数やサイズ、システムコールの呼び出し規約(引数の渡し方など)が異なるため、それぞれに対応するアセンブリコードが必要となります。
技術的詳細
このコミットの核心は、NetBSDにおける特定のシステムコール番号の変更、またはGoランタイムが参照していた古い/誤った番号の更新です。Goランタイムは、OSの低レベル機能を利用するために、アセンブリコード内で直接システムコールを呼び出します。この際、MOVL
(Move Long) 命令などを使って、呼び出したいシステムコールの番号をAX
レジスタ(または他の適切なレジスタ)に設定し、その後INT $0x80
(i386) または SYSCALL
(amd64) 命令でカーネルに制御を渡します。
以下に、変更された主要なシステムコールとその詳細を解説します。
-
runtime·exit1
(プロセス/スレッド終了)- 旧:
sys_threxit
(システムコール番号302
) - 新:
sys__lwp_exit
(システムコール番号310
) - 解説:
sys_threxit
は古いスレッド終了に関連するシステムコールである可能性があります。NetBSDでは、軽量プロセス(LWP)がスレッドの実装に使われるため、sys__lwp_exit
がLWPを終了させるための正しいシステムコールとなります。GoのゴルーチンがOSのスレッド(LWP)にマッピングされることを考えると、この変更はGoプログラムが正しく終了し、リソースを解放するために重要です。
- 旧:
-
runtime·usleep
(短い時間の一時停止)- 旧:
sys_nanosleep
(システムコール番号240
) - 新:
sys_nanosleep
(システムコール番号430
) - 解説:
nanosleep
は指定された時間だけ現在のスレッドを休止させるシステムコールです。システムコール番号が240
から430
に変更されています。これはNetBSDのシステムコールテーブルの再編成によるものと考えられます。正確な時間制御は、Goのスケジューラやタイマー機能にとって不可欠です。
- 旧:
-
runtime·raisesigpipe
(SIGPIPEシグナルの送信)- 旧:
sys_getthrid
(システムコール番号299
) とsys_kill
(システムコール番号37
) - 新:
sys__lwp_self
(システムコール番号311
) とsys__lwp_kill
(システムコール番号318
) - 解説:
sys_getthrid
は現在のスレッドIDを取得するシステムコールでしたが、sys__lwp_self
は現在のLWPのIDを取得します。NetBSDのLWPモデルに合わせた変更です。sys_kill
はプロセスやプロセスグループにシグナルを送信する汎用的なシステムコールですが、sys__lwp_kill
は特定のLWPにシグナルを送信するために特化しています。SIGPIPE
は、書き込みパイプの読み込み側が閉じられた場合に発生するシグナルで、GoのネットワークやI/O処理で重要です。LWPに対する正確なシグナル送信は、Goの並行処理モデルにおいてデッドロックやリソースリークを防ぐ上で重要です。
- 旧:
-
runtime·setitimer
(タイマーの設定)- 旧:
sys_setitimer
(システムコール番号83
) - 新:
sys_setitimer
(システムコール番号425
) - 解説:
setitimer
は、プロセスに定期的なタイマーを設定するためのシステムコールです。これもシステムコール番号が83
から425
に変更されています。Goのランタイムが内部的に使用するタイマー機能の正確な動作に影響します。
- 旧:
-
time·now
/runtime·nanotime
(現在時刻の取得)- 旧:
sys_gettimeofday
(システムコール番号116
) - 新:
sys_gettimeofday
(システムコール番号418
) - 解説:
gettimeofday
は、現在の時刻(秒とマイクロ秒)を取得するためのシステムコールです。Goのtime
パッケージや内部的な時間計測機能がこれを利用します。システムコール番号が116
から418
に変更されています。正確な時間取得は、ログ記録、パフォーマンス計測、タイムアウト処理など、Goプログラムの多くの側面で重要です。
- 旧:
-
runtime·osyield
(CPUの譲渡)- 旧:
sys_sched_yield
(システムコール番号298
) - 新:
sys_sched_yield
(システムコール番号350
) - 解説:
sched_yield
は、現在のスレッドがCPUを他のスレッドに譲渡することをOSに示唆するシステムコールです。Goのゴルーチンスケジューラが、OSのスレッド間でCPUを効率的に共有するために利用することがあります。システムコール番号が298
から350
に変更されています。
- 旧:
これらの変更は、NetBSDのシステムコールインターフェースの進化(おそらくNetBSD 5.xから6.xへの移行期など)に対応するためのものであり、GoランタイムがNetBSD上で安定して、かつ効率的に動作するための基盤を強化します。アセンブリコードレベルでの修正は、GoランタイムがOSの低レベルな機能に直接アクセスし、その動作を最適化していることを示しています。
コアとなるコードの変更箇所
このコミットは、src/pkg/runtime/sys_netbsd_386.s
(32ビット版) と src/pkg/runtime/sys_netbsd_amd64.s
(64ビット版) の2つのアセンブリファイルにわたるシステムコール番号の変更が中心です。
src/pkg/runtime/sys_netbsd_386.s
の変更点
--- a/src/pkg/runtime/sys_netbsd_386.s
+++ b/src/pkg/runtime/sys_netbsd_386.s
@@ -16,7 +16,7 @@ TEXT runtime·exit(SB),7,$-4
RET
TEXT runtime·exit1(SB),7,$-4
- MOVL $302, AX // sys_threxit
+ MOVL $310, AX // sys__lwp_exit
INT $0x80
JAE 2(PC)
MOVL $0xf1, 0xf1 // crash
@@ -41,17 +41,17 @@ TEXT runtime·usleep(SB),7,$20
LEAL 12(SP), AX
MOVL AX, 4(SP) // arg 1 - rqtp
MOVL $0, 8(SP) // arg 2 - rmtp
- MOVL $240, AX // sys_nanosleep
+ MOVL $430, AX // sys_nanosleep
INT $0x80
RET
TEXT runtime·raisesigpipe(SB),7,$12
- MOVL $299, AX // sys_getthrid
+ MOVL $311, AX // sys__lwp_self
INT $0x80
MOVL $0, 0(SP)
- MOVL AX, 4(SP) // arg 1 - pid
- MOVL $13, 8(SP) // arg 2 - signum == SIGPIPE
- MOVL $37, AX // sys_kill
+ MOVL AX, 4(SP) // arg 1 - target
+ MOVL $13, 8(SP) // arg 2 - signo == SIGPIPE
+ MOVL $318, AX // sys__lwp_kill
INT $0x80
RET
@@ -83,16 +83,16 @@ TEXT runtime·munmap(SB),7,$-4
RET
TEXT runtime·setitimer(SB),7,$-4
- MOVL $83, AX
+ MOVL $425, AX // sys_setitimer
INT $0x80
RET
// func now() (sec int64, nsec int32)
TEXT time·now(SB), 7, $32
- MOVL $116, AX
LEAL 12(SP), BX
- MOVL BX, 4(SP)
- MOVL $0, 8(SP)
+ MOVL BX, 4(SP) // arg 1 - tp
+ MOVL $0, 8(SP) // arg 2 - tzp
+ MOVL $418, AX // sys_gettimeofday
INT $0x80
MOVL 12(SP), AX // sec
MOVL 16(SP), BX // usec
@@ -107,10 +107,10 @@ TEXT time·now(SB), 7, $32
// int64 nanotime(void) so really
// void nanotime(int64 *nsec)
TEXT runtime·nanotime(SB),7,$32
- MOVL $116, AX
LEAL 12(SP), BX
- MOVL BX, 4(SP)
- MOVL $0, 8(SP)
+ MOVL BX, 4(SP) // arg 1 - tp
+ MOVL $0, 8(SP) // arg 2 - tzp
+ MOVL $418, AX // sys_gettimeofday
INT $0x80
MOVL 12(SP), AX // sec
MOVL 16(SP), BX // usec
@@ -307,7 +307,7 @@ TEXT runtime·settls(SB),7,$16
RET
TEXT runtime·osyield(SB),7,$-4
- MOVL $298, AX // sys_sched_yield
+ MOVL $350, AX // sys_sched_yield
INT $0x80
RET
src/pkg/runtime/sys_netbsd_amd64.s
の変更点
--- a/src/pkg/runtime/sys_netbsd_amd64.s
+++ b/src/pkg/runtime/sys_netbsd_amd64.s
@@ -58,7 +58,7 @@ TEXT runtime·rfork_thread(SB),7,$0
JMP -3(PC) // keep exiting
TEXT runtime·osyield(SB),7,$0
- MOVL $298, AX // sys_sched_yield
+ MOVL $350, AX // sys_sched_yield
SYSCALL
RET
@@ -87,7 +87,7 @@ TEXT runtime·exit(SB),7,$-8
RET
TEXT runtime·exit1(SB),7,$-8
- MOVL $302, AX // sys_threxit
+ MOVL $310, AX // sys__lwp_exit
SYSCALL
MOVL $0xf1, 0xf1 // crash
RET
@@ -112,16 +112,16 @@ TEXT runtime·usleep(SB),7,$16
MOVQ SP, DI // arg 1 - rqtp
MOVQ $0, SI // arg 2 - rmtp
- MOVL $240, AX // sys_nanosleep
+ MOVL $430, AX // sys_nanosleep
SYSCALL
RET
TEXT runtime·raisesigpipe(SB),7,$16
- MOVL $299, AX // sys_getthrid
+ MOVL $311, AX // sys__lwp_self
SYSCALL
- MOVQ AX, DI // arg 1 - pid
- MOVQ $13, SI // arg 2 - signum == SIGPIPE
- MOVL $37, AX // sys_kill
+ MOVQ AX, DI // arg 1 - target
+ MOVQ $13, SI // arg 2 - signo == SIGPIPE
+ MOVL $318, AX // sys__lwp_kill
SYSCALL
RET
@@ -129,7 +129,7 @@ TEXT runtime·setitimer(SB),7,$-8
MOVL 8(SP), DI // arg 1 - which
MOVQ 16(SP), SI // arg 2 - itv
MOVQ 24(SP), DX // arg 3 - oitv
- MOVL $83, AX // sys_setitimer
+ MOVL $425, AX // sys_setitimer
SYSCALL
RET
@@ -137,10 +137,10 @@ TEXT runtime·setitimer(SB),7,$-8
TEXT time·now(SB), 7, $32
LEAQ 8(SP), DI // arg 1 - tp
MOVQ $0, SI // arg 2 - tzp
- MOVL $116, AX // sys_gettimeofday
+ MOVL $418, AX // sys_gettimeofday
SYSCALL
MOVQ 8(SP), AX // sec
- MOVL 16(SP), DX // usec
+ MOVL 16(SP), DX // usec
// sec is in AX, usec in DX
MOVQ AX, sec+0(FP)\n@@ -151,10 +151,10 @@ TEXT time·now(SB), 7, $32
TEXT runtime·nanotime(SB),7,$32
LEAQ 8(SP), DI // arg 1 - tp
MOVQ $0, SI // arg 2 - tzp
- MOVL $116, AX // sys_gettimeofday
+ MOVL $418, AX // sys_gettimeofday
SYSCALL
MOVQ 8(SP), AX // sec
- MOVL 16(SP), DX // usec
+ MOVL 16(SP), DX // usec
// sec is in AX, usec in DX
// return nsec in AX
@@ -224,7 +224,7 @@ TEXT runtime·mmap(SB),7,$0
SUBQ $16, SP
MOVQ R9, 8(SP) // arg 7 - offset (passed on stack)
MOVQ $0, R9 // arg 6 - pad
- MOVL $197, AX
+ MOVL $197, AX // sys_mmap
SYSCALL
JCC 2(PC)
NEGL AX
コアとなるコードの解説
上記の変更箇所は、GoランタイムがNetBSD上でシステムコールを呼び出す際のアセンブリコードです。各行の MOVL $数値, AX
は、システムコール番号を AX
レジスタにロードする命令です。その後の INT $0x80
(i386) または SYSCALL
(amd64) が実際のシステムコール呼び出しを実行します。
-
TEXT runtime·exit1(SB),7,$-4
:MOVL $302, AX
からMOVL $310, AX
へ変更。sys_threxit
(302) からsys__lwp_exit
(310) へと、スレッド終了のシステムコールがNetBSDのLWPモデルに合わせたものに更新されました。
-
TEXT runtime·usleep(SB),7,$20
:MOVL $240, AX
からMOVL $430, AX
へ変更。sys_nanosleep
のシステムコール番号が240
から430
に更新されました。これにより、Goのtime.Sleep
などが正確に機能するようになります。
-
TEXT runtime·raisesigpipe(SB),7,$12
:MOVL $299, AX
からMOVL $311, AX
へ変更。sys_getthrid
(299) からsys__lwp_self
(311) へと、現在のスレッドID取得がLWP ID取得に変わりました。MOVL $37, AX
からMOVL $318, AX
へ変更。sys_kill
(37) からsys__lwp_kill
(318) へと、シグナル送信のシステムコールがLWP特化のものに更新されました。
-
TEXT runtime·setitimer(SB),7,$-4
:MOVL $83, AX
からMOVL $425, AX
へ変更。sys_setitimer
のシステムコール番号が83
から425
に更新されました。
-
TEXT time·now(SB), 7, $32
およびTEXT runtime·nanotime(SB),7,$32
:MOVL $116, AX
からMOVL $418, AX
へ変更。sys_gettimeofday
のシステムコール番号が116
から418
に更新されました。これにより、Goの時刻関連関数が正確な時間を取得できるようになります。
-
TEXT runtime·osyield(SB),7,$-4
:MOVL $298, AX
からMOVL $350, AX
へ変更。sys_sched_yield
のシステムコール番号が298
から350
に更新されました。
これらの変更は、NetBSDのシステムコールインターフェースの進化にGoランタイムが追従したことを示しており、GoプログラムがNetBSD環境で安定して動作するための重要な基盤修正です。特に、LWP関連のシステムコールへの移行は、NetBSDのスレッドモデルとの整合性を高めるものです。
関連リンク
- Go CL 6200070: https://golang.org/cl/6200070
参考にした情報源リンク
- NetBSD System Call Table (一般的な情報源として):
- https://man.netbsd.org/syscalls.2 (NetBSDのmanページはバージョンによって異なるため、具体的なバージョンに合わせた参照が必要です)
- Go Runtime Source Code (一般的な情報源として):
- x86 Assembly Language (一般的な情報源として):
- Lightweight Process (LWP) (一般的な情報源として):
- Go言語のシステムコールに関するドキュメントやブログ記事 (一般的な情報源として、特定の記事はコミット時点のものではない可能性があります):
- Goのシステムプログラミングに関する公式ドキュメントやブログ記事
- Goのランタイムに関する技術解説記事