[インデックス 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ビット)やレジスタの割り当てなどが重要になります。
このコミットでは、mmap
のoffset
引数が、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つの主要な変更を行っています。
-
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ビットオフセットしか扱えないという制約を補足しています。 -
アセンブリファイルのコメント修正:
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
への補足コメントの追加です。
-
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を超えるファイルオフセットを直接扱うことができないという制約を補足するものです。 -
アセンブリファイルの変更 (
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ランタイムの既存の挙動をコメントで正確に記述することで、コードの理解を深め、将来の混乱を防ぐためのドキュメンテーション改善です。機能的な変更は一切ありません。
関連リンク
- Go言語のソースコードリポジトリ: https://github.com/golang/go
- Goのコードレビューシステム (Gerrit): https://go-review.googlesource.com/
- このコミットのGerritレビューページ: https://golang.org/cl/6499118 (コミットメッセージに記載されているリンク)
参考にした情報源リンク
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ビット)やレジスタの割り当てなどが重要になります。
このコミットでは、mmap
のoffset
引数が、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つの主要な変更を行っています。
-
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ビットオフセットしか扱えないという制約を補足しています。 -
アセンブリファイルのコメント修正:
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
への補足コメントの追加です。
-
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を超えるファイルオフセットを直接扱うことができないという制約を補足するものです。 -
アセンブリファイルの変更 (
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ランタイムの既存の挙動をコメントで正確に記述することで、コードの理解を深め、将来の混乱を防ぐためのドキュメンテーション改善です。機能的な変更は一切ありません。
関連リンク
- Go言語のソースコードリポジトリ: https://github.com/golang/go
- Goのコードレビューシステム (Gerrit): https://go-review.googlesource.com/
- このコミットのGerritレビューページ: https://golang.org/cl/6499118 (コミットメッセージに記載されているリンク)
参考にした情報源リンク
mmap
システムコールに関するmanページ (例:man 2 mmap
)- 32ビットおよび64ビットアーキテクチャに関する一般的な情報
- Go言語のランタイムに関するドキュメントやブログ記事 (Goの内部実装に関するもの)
- アセンブリ言語(x86/i386)の基本的な知識
- Goのソースコード内の他の
mmap
関連の実装(異なるOSやアーキテクチャ向け)