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

[インデックス 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のサービスを要求するためのメカニズムです。例えば、ファイルの読み書き、プロセスの生成、メモリの割り当て、ネットワーク通信などは、すべてシステムコールを通じて行われます。

システムコールは通常、以下のような手順で実行されます。

  1. プログラムが、呼び出したいシステムコールの番号をCPUのレジスタ(例: AXレジスタ)に設定します。
  2. システムコールに渡す引数を他のレジスタやスタックに設定します。
  3. 特定の割り込み命令(例: INT $0x80 for i386, SYSCALL for amd64)を実行し、カーネルモードに切り替えます。
  4. カーネルがシステムコール番号を読み取り、対応するカーネル関数を実行します。
  5. 結果がレジスタに格納され、プログラムはユーザー空間に戻ります。

システムコール番号は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) 命令でカーネルに制御を渡します。

以下に、変更された主要なシステムコールとその詳細を解説します。

  1. runtime·exit1 (プロセス/スレッド終了)

    • : sys_threxit (システムコール番号 302)
    • : sys__lwp_exit (システムコール番号 310)
    • 解説: sys_threxit は古いスレッド終了に関連するシステムコールである可能性があります。NetBSDでは、軽量プロセス(LWP)がスレッドの実装に使われるため、sys__lwp_exit がLWPを終了させるための正しいシステムコールとなります。GoのゴルーチンがOSのスレッド(LWP)にマッピングされることを考えると、この変更はGoプログラムが正しく終了し、リソースを解放するために重要です。
  2. runtime·usleep (短い時間の一時停止)

    • : sys_nanosleep (システムコール番号 240)
    • : sys_nanosleep (システムコール番号 430)
    • 解説: nanosleep は指定された時間だけ現在のスレッドを休止させるシステムコールです。システムコール番号が 240 から 430 に変更されています。これはNetBSDのシステムコールテーブルの再編成によるものと考えられます。正確な時間制御は、Goのスケジューラやタイマー機能にとって不可欠です。
  3. 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の並行処理モデルにおいてデッドロックやリソースリークを防ぐ上で重要です。
  4. runtime·setitimer (タイマーの設定)

    • : sys_setitimer (システムコール番号 83)
    • : sys_setitimer (システムコール番号 425)
    • 解説: setitimer は、プロセスに定期的なタイマーを設定するためのシステムコールです。これもシステムコール番号が 83 から 425 に変更されています。Goのランタイムが内部的に使用するタイマー機能の正確な動作に影響します。
  5. time·now / runtime·nanotime (現在時刻の取得)

    • : sys_gettimeofday (システムコール番号 116)
    • : sys_gettimeofday (システムコール番号 418)
    • 解説: gettimeofday は、現在の時刻(秒とマイクロ秒)を取得するためのシステムコールです。Goの time パッケージや内部的な時間計測機能がこれを利用します。システムコール番号が 116 から 418 に変更されています。正確な時間取得は、ログ記録、パフォーマンス計測、タイムアウト処理など、Goプログラムの多くの側面で重要です。
  6. 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のスレッドモデルとの整合性を高めるものです。

関連リンク

参考にした情報源リンク