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

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

このコミットは、Go言語のランタイムにおけるmmapシステムコールのコメント修正に関するものです。特に、32ビットアーキテクチャ(i386)におけるファイルオフセットの扱いについて、既存のコードの挙動をより正確に反映させるための変更が行われました。機能的な変更ではなく、ドキュメントとコメントの整合性を高めることが目的です。

コミット

commit b151af1f36b0e2274bbf4b816a80c940126f6b32
Author: Shenghou Ma <minux.ma@gmail.com>
Date:   Fri Sep 21 13:50:02 2012 +0800

    runtime: fix mmap comments
    We only pass lower 32 bits of file offset to asm routine.
    
    R=r, dave, rsc
    CC=golang-dev
    https://golang.org/cl/6499118

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

https://github.com/golang/go/commit/b151af1f36b0e2274bbf4b816a80c940126f6b32

元コミット内容

runtime: fix mmap comments
We only pass lower 32 bits of file offset to asm routine.

変更の背景

このコミットの背景には、Goランタイムがmmapシステムコールを呼び出す際のファイルオフセットの扱いの明確化があります。特に32ビットシステム(i386アーキテクチャ)において、mmapシステムコールに渡されるファイルオフセットが32ビットの下位部分のみであるという既存の挙動が、コメントやドキュメントに正確に反映されていなかったことが問題でした。

Go言語のランタイムは、OSのシステムコールを直接呼び出すためにアセンブリコードを使用することがよくあります。mmapのようなメモリマッピングに関連するシステムコールは、ファイルやデバイスをプロセスのアドレス空間にマッピングするために非常に重要です。このシステムコールは、マッピングを開始するファイル内のオフセットを指定する引数を取ります。

32ビットシステムでは、ポインタやアドレス、一部の整数型が32ビット幅で表現されます。しかし、ファイルサイズやオフセットは32ビットを超える場合があり、特に64ビットファイルシステム(LFS: Large File Support)が導入されてからは、64ビットのオフセットを扱うことが一般的になりました。Goランタイムは、このようなシステムコールをラップする際に、アーキテクチャ固有の制約や慣習を考慮する必要があります。

このコミットは、既存のmmapの実装が32ビットシステムにおいてファイルオフセットの下位32ビットのみをアセンブリルーチンに渡しているという事実を、コード内のコメントで明確にすることで、将来の誤解やバグを防ぐことを目的としています。これは機能変更ではなく、コードの可読性と正確性を向上させるためのドキュメンテーションの改善です。

前提知識の解説

1. mmapシステムコール

mmap(memory map)は、Unix系OSで提供されるシステムコールの一つで、ファイルやデバイスをプロセスのアドレス空間に直接マッピングするために使用されます。これにより、ファイルの内容を通常のファイルI/O関数(read, writeなど)を介さずに、メモリへのアクセスと同じように扱うことができます。

mmapの主な引数は以下の通りです(簡略化された形式):

  • addr: マッピングを開始するアドレスのヒント。通常はNULLを指定し、OSに適切なアドレスを選択させます。
  • length: マッピングするバイト数。
  • prot: メモリ保護フラグ(例: PROT_READ, PROT_WRITE, PROT_EXEC)。
  • flags: マッピングのタイプと動作を指定するフラグ(例: MAP_SHARED, MAP_PRIVATE, MAP_ANONYMOUS)。
  • fd: マッピングするファイルのファイルディスクリプタ。匿名マッピングの場合は-1
  • offset: ファイル内のどこからマッピングを開始するかを示すオフセット。

mmapは、大規模なファイルの処理、共有メモリの実装、動的ライブラリのロードなど、様々な用途で利用されます。

2. 32ビットと64ビットアーキテクチャ

コンピュータのアーキテクチャは、CPUが一度に処理できるデータのビット幅によって32ビットまたは64ビットに分類されます。

  • 32ビットアーキテクチャ (例: i386):

    • レジスタ、メモリアドレス、ポインタなどが32ビット幅です。
    • これにより、直接アクセスできるメモリ空間は最大で2^32バイト(4GB)に制限されます。
    • ファイルオフセットも通常は32ビットで扱われますが、大規模なファイルを扱うために64ビットオフセットをサポートする拡張(LFS)が存在します。
  • 64ビットアーキテクチャ (例: amd64):

    • レジスタ、メモリアドレス、ポインタなどが64ビット幅です。
    • これにより、理論上は2^64バイト(16エクサバイト)という広大なメモリ空間にアクセスできます。
    • ファイルオフセットも自然に64ビットで扱われます。

Goランタイムは、異なるアーキテクチャやOSに対応するために、それぞれの環境に合わせたアセンブリコードやCコード(Goの内部ではC言語のサブセットが使われることがあります)を持っています。

3. アセンブリルーチンとシステムコールラッパー

Goランタイムは、OSのシステムコールを直接呼び出すために、Go言語から呼び出されるアセンブリルーチン(またはC言語で書かれたラッパー)を使用します。これは、GoのランタイムがOSと密接に連携し、メモリ管理、スケジューリング、I/Oなどを効率的に行うために必要です。

これらのアセンブリルーチンは、Goの関数呼び出し規約とOSのシステムコール呼び出し規約の間で引数を変換し、システムコールを実行し、その結果をGoに返します。この変換プロセスにおいて、引数のサイズ(例: 32ビット vs 64ビット)やレジスタの割り当てなどが重要になります。

このコミットでは、mmapoffset引数が、Goのuint32型としてアセンブリルーチンに渡される際に、32ビットシステムではその下位32ビットのみが有効であるという事実を明確にしています。もし64ビットのオフセットが必要な場合、アセンブリルーチン側で上位ビットをゼロとして扱う(つまり、32ビットオフセットの範囲内に制限する)という暗黙の前提があったことを示唆しています。

技術的詳細

このコミットは、Goランタイムがmmapシステムコールを呼び出す際のファイルオフセットの処理に関するコメントの正確性を向上させるものです。特に、32ビットアーキテクチャ(386)向けのFreeBSD, NetBSD, OpenBSDのシステムコールラッパーに焦点を当てています。

Goのruntime·mmap関数は、uint32型のoffset引数を受け取ります。しかし、実際のmmapシステムコールは、通常、64ビットのオフセットをサポートします(特にLFSが有効な場合)。32ビットシステムにおいて、Goランタイムがどのようにこのオフセットをアセンブリルーチンに渡し、アセンブリルーチンがそれをどのようにシステムコールに渡すかという点に、この変更の核心があります。

変更前のコメントでは、アセンブリコードがmmapのオフセットの上位ビットを「top 64 bits of file offset」として扱っているかのような記述がありました。しかし、実際には32ビットシステムでは、Goのruntime·mmap関数に渡されるuint32型のオフセットは、その下位32ビットのみがアセンブリルーチンに渡され、上位ビットはアセンブリルーチン側でゼロとして扱われる(または無視される)という挙動でした。これは、32ビットシステムでは4GBを超えるファイルオフセットを直接扱うことができないため、実質的にオフセットが32ビットに制限されることを意味します。

このコミットは、この既存の挙動を正確に反映させるために、以下の2つの主要な変更を行っています。

  1. src/pkg/runtime/runtime.h のコメント追加: runtime·mmap関数の宣言の前に、新しいコメントが追加されました。

    // for mmap, we only pass the lower 32 bits of file offset to the
    // assembly routine; the higher bits (if required), should be provided
    // by the assembly routine as 0.
    

    このコメントは、GoのCコード(またはGoの内部C言語サブセット)からアセンブリルーチンにmmapのオフセットを渡す際に、下位32ビットのみが渡されることを明示しています。そして、もしより大きなオフセットが必要な場合(これは32ビットシステムでは通常発生しませんが、概念的な説明として)、アセンブリルーチンが上位ビットをゼロとして提供する必要があることを示唆しています。これは、mmapシステムコールが64ビットオフセットを期待する場合でも、32ビットシステムでは実質的に32ビットオフセットしか扱えないという制約を補足しています。

  2. アセンブリファイルのコメント修正: src/pkg/runtime/sys_freebsd_386.s, src/pkg/runtime/sys_netbsd_386.s, src/pkg/runtime/sys_openbsd_386.s の各ファイルにおいて、mmapシステムコールに渡すオフセットの上位ビットをゼロに設定する部分のコメントが修正されました。 変更前: // top 64 bits of file offset 変更後: // top 32 bits of file offset この修正は、32ビットシステムにおいて、mmapシステムコールに渡されるオフセットが実質的に32ビット幅であり、その上位32ビット(つまり、全体で64ビットオフセットを形成する際の上位部分)がゼロに設定されることをより正確に表現しています。これは、32ビットシステムでは4GBを超えるオフセットは扱えないため、上位ビットは常にゼロになるという事実を反映しています。

これらの変更は、コードの動作を変更するものではなく、Goランタイムが32ビットシステムでmmapのオフセットをどのように扱っているかについてのドキュメンテーションを改善し、コードの意図をより明確にすることを目的としています。これにより、将来のメンテナンスやデバッグが容易になります。

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

src/pkg/runtime/runtime.h

--- a/src/pkg/runtime/runtime.h
+++ b/src/pkg/runtime/runtime.h
@@ -728,6 +728,9 @@ void	runtime·parfordo(ParFor *desc);
 /*
  * low level C-called
  */
+// for mmap, we only pass the lower 32 bits of file offset to the 
+// assembly routine; the higher bits (if required), should be provided
+// by the assembly routine as 0.
 uint8*	runtime·mmap(byte*, uintptr, int32, int32, int32, uint32);
 void	runtime·munmap(byte*, uintptr);
 void	runtime·madvise(byte*, uintptr, int32);

src/pkg/runtime/sys_freebsd_386.s

--- a/src/pkg/runtime/sys_freebsd_386.s
+++ b/src/pkg/runtime/sys_freebsd_386.s
@@ -89,7 +89,7 @@ TEXT runtime·mmap(SB),7,$32
 	MOVSL
 	MOVSL
 	MOVSL
-	MOVL	$0, AX	// top 64 bits of file offset
+	MOVL	$0, AX	// top 32 bits of file offset
 	STOSL
 	MOVL	$477, AX
 	INT	$0x80

src/pkg/runtime/sys_netbsd_386.s

--- a/src/pkg/runtime/sys_netbsd_386.s
+++ b/src/pkg/runtime/sys_netbsd_386.s
@@ -68,7 +68,7 @@ TEXT runtime·mmap(SB),7,$36
 	MOVL	$0, AX
 	STOSL				// arg 6 - pad
 	MOVSL				// arg 7 - offset
-	MOVL	$0, AX			// top 64 bits of file offset
+	MOVL	$0, AX			// top 32 bits of file offset
 	STOSL
 	MOVL	$197, AX		// sys_mmap
 	INT	$0x80

src/pkg/runtime/sys_openbsd_386.s

--- a/src/pkg/runtime/sys_openbsd_386.s
+++ b/src/pkg/runtime/sys_openbsd_386.s
@@ -69,7 +69,7 @@ TEXT runtime·mmap(SB),7,$36
 	MOVL	$0, AX
 	STOSL				// arg 6 - pad
 	MOVSL				// arg 7 - offset
-	MOVL	$0, AX			// top 64 bits of file offset
+	MOVL	$0, AX			// top 32 bits of file offset
 	STOSL
 	MOVL	$197, AX		// sys_mmap
 	INT	$0x80

コアとなるコードの解説

このコミットの主要な変更は、Goランタイムがmmapシステムコールを呼び出す際のアセンブリルーチンにおけるファイルオフセットの扱いに関するコメントの修正と、runtime.hへの補足コメントの追加です。

  1. src/pkg/runtime/runtime.h の変更: runtime·mmap関数のシグネチャは uint8* runtime·mmap(byte*, uintptr, int32, int32, int32, uint32); です。ここで最後の引数 uint32 がファイルオフセットを表します。 追加されたコメント // for mmap, we only pass the lower 32 bits of file offset to the // assembly routine; the higher bits (if required), should be provided // by the assembly routine as 0. は、GoのCコード(またはGoの内部C言語サブセット)からアセンブリルーチンにmmapのオフセットを渡す際に、uint32型のオフセットがそのまま下位32ビットとして渡されることを明確にしています。これは、32ビットシステムではポインタや整数が32ビット幅であるため、自然な挙動です。もしmmapシステムコールが64ビットのオフセットを期待する場合でも、Goのランタイムが提供するオフセットは32ビットに制限されるため、アセンブリルーチン側で上位32ビットをゼロとして埋める必要があることを示唆しています。これは、32ビットシステムでは4GBを超えるファイルオフセットを直接扱うことができないという制約を補足するものです。

  2. アセンブリファイルの変更 (sys_freebsd_386.s, sys_netbsd_386.s, sys_openbsd_386.s): これらのファイルは、それぞれFreeBSD, NetBSD, OpenBSDの32ビット(i386)アーキテクチャ向けのアセンブリコードです。 TEXT runtime·mmap(SB),7,$XX は、Goのruntime·mmap関数に対応するアセンブリルーチンの開始を示しています。 MOVSL 命令は、スタックから値をレジスタに移動させる(またはその逆)操作に関連している可能性があります。 MOVL $0, AX は、AXレジスタに0を移動させる命令です。AXレジスタは、システムコールに引数を渡すため、または戻り値を格納するために使用されることがあります。 変更されたコメント // top 32 bits of file offset は、このMOVL $0, AX命令が、mmapシステムコールに渡されるファイルオフセットの「上位32ビット」をゼロに設定していることを示しています。 元のコメント // top 64 bits of file offset は、おそらく64ビットシステムでのmmapのオフセットの扱いに言及していたか、あるいは単に不正確な記述でした。32ビットシステムでは、mmapのオフセットは実質的に32ビットに制限されるため、64ビットオフセットを形成する際の上位32ビットは常にゼロになります。この修正は、この事実をより正確に反映し、コードの意図を明確にしています。

要するに、このコミットは、32ビットシステムにおけるmmapのファイルオフセットの扱いについて、Goランタイムの既存の挙動をコメントで正確に記述することで、コードの理解を深め、将来の混乱を防ぐためのドキュメンテーション改善です。機能的な変更は一切ありません。

関連リンク

参考にした情報源リンク

  • mmapシステムコールに関するmanページ (例: man 2 mmap)
  • 32ビットおよび64ビットアーキテクチャに関する一般的な情報
  • Go言語のランタイムに関するドキュメントやブログ記事 (Goの内部実装に関するもの)
  • アセンブリ言語(x86/i386)の基本的な知識
  • Goのソースコード内の他のmmap関連の実装(異なるOSやアーキテクチャ向け)```

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

このコミットは、Go言語のランタイムにおけるmmapシステムコールのコメント修正に関するものです。特に、32ビットアーキテクチャ(i386)におけるファイルオフセットの扱いについて、既存のコードの挙動をより正確に反映させるための変更が行われました。機能的な変更ではなく、ドキュメントとコメントの整合性を高めることが目的です。

コミット

commit b151af1f36b0e2274bbf4b816a80c940126f6b32
Author: Shenghou Ma <minux.ma@gmail.com>
Date:   Fri Sep 21 13:50:02 2012 +0800

    runtime: fix mmap comments
    We only pass lower 32 bits of file offset to asm routine.
    
    R=r, dave, rsc
    CC=golang-dev
    https://golang.org/cl/6499118

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

https://github.com/golang/go/commit/b151af1f36b0e2274bbf4b816a80c940126f6b32

元コミット内容

runtime: fix mmap comments
We only pass lower 32 bits of file offset to asm routine.

変更の背景

このコミットの背景には、Goランタイムがmmapシステムコールを呼び出す際のファイルオフセットの扱いの明確化があります。特に32ビットシステム(i386アーキテクチャ)において、mmapシステムコールに渡されるファイルオフセットが32ビットの下位部分のみであるという既存の挙動が、コメントやドキュメントに正確に反映されていなかったことが問題でした。

Go言語のランタイムは、OSのシステムコールを直接呼び出すためにアセンブリコードを使用することがよくあります。mmapのようなメモリマッピングに関連するシステムコールは、ファイルやデバイスをプロセスのアドレス空間にマッピングするために非常に重要です。このシステムコールは、マッピングを開始するファイル内のオフセットを指定する引数を取ります。

32ビットシステムでは、ポインタやアドレス、一部の整数型が32ビット幅で表現されます。しかし、ファイルサイズやオフセットは32ビットを超える場合があり、特に64ビットファイルシステム(LFS: Large File Support)が導入されてからは、64ビットのオフセットを扱うことが一般的になりました。Goランタイムは、このようなシステムコールをラップする際に、アーキテクチャ固有の制約や慣習を考慮する必要があります。

このコミットは、既存のmmapの実装が32ビットシステムにおいてファイルオフセットの下位32ビットのみをアセンブリルーチンに渡しているという事実を、コード内のコメントで明確にすることで、将来の誤解やバグを防ぐことを目的としています。これは機能変更ではなく、コードの可読性と正確性を向上させるためのドキュメンテーションの改善です。

前提知識の解説

1. mmapシステムコール

mmap(memory map)は、Unix系OSで提供されるシステムコールの一つで、ファイルやデバイスをプロセスのアドレス空間に直接マッピングするために使用されます。これにより、ファイルの内容を通常のファイルI/O関数(read, writeなど)を介さずに、メモリへのアクセスと同じように扱うことができます。

mmapの主な引数は以下の通りです(簡略化された形式):

  • addr: マッピングを開始するアドレスのヒント。通常はNULLを指定し、OSに適切なアドレスを選択させます。
  • length: マッピングするバイト数。
  • prot: メモリ保護フラグ(例: PROT_READ, PROT_WRITE, PROT_EXEC)。
  • flags: マッピングのタイプと動作を指定するフラグ(例: MAP_SHARED, MAP_PRIVATE, MAP_ANONYMOUS)。
  • fd: マッピングするファイルのファイルディスクリプタ。匿名マッピングの場合は-1
  • offset: ファイル内のどこからマッピングを開始するかを示すオフセット。

mmapは、大規模なファイルの処理、共有メモリの実装、動的ライブラリのロードなど、様々な用途で利用されます。

2. 32ビットと64ビットアーキテクチャ

コンピュータのアーキテクチャは、CPUが一度に処理できるデータのビット幅によって32ビットまたは64ビットに分類されます。

  • 32ビットアーキテクチャ (例: i386):

    • レジスタ、メモリアドレス、ポインタなどが32ビット幅です。
    • これにより、直接アクセスできるメモリ空間は最大で2^32バイト(4GB)に制限されます。
    • ファイルオフセットも通常は32ビットで扱われますが、大規模なファイルを扱うために64ビットオフセットをサポートする拡張(LFS)が存在します。
  • 64ビットアーキテクチャ (例: amd64):

    • レジスタ、メモリアドレス、ポインタなどが64ビット幅です。
    • これにより、理論上は2^64バイト(16エクサバイト)という広大なメモリ空間にアクセスできます。
    • ファイルオフセットも自然に64ビットで扱われます。

Goランタイムは、異なるアーキテクチャやOSに対応するために、それぞれの環境に合わせたアセンブリコードやCコード(Goの内部ではC言語のサブセットが使われることがあります)を持っています。

3. アセンブリルーチンとシステムコールラッパー

Goランタイムは、OSのシステムコールを直接呼び出すために、Go言語から呼び出されるアセンブリルーチン(またはC言語で書かれたラッパー)を使用します。これは、GoのランタイムがOSと密接に連携し、メモリ管理、スケジューリング、I/Oなどを効率的に行うために必要です。

これらのアセンブリルーチンは、Goの関数呼び出し規約とOSのシステムコール呼び出し規約の間で引数を変換し、システムコールを実行し、その結果をGoに返します。この変換プロセスにおいて、引数のサイズ(例: 32ビット vs 64ビット)やレジスタの割り当てなどが重要になります。

このコミットでは、mmapoffset引数が、Goのuint32型としてアセンブリルーチンに渡される際に、32ビットシステムではその下位32ビットのみが有効であるという事実を明確にしています。もし64ビットのオフセットが必要な場合、アセンブリルーチン側で上位ビットをゼロとして扱う(つまり、32ビットオフセットの範囲内に制限する)という暗黙の前提があったことを示唆しています。

技術的詳細

このコミットは、Goランタイムがmmapシステムコールを呼び出す際のファイルオフセットの処理に関するコメントの正確性を向上させるものです。特に、32ビットアーキテクチャ(386)向けのFreeBSD, NetBSD, OpenBSDのシステムコールラッパーに焦点を当てています。

Goのruntime·mmap関数は、uint32型のoffset引数を受け取ります。しかし、実際のmmapシステムコールは、通常、64ビットのオフセットをサポートします(特にLFSが有効な場合)。32ビットシステムにおいて、Goランタイムがどのようにこのオフセットをアセンブリルーチンに渡し、アセンブリルーチンがそれをどのようにシステムコールに渡すかという点に、この変更の核心があります。

変更前のコメントでは、アセンブリコードがmmapのオフセットの上位ビットを「top 64 bits of file offset」として扱っているかのような記述がありました。しかし、実際には32ビットシステムでは、Goのruntime·mmap関数に渡されるuint32型のオフセットは、その下位32ビットのみがアセンブリルーチンに渡され、上位ビットはアセンブリルーチン側でゼロとして扱われる(または無視される)という挙動でした。これは、32ビットシステムでは4GBを超えるファイルオフセットを直接扱うことができないため、実質的にオフセットが32ビットに制限されることを意味します。

このコミットは、この既存の挙動を正確に反映させるために、以下の2つの主要な変更を行っています。

  1. src/pkg/runtime/runtime.h のコメント追加: runtime·mmap関数の宣言の前に、新しいコメントが追加されました。

    // for mmap, we only pass the lower 32 bits of file offset to the 
    // assembly routine; the higher bits (if required), should be provided
    // by the assembly routine as 0.
    

    このコメントは、GoのCコード(またはGoの内部C言語サブセット)からアセンブリルーチンにmmapのオフセットを渡す際に、下位32ビットのみが渡されることを明示しています。そして、もしより大きなオフセットが必要な場合(これは32ビットシステムでは通常発生しませんが、概念的な説明として)、アセンブリルーチンが上位ビットをゼロとして提供する必要があることを示唆しています。これは、mmapシステムコールが64ビットオフセットを期待する場合でも、32ビットシステムでは実質的に32ビットオフセットしか扱えないという制約を補足しています。

  2. アセンブリファイルのコメント修正: src/pkg/runtime/sys_freebsd_386.s, src/pkg/runtime/sys_netbsd_386.s, src/pkg/runtime/sys_openbsd_386.s の各ファイルにおいて、mmapシステムコールに渡すオフセットの上位ビットをゼロに設定する部分のコメントが修正されました。 変更前: // top 64 bits of file offset 変更後: // top 32 bits of file offset この修正は、32ビットシステムにおいて、mmapシステムコールに渡されるオフセットが実質的に32ビット幅であり、その上位32ビット(つまり、全体で64ビットオフセットを形成する際の上位部分)がゼロに設定されることをより正確に表現しています。これは、32ビットシステムでは4GBを超えるオフセットは扱えないため、上位ビットは常にゼロになるという事実を反映しています。

これらの変更は、コードの動作を変更するものではなく、Goランタイムが32ビットシステムでmmapのオフセットをどのように扱っているかについてのドキュメンテーションを改善し、コードの意図をより明確にすることを目的としています。これにより、将来のメンテナンスやデバッグが容易になります。

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

src/pkg/runtime/runtime.h

--- a/src/pkg/runtime/runtime.h
+++ b/src/pkg/runtime/runtime.h
@@ -728,6 +728,9 @@ void	runtime·parfordo(ParFor *desc);
 /*
  * low level C-called
  */
+// for mmap, we only pass the lower 32 bits of file offset to the 
+// assembly routine; the higher bits (if required), should be provided
+// by the assembly routine as 0.
 uint8*	runtime·mmap(byte*, uintptr, int32, int32, int32, uint32);
 void	runtime·munmap(byte*, uintptr);
 void	runtime·madvise(byte*, uintptr, int32);

src/pkg/runtime/sys_freebsd_386.s

--- a/src/pkg/runtime/sys_freebsd_386.s
+++ b/src/pkg/runtime/sys_freebsd_386.s
@@ -89,7 +89,7 @@ TEXT runtime·mmap(SB),7,$32
 	MOVSL
 	MOVSL
 	MOVSL
-	MOVL	$0, AX	// top 64 bits of file offset
+	MOVL	$0, AX	// top 32 bits of file offset
 	STOSL
 	MOVL	$477, AX
 	INT	$0x80

src/pkg/runtime/sys_netbsd_386.s

--- a/src/pkg/runtime/sys_netbsd_386.s
+++ b/src/pkg/runtime/sys_netbsd_386.s
@@ -68,7 +68,7 @@ TEXT runtime·mmap(SB),7,$36
 	MOVL	$0, AX
 	STOSL				// arg 6 - pad
 	MOVSL				// arg 7 - offset
-	MOVL	$0, AX			// top 64 bits of file offset
+	MOVL	$0, AX			// top 32 bits of file offset
 	STOSL
 	MOVL	$197, AX		// sys_mmap
 	INT	$0x80

src/pkg/runtime/sys_openbsd_386.s

--- a/src/pkg/runtime/sys_openbsd_386.s
+++ b/src/pkg/runtime/sys_openbsd_386.s
@@ -69,7 +69,7 @@ TEXT runtime·mmap(SB),7,$36
 	MOVL	$0, AX
 	STOSL				// arg 6 - pad
 	MOVSL				// arg 7 - offset
-	MOVL	$0, AX			// top 64 bits of file offset
+	MOVL	$0, AX			// top 32 bits of file offset
 	STOSL
 	MOVL	$197, AX		// sys_mmap
 	INT	$0x80

コアとなるコードの解説

このコミットの主要な変更は、Goランタイムがmmapシステムコールを呼び出す際のアセンブリルーチンにおけるファイルオフセットの扱いに関するコメントの修正と、runtime.hへの補足コメントの追加です。

  1. src/pkg/runtime/runtime.h の変更: runtime·mmap関数のシグネチャは uint8* runtime·mmap(byte*, uintptr, int32, int32, int32, uint32); です。ここで最後の引数 uint32 がファイルオフセットを表します。 追加されたコメント // for mmap, we only pass the lower 32 bits of file offset to the // assembly routine; the higher bits (if required), should be provided // by the assembly routine as 0. は、GoのCコード(またはGoの内部C言語サブセット)からアセンブリルーチンにmmapのオフセットを渡す際に、uint32型のオフセットがそのまま下位32ビットとして渡されることを明確にしています。これは、32ビットシステムではポインタや整数が32ビット幅であるため、自然な挙動です。もしmmapシステムコールが64ビットのオフセットを期待する場合でも、Goのランタイムが提供するオフセットは32ビットに制限されるため、アセンブリルーチン側で上位32ビットをゼロとして埋める必要があることを示唆しています。これは、32ビットシステムでは4GBを超えるファイルオフセットを直接扱うことができないという制約を補足するものです。

  2. アセンブリファイルの変更 (sys_freebsd_386.s, sys_netbsd_386.s, sys_openbsd_386.s): これらのファイルは、それぞれFreeBSD, NetBSD, OpenBSDの32ビット(i386)アーキテクチャ向けのアセンブリコードです。 TEXT runtime·mmap(SB),7,$XX は、Goのruntime·mmap関数に対応するアセンブリルーチンの開始を示しています。 MOVSL 命令は、スタックから値をレジスタに移動させる(またはその逆)操作に関連している可能性があります。 MOVL $0, AX は、AXレジスタに0を移動させる命令です。AXレジスタは、システムコールに引数を渡すため、または戻り値を格納するために使用されることがあります。 変更されたコメント // top 32 bits of file offset は、このMOVL $0, AX命令が、mmapシステムコールに渡されるファイルオフセットの「上位32ビット」をゼロに設定していることを示しています。 元のコメント // top 64 bits of file offset は、おそらく64ビットシステムでのmmapのオフセットの扱いに言及していたか、あるいは単に不正確な記述でした。32ビットシステムでは、mmapのオフセットは実質的に32ビットに制限されるため、64ビットオフセットを形成する際の上位32ビットは常にゼロになります。この修正は、この事実をより正確に反映し、コードの意図を明確にしています。

要するに、このコミットは、32ビットシステムにおけるmmapのファイルオフセットの扱いについて、Goランタイムの既存の挙動をコメントで正確に記述することで、コードの理解を深め、将来の混乱を防ぐためのドキュメンテーション改善です。機能的な変更は一切ありません。

関連リンク

参考にした情報源リンク

  • mmapシステムコールに関するmanページ (例: man 2 mmap)
  • 32ビットおよび64ビットアーキテクチャに関する一般的な情報
  • Go言語のランタイムに関するドキュメントやブログ記事 (Goの内部実装に関するもの)
  • アセンブリ言語(x86/i386)の基本的な知識
  • Goのソースコード内の他のmmap関連の実装(異なるOSやアーキテクチャ向け)