[インデックス 18762] ファイルの概要
このコミットは、src/pkg/syscall/zerrors_netbsd_arm.go
ファイルに36行の追加を行っています。具体的には、NetBSD/ARMアーキテクチャ向けの mmap
および madvise
システムコールに関連する定数を追加しています。
コミット
commit fd4b001a0f0bc0e1f441e1e0a57fab291a98b947
Author: Shenghou Ma <minux.ma@gmail.com>
Date: Wed Mar 5 15:18:36 2014 -0500
syscall: add mmap constants for NetBSD/ARM.
Fixes the syscall test.
LGTM=bradfitz
R=golang-codereviews, bradfitz
CC=golang-codereviews
https://golang.org/cl/71470043
GitHub上でのコミットページへのリンク
https://github.com/golang/go/commit/fd4b001a0f0bc0e1f441e1e0a57fab291a98b947
元コミット内容
syscall: add mmap constants for NetBSD/ARM.
Fixes the syscall test.
LGTM=bradfitz
R=golang-codereviews, bradfitz
CC=golang-codereviews
https://golang.org/cl/71470043
変更の背景
このコミットの主な背景は、Go言語の syscall
パッケージがNetBSD/ARMアーキテクチャ上で mmap
および madvise
システムコールを正しく利用できるようにすることです。コミットメッセージにある「Fixes the syscall test.」という記述から、既存のシステムコール関連のテストがNetBSD/ARM環境で失敗していたことが示唆されます。これは、これらのシステムコールが期待する定数(フラグやオプション)がGoの syscall
パッケージに定義されていなかったためと考えられます。
Go言語はクロスプラットフォーム対応を重視しており、様々なOSやアーキテクチャで動作するように設計されています。そのため、各プラットフォーム固有のシステムコールやその引数となる定数を正確に定義することが不可欠です。このコミットは、NetBSD/ARMという特定の組み合わせにおいて、メモリマッピングに関連する機能がGoプログラムから適切に利用できるようにするための基盤を整備するものです。
前提知識の解説
1. mmap
(memory map) システムコール
mmap
は、Unix系OSで利用されるシステムコールの一つで、ファイルやデバイスをプロセスのアドレス空間にマッピング(割り当て)するために使用されます。これにより、ファイルの内容をメモリ上の配列のように直接アクセスできるようになり、I/O操作を効率化できます。また、匿名メモリ領域(ファイルに関連付けられていないメモリ)を確保するためにも使用されます。
mmap
の主な用途は以下の通りです。
- ファイルマッピングI/O: ファイル全体または一部をメモリにマッピングし、通常のファイルI/O(
read
,write
)ではなく、メモリ操作としてファイルの内容を読み書きする。 - 共有メモリ: 複数のプロセス間でメモリ領域を共有し、高速なプロセス間通信(IPC)を実現する。
- 匿名メモリ: ファイルに関連付けられていないメモリ領域を確保する。これは、ヒープ領域の拡張や、特定のデータ構造のためのメモリ確保に利用される。
mmap
システムコールは、以下のような引数を取ります。
addr
: マッピングを開始するアドレスのヒント。通常はNULL
を指定し、OSに適切なアドレスを選択させる。length
: マッピングするバイト数。prot
: メモリ領域の保護(パーミッション)。読み取り (PROT_READ
)、書き込み (PROT_WRITE
)、実行 (PROT_EXEC
) など。flags
: マッピングの動作を制御するフラグ。MAP_SHARED
(共有マッピング)、MAP_PRIVATE
(プライベートコピーオンライトマッピング)、MAP_ANON
(匿名マッピング)、MAP_FIXED
(指定されたアドレスに厳密にマッピング) など。fd
: マッピングするファイルのファイルディスクリプタ。匿名マッピングの場合は-1
。offset
: ファイル内のマッピング開始オフセット。
2. madvise
(memory advise) システムコール
madvise
は、プロセスが特定のメモリ領域をどのように使用するかのヒントをカーネルに与えるためのシステムコールです。これにより、カーネルはメモリ管理の最適化(ページング、プリフェッチ、キャッシュなど)を行うことができます。madvise
はあくまで「ヒント」であり、カーネルがそのヒントに従うかどうかは保証されません。
madvise
の主なアドバイスタイプ(フラグ)には以下のようなものがあります。
MADV_NORMAL
: 通常のアクセスパターン。MADV_RANDOM
: ランダムなアクセスパターン。MADV_SEQUENTIAL
: 順次アクセスパターン。MADV_WILLNEED
: 近い将来にアクセスされる可能性が高い。MADV_DONTNEED
: 今後アクセスされる可能性が低いので、カーネルはページを解放してもよい。
3. Go言語の syscall
パッケージ
Go言語の syscall
パッケージは、OSのシステムコールをGoプログラムから直接呼び出すための低レベルなインターフェースを提供します。Goの標準ライブラリの多くの部分(ネットワーク、ファイルI/Oなど)は、この syscall
パッケージを介してOSの機能を利用しています。
syscall
パッケージは、OSやアーキテクチャごとに異なるシステムコール番号や定数を扱うために、プラットフォーム固有のファイルを持っています。例えば、zerrors_netbsd_arm.go
のようなファイルは、NetBSD/ARM環境におけるシステムコール関連の定数(エラーコード、フラグなど)を定義しています。これらのファイルは通常、Goのビルドプロセス中に自動生成されることが多いです(zerrors
の z
は "generated" を意味することが多い)。
4. NetBSD/ARM
NetBSDは、オープンソースのUnix系オペレーティングシステムで、非常に多くのハードウェアプラットフォームをサポートしていることで知られています。ARMは、モバイルデバイスや組み込みシステムで広く使用されているプロセッサアーキテクチャです。NetBSD/ARMは、ARMプロセッサ上で動作するNetBSDを指します。
技術的詳細
このコミットは、NetBSD/ARM環境における mmap
および madvise
システムコールが期待する定数を src/pkg/syscall/zerrors_netbsd_arm.go
ファイルに追加しています。これらの定数は、Goプログラムがこれらのシステムコールを呼び出す際に、適切なフラグやオプションを指定するために不可欠です。
具体的に追加された定数は以下のカテゴリに分けられます。
MADV_
定数 (for madvise
)
MADV_DONTNEED
: 指定されたメモリ領域のページをすぐに解放してもよいことをカーネルに示します。これにより、物理メモリが他の用途に再利用される可能性があります。MADV_FREE
:MADV_DONTNEED
と似ていますが、より積極的な解放を示唆する場合があります。MADV_NORMAL
: メモリ領域のアクセスパターンが通常であることを示します。MADV_RANDOM
: メモリ領域へのアクセスがランダムであることを示します。カーネルはプリフェッチを控えるなどの最適化を行う可能性があります。MADV_SEQUENTIAL
: メモリ領域へのアクセスが順次であることを示します。カーネルはプリフェッチを積極的に行うなどの最適化を行う可能性があります。MADV_SPACEAVAIL
: 特定のメモリ領域が利用可能であることを示します。MADV_WILLNEED
: 指定されたメモリ領域のページが近い将来に必要になることをカーネルに示します。これにより、カーネルはページを事前に読み込むなどの最適化を行う可能性があります。
これらの定数は、Goプログラムが madvise
システムコールを呼び出す際に、メモリ使用パターンに関するヒントをOSに提供するために使用されます。これにより、OSはメモリ管理をより効率的に行い、アプリケーションのパフォーマンスを向上させる可能性があります。
MAP_
定数 (for mmap
)
MAP_ALIGNMENT_...
: これらの定数は、mmap
でマッピングされるメモリ領域のアライメント(整列)に関するものです。特定のアーキテクチャや用途において、メモリ領域が特定のバイト境界に整列している必要がある場合に利用されます。例えば、MAP_ALIGNMENT_16MB
は16MB境界へのアライメントを示します。MAP_ALIGNMENT_MASK
: アライメント関連のフラグを抽出するためのマスク。MAP_ALIGNMENT_SHIFT
: アライメント関連のフラグのビットシフト量。
MAP_ANON
: ファイルに関連付けられていない匿名メモリ領域をマッピングすることを示します。通常、fd
引数に-1
を指定して使用されます。MAP_FILE
: ファイルをマッピングすることを示します。これはMAP_ANON
と対比される概念で、通常は値が0
です。MAP_FIXED
:mmap
のaddr
引数で指定されたアドレスに厳密にマッピングすることをカーネルに要求します。指定されたアドレスが利用できない場合、mmap
は失敗します。MAP_HASSEMAPHORE
: マッピングされた領域がセマフォを含むことを示します。MAP_INHERIT
: 子プロセスが親プロセスのメモリマッピングを継承する方法を制御する定数群です。MAP_INHERIT_COPY
: 子プロセスは親のメモリ領域のコピーを受け取る。MAP_INHERIT_DEFAULT
: デフォルトの継承動作。MAP_INHERIT_DONATE_COPY
: コピーオンライトで継承し、親はページを解放できる。MAP_INHERIT_NONE
: 子プロセスはメモリ領域を継承しない。MAP_INHERIT_SHARE
: 子プロセスは親のメモリ領域を共有する。
MAP_NORESERVE
: スワップ領域を予約せずにメモリをマッピングします。これにより、メモリが実際にアクセスされるまで物理メモリが割り当てられない可能性がありますが、メモリ不足時にスワップ領域が不足するリスクがあります。MAP_PRIVATE
: プライベートなコピーオンライトマッピングを作成します。マッピングされた領域への書き込みは、そのプロセス自身のプライベートなコピーにのみ影響し、元のファイルや他のプロセスには影響しません。MAP_RENAME
: マッピングされた領域の名前を変更することを示します。MAP_SHARED
: 共有マッピングを作成します。マッピングされた領域への書き込みは、元のファイルに反映され、同じファイルをマッピングしている他のプロセスからも見えます。MAP_STACK
: マッピングされた領域がスタックとして使用されることを示します。MAP_TRYFIXED
:MAP_FIXED
に似ていますが、指定されたアドレスが利用できない場合でも、mmap
が失敗せずに別の場所を試すことを示唆します。MAP_WIRED
: マッピングされた領域のページを物理メモリに固定(ワイヤード)し、スワップアウトされないようにします。リアルタイムアプリケーションなどで使用されます。
これらの MAP_
定数は、Goプログラムが mmap
システムコールを呼び出す際に、メモリ領域の特性(共有/プライベート、匿名/ファイルベース、保護、アライメントなど)を正確に指定するために使用されます。
PROT_
定数 (for mmap
の prot
引数)
PROT_EXEC
: マッピングされたメモリ領域が実行可能であることを示します。PROT_NONE
: マッピングされたメモリ領域にアクセスできないことを示します。PROT_READ
: マッピングされたメモリ領域が読み取り可能であることを示します。PROT_WRITE
: マッピングされたメモリ領域が書き込み可能であることを示します。
これらの定数は、mmap
で確保されるメモリ領域のアクセス権限(保護)を設定するために使用されます。
これらの定数が zerrors_netbsd_arm.go
に追加されることで、Goの syscall
パッケージはNetBSD/ARM環境で mmap
や madvise
を呼び出す際に、OSが期待する正しい定数値を渡せるようになります。これにより、GoプログラムはNetBSD/ARM上でメモリマッピングやメモリ管理の最適化機能を適切に利用できるようになり、クロスプラットフォーム互換性が向上します。また、コミットメッセージにあるように、これにより syscall
パッケージのテストがNetBSD/ARMでパスするようになったと考えられます。
コアとなるコードの変更箇所
diff --git a/src/pkg/syscall/zerrors_netbsd_arm.go b/src/pkg/syscall/zerrors_netbsd_arm.go
index 9262d5afb7..1a88c0d225 100644
--- a/src/pkg/syscall/zerrors_netbsd_arm.go
+++ b/src/pkg/syscall/zerrors_netbsd_arm.go
@@ -952,6 +952,38 @@ const (
LOCK_NB = 0x4
LOCK_SH = 0x1
LOCK_UN = 0x8
+ MADV_DONTNEED = 0x4
+ MADV_FREE = 0x6
+ MADV_NORMAL = 0x0
+ MADV_RANDOM = 0x1
+ MADV_SEQUENTIAL = 0x2
+ MADV_SPACEAVAIL = 0x5
+ MADV_WILLNEED = 0x3
+ MAP_ALIGNMENT_16MB = 0x18000000
+ MAP_ALIGNMENT_1TB = 0x28000000
+ MAP_ALIGNMENT_256TB = 0x30000000
+ MAP_ALIGNMENT_4GB = 0x20000000
+ MAP_ALIGNMENT_64KB = 0x10000000
+ MAP_ALIGNMENT_64PB = 0x38000000
+ MAP_ALIGNMENT_MASK = -0x1000000
+ MAP_ALIGNMENT_SHIFT = 0x18
+ MAP_ANON = 0x1000
+ MAP_FILE = 0x0
+ MAP_FIXED = 0x10
+ MAP_HASSEMAPHORE = 0x200
+ MAP_INHERIT = 0x80
+ MAP_INHERIT_COPY = 0x1
+ MAP_INHERIT_DEFAULT = 0x1
+ MAP_INHERIT_DONATE_COPY = 0x3
+ MAP_INHERIT_NONE = 0x2
+ MAP_INHERIT_SHARE = 0x0
+ MAP_NORESERVE = 0x40
+ MAP_PRIVATE = 0x2
+ MAP_RENAME = 0x20
+ MAP_SHARED = 0x1
+ MAP_STACK = 0x2000
+ MAP_TRYFIXED = 0x400
+ MAP_WIRED = 0x800
MSG_BCAST = 0x100
MSG_CMSG_CLOEXEC = 0x800
MSG_CONTROLMBUF = 0x2000000
@@ -1029,6 +1061,10 @@ const (
PARMRK = 0x8
PARODD = 0x2000
PENDIN = 0x20000000
+ PROT_EXEC = 0x4
+ PROT_NONE = 0x0
+ PROT_READ = 0x1
+ PROT_WRITE = 0x2
PRI_IOFLUSH = 0x7c
PRIO_PGRP = 0x1
PRIO_PROCESS = 0x0
コアとなるコードの解説
変更は src/pkg/syscall/zerrors_netbsd_arm.go
ファイルの const
ブロック内で行われています。このファイルは、NetBSD/ARMアーキテクチャに特化したシステムコール関連の定数を定義するGoのソースファイルです。
追加された定数は以下の3つのグループに分類されます。
-
MADV_
で始まる定数:MADV_DONTNEED
,MADV_FREE
,MADV_NORMAL
,MADV_RANDOM
,MADV_SEQUENTIAL
,MADV_SPACEAVAIL
,MADV_WILLNEED
- これらは
madvise
システムコールで使用されるフラグであり、メモリ領域のアクセスパターンや使用意図をカーネルに伝えるためのヒントを提供します。例えば、MADV_DONTNEED
は、そのメモリ領域がもう必要ないことを示し、カーネルがそのページを解放してもよいことを示唆します。
-
MAP_
で始まる定数:MAP_ALIGNMENT_16MB
,MAP_ALIGNMENT_1TB
,MAP_ALIGNMENT_256TB
,MAP_ALIGNMENT_4GB
,MAP_ALIGNMENT_64KB
,MAP_ALIGNMENT_64PB
,MAP_ALIGNMENT_MASK
,MAP_ALIGNMENT_SHIFT
- これらは
mmap
システムコールでメモリ領域をマッピングする際のアライメント(整列)に関する定数です。特定のメモリ境界にマッピングする必要がある場合に使用されます。
- これらは
MAP_ANON
,MAP_FILE
,MAP_FIXED
,MAP_HASSEMAPHORE
,MAP_INHERIT
,MAP_INHERIT_COPY
,MAP_INHERIT_DEFAULT
,MAP_INHERIT_DONATE_COPY
,MAP_INHERIT_NONE
,MAP_INHERIT_SHARE
,MAP_NORESERVE
,MAP_PRIVATE
,MAP_RENAME
,MAP_SHARED
,MAP_STACK
,MAP_TRYFIXED
,MAP_WIRED
- これらは
mmap
システムコールで使用される主要なフラグであり、メモリマッピングの動作(共有/プライベート、匿名/ファイルベース、固定アドレスへのマッピングなど)を制御します。例えば、MAP_SHARED
は複数のプロセス間でメモリを共有するために使用され、MAP_PRIVATE
はコピーオンライトのプライベートマッピングを作成します。
- これらは
-
PROT_
で始まる定数:PROT_EXEC
,PROT_NONE
,PROT_READ
,PROT_WRITE
- これらは
mmap
システムコールのprot
引数で使用されるフラグであり、マッピングされたメモリ領域の保護(パーミッション)を設定します。例えば、PROT_READ | PROT_WRITE
は読み書き可能なメモリ領域を示します。
これらの定数が追加されたことで、Goの syscall
パッケージはNetBSD/ARM環境で mmap
および madvise
システムコールを呼び出す際に、OSが期待する正しい定数値を渡せるようになります。これにより、GoプログラムはNetBSD/ARM上でメモリマッピングやメモリ管理の最適化機能を適切に利用できるようになり、クロスプラットフォーム互換性が向上します。また、コミットメッセージにあるように、これにより syscall
パッケージのテストがNetBSD/ARMでパスするようになったと考えられます。
関連リンク
参考にした情報源リンク
mmap
man page (Linux): https://man7.org/linux/man-pages/man2/mmap.2.htmlmadvise
man page (Linux): https://man7.org/linux/man-pages/man2/madvise.2.html- Go
syscall
package documentation: https://pkg.go.dev/syscall - NetBSD documentation (general): https://www.netbsd.org/docs/
- ARM architecture (general information): https://en.wikipedia.org/wiki/ARM_architecture
- Go source code structure (general understanding of
zerrors
files)```
[インデックス 18762] ファイルの概要
このコミットは、src/pkg/syscall/zerrors_netbsd_arm.go
ファイルに36行の追加を行っています。具体的には、NetBSD/ARMアーキテクチャ向けの mmap
および madvise
システムコールに関連する定数を追加しています。
コミット
commit fd4b001a0f0bc0e1f441e1e0a57fab291a98b947
Author: Shenghou Ma <minux.ma@gmail.com>
Date: Wed Mar 5 15:18:36 2014 -0500
syscall: add mmap constants for NetBSD/ARM.
Fixes the syscall test.
LGTM=bradfitz
R=golang-codereviews, bradfitz
CC=golang-codereviews
https://golang.org/cl/71470043
GitHub上でのコミットページへのリンク
https://github.com/golang/go/commit/fd4b001a0f0bc0e1f441e1e0a57fab291a98b947
元コミット内容
syscall: add mmap constants for NetBSD/ARM.
Fixes the syscall test.
LGTM=bradfitz
R=golang-codereviews, bradfitz
CC=golang-codereviews
https://golang.org/cl/71470043
変更の背景
このコミットの主な背景は、Go言語の syscall
パッケージがNetBSD/ARMアーキテクチャ上で mmap
および madvise
システムコールを正しく利用できるようにすることです。コミットメッセージにある「Fixes the syscall test.」という記述から、既存のシステムコール関連のテストがNetBSD/ARM環境で失敗していたことが示唆されます。これは、これらのシステムコールが期待する定数(フラグやオプション)がGoの syscall
パッケージに定義されていなかったためと考えられます。
Go言語はクロスプラットフォーム対応を重視しており、様々なOSやアーキテクチャで動作するように設計されています。そのため、各プラットフォーム固有のシステムコールやその引数となる定数を正確に定義することが不可欠です。このコミットは、NetBSD/ARMという特定の組み合わせにおいて、メモリマッピングに関連する機能がGoプログラムから適切に利用できるようにするための基盤を整備するものです。
前提知識の解説
1. mmap
(memory map) システムコール
mmap
は、Unix系OSで利用されるシステムコールの一つで、ファイルやデバイスをプロセスのアドレス空間にマッピング(割り当て)するために使用されます。これにより、ファイルの内容をメモリ上の配列のように直接アクセスできるようになり、I/O操作を効率化できます。また、匿名メモリ領域(ファイルに関連付けられていないメモリ)を確保するためにも使用されます。
mmap
の主な用途は以下の通りです。
- ファイルマッピングI/O: ファイル全体または一部をメモリにマッピングし、通常のファイルI/O(
read
,write
)ではなく、メモリ操作としてファイルの内容を読み書きする。 - 共有メモリ: 複数のプロセス間でメモリ領域を共有し、高速なプロセス間通信(IPC)を実現する。
- 匿名メモリ: ファイルに関連付けられていないメモリ領域を確保する。これは、ヒープ領域の拡張や、特定のデータ構造のためのメモリ確保に利用される。
mmap
システムコールは、以下のような引数を取ります。
addr
: マッピングを開始するアドレスのヒント。通常はNULL
を指定し、OSに適切なアドレスを選択させる。length
: マッピングするバイト数。prot
: メモリ領域の保護(パーミッション)。読み取り (PROT_READ
)、書き込み (PROT_WRITE
)、実行 (PROT_EXEC
) など。flags
: マッピングの動作を制御するフラグ。MAP_SHARED
(共有マッピング)、MAP_PRIVATE
(プライベートコピーオンライトマッピング)、MAP_ANON
(匿名マッピング)、MAP_FIXED
(指定されたアドレスに厳密にマッピング) など。fd
: マッピングするファイルのファイルディスクリプタ。匿名マッピングの場合は-1
。offset
: ファイル内のマッピング開始オフセット。
2. madvise
(memory advise) システムコール
madvise
は、プロセスが特定のメモリ領域をどのように使用するかのヒントをカーネルに与えるためのシステムコールです。これにより、カーネルはメモリ管理の最適化(ページング、プリフェッチ、キャッシュなど)を行うことができます。madvise
はあくまで「ヒント」であり、カーネルがそのヒントに従うかどうかは保証されません。
madvise
の主なアドバイスタイプ(フラグ)には以下のようなものがあります。
MADV_NORMAL
: 通常のアクセスパターン。MADV_RANDOM
: ランダムなアクセスパターン。MADV_SEQUENTIAL
: 順次アクセスパターン。MADV_WILLNEED
: 近い将来にアクセスされる可能性が高い。MADV_DONTNEED
: 今後アクセスされる可能性が低いので、カーネルはページを解放してもよい。
3. Go言語の syscall
パッケージ
Go言語の syscall
パッケージは、OSのシステムコールをGoプログラムから直接呼び出すための低レベルなインターフェースを提供します。Goの標準ライブラリの多くの部分(ネットワーク、ファイルI/Oなど)は、この syscall
パッケージを介してOSの機能を利用しています。
syscall
パッケージは、OSやアーキテクチャごとに異なるシステムコール番号や定数を扱うために、プラットフォーム固有のファイルを持っています。例えば、zerrors_netbsd_arm.go
のようなファイルは、NetBSD/ARM環境におけるシステムコール関連の定数(エラーコード、フラグなど)を定義しています。これらのファイルは通常、Goのビルドプロセス中に自動生成されることが多いです(zerrors
の z
は "generated" を意味することが多い)。
4. NetBSD/ARM
NetBSDは、オープンソースのUnix系オペレーティングシステムで、非常に多くのハードウェアプラットフォームをサポートしていることで知られています。ARMは、モバイルデバイスや組み込みシステムで広く使用されているプロセッサアーキテクチャです。NetBSD/ARMは、ARMプロセッサ上で動作するNetBSDを指します。
技術的詳細
このコミットは、NetBSD/ARM環境における mmap
および madvise
システムコールが期待する定数を src/pkg/syscall/zerrors_netbsd_arm.go
ファイルに追加しています。これらの定数は、Goプログラムがこれらのシステムコールを呼び出す際に、適切なフラグやオプションを指定するために不可欠です。
具体的に追加された定数は以下のカテゴリに分けられます。
MADV_
定数 (for madvise
)
MADV_DONTNEED
: 指定されたメモリ領域のページをすぐに解放してもよいことをカーネルに示します。これにより、物理メモリが他の用途に再利用される可能性があります。MADV_FREE
:MADV_DONTNEED
と似ていますが、より積極的な解放を示唆する場合があります。MADV_NORMAL
: メモリ領域のアクセスパターンが通常であることを示します。MADV_RANDOM
: メモリ領域へのアクセスがランダムであることを示します。カーネルはプリフェッチを控えるなどの最適化を行う可能性があります。MADV_SEQUENTIAL
: メモリ領域へのアクセスが順次であることを示します。カーネルはプリフェッチを積極的に行うなどの最適化を行う可能性があります。MADV_SPACEAVAIL
: 特定のメモリ領域が利用可能であることを示します。MADV_WILLNEED
: 指定されたメモリ領域のページが近い将来に必要になることをカーネルに示します。これにより、カーネルはページを事前に読み込むなどの最適化を行う可能性があります。
これらの定数は、Goプログラムが madvise
システムコールを呼び出す際に、メモリ使用パターンに関するヒントをOSに提供するために使用されます。これにより、OSはメモリ管理をより効率的に行い、アプリケーションのパフォーマンスを向上させる可能性があります。
MAP_
定数 (for mmap
)
MAP_ALIGNMENT_...
: これらの定数は、mmap
でマッピングされるメモリ領域のアライメント(整列)に関するものです。特定のアーキテクチャや用途において、メモリ領域が特定のバイト境界に整列している必要がある場合に利用されます。例えば、MAP_ALIGNMENT_16MB
は16MB境界へのアライメントを示します。MAP_ALIGNMENT_MASK
: アライメント関連のフラグを抽出するためのマスク。MAP_ALIGNMENT_SHIFT
: アライメント関連のフラグのビットシフト量。
MAP_ANON
: ファイルに関連付けられていない匿名メモリ領域をマッピングすることを示します。通常、fd
引数に-1
を指定して使用されます。MAP_FILE
: ファイルをマッピングすることを示します。これはMAP_ANON
と対比される概念で、通常は値が0
です。MAP_FIXED
:mmap
のaddr
引数で指定されたアドレスに厳密にマッピングすることをカーネルに要求します。指定されたアドレスが利用できない場合、mmap
は失敗します。MAP_HASSEMAPHORE
: マッピングされた領域がセマフォを含むことを示します。MAP_INHERIT
: 子プロセスが親プロセスのメモリマッピングを継承する方法を制御する定数群です。MAP_INHERIT_COPY
: 子プロセスは親のメモリ領域のコピーを受け取る。MAP_INHERIT_DEFAULT
: デフォルトの継承動作。MAP_INHERIT_DONATE_COPY
: コピーオンライトで継承し、親はページを解放できる。MAP_INHERIT_NONE
: 子プロセスはメモリ領域を継承しない。MAP_INHERIT_SHARE
: 子プロセスは親のメモリ領域を共有する。
MAP_NORESERVE
: スワップ領域を予約せずにメモリをマッピングします。これにより、メモリが実際にアクセスされるまで物理メモリが割り当てられない可能性がありますが、メモリ不足時にスワップ領域が不足するリスクがあります。MAP_PRIVATE
: プライベートなコピーオンライトマッピングを作成します。マッピングされた領域への書き込みは、そのプロセス自身のプライベートなコピーにのみ影響し、元のファイルや他のプロセスには影響しません。MAP_RENAME
: マッピングされた領域の名前を変更することを示します。MAP_SHARED
: 共有マッピングを作成します。マッピングされた領域への書き込みは、元のファイルに反映され、同じファイルをマッピングしている他のプロセスからも見えます。MAP_STACK
: マッピングされた領域がスタックとして使用されることを示します。MAP_TRYFIXED
:MAP_FIXED
に似ていますが、指定されたアドレスが利用できない場合でも、mmap
が失敗せずに別の場所を試すことを示唆します。MAP_WIRED
: マッピングされた領域のページを物理メモリに固定(ワイヤード)し、スワップアウトされないようにします。リアルタイムアプリケーションなどで使用されます。
これらの MAP_
定数は、Goプログラムが mmap
システムコールを呼び出す際に、メモリ領域の特性(共有/プライベート、匿名/ファイルベース、保護、アライメントなど)を正確に指定するために使用されます。
PROT_
定数 (for mmap
の prot
引数)
PROT_EXEC
: マッピングされたメモリ領域が実行可能であることを示します。PROT_NONE
: マッピングされたメモリ領域にアクセスできないことを示します。PROT_READ
: マッピングされたメモリ領域が読み取り可能であることを示します。PROT_WRITE
: マッピングされたメモリ領域が書き込み可能であることを示します。
これらの定数は、mmap
で確保されるメモリ領域のアクセス権限(保護)を設定するために使用されます。
これらの定数が zerrors_netbsd_arm.go
に追加されることで、Goの syscall
パッケージはNetBSD/ARM環境で mmap
や madvise
を呼び出す際に、OSが期待する正しい定数値を渡せるようになります。これにより、GoプログラムはNetBSD/ARM上でメモリマッピングやメモリ管理の最適化機能を適切に利用できるようになり、クロスプラットフォーム互換性が向上します。また、コミットメッセージにあるように、これにより syscall
パッケージのテストがNetBSD/ARMでパスするようになったと考えられます。
コアとなるコードの変更箇所
diff --git a/src/pkg/syscall/zerrors_netbsd_arm.go b/src/pkg/syscall/zerrors_netbsd_arm.go
index 9262d5afb7..1a88c0d225 100644
--- a/src/pkg/syscall/zerrors_netbsd_arm.go
+++ b/src/pkg/syscall/zerrors_netbsd_arm.go
@@ -952,6 +952,38 @@ const (
LOCK_NB = 0x4
LOCK_SH = 0x1
LOCK_UN = 0x8
+ MADV_DONTNEED = 0x4
+ MADV_FREE = 0x6
+ MADV_NORMAL = 0x0
+ MADV_RANDOM = 0x1
+ MADV_SEQUENTIAL = 0x2
+ MADV_SPACEAVAIL = 0x5
+ MADV_WILLNEED = 0x3
+ MAP_ALIGNMENT_16MB = 0x18000000
+ MAP_ALIGNMENT_1TB = 0x28000000
+ MAP_ALIGNMENT_256TB = 0x30000000
+ MAP_ALIGNMENT_4GB = 0x20000000
+ MAP_ALIGNMENT_64KB = 0x10000000
+ MAP_ALIGNMENT_64PB = 0x38000000
+ MAP_ALIGNMENT_MASK = -0x1000000
+ MAP_ALIGNMENT_SHIFT = 0x18
+ MAP_ANON = 0x1000
+ MAP_FILE = 0x0
+ MAP_FIXED = 0x10
+ MAP_HASSEMAPHORE = 0x200
+ MAP_INHERIT = 0x80
+ MAP_INHERIT_COPY = 0x1
+ MAP_INHERIT_DEFAULT = 0x1
+ MAP_INHERIT_DONATE_COPY = 0x3
+ MAP_INHERIT_NONE = 0x2
+ MAP_INHERIT_SHARE = 0x0
+ MAP_NORESERVE = 0x40
+ MAP_PRIVATE = 0x2
+ MAP_RENAME = 0x20
+ MAP_SHARED = 0x1
+ MAP_STACK = 0x2000
+ MAP_TRYFIXED = 0x400
+ MAP_WIRED = 0x800
MSG_BCAST = 0x100
MSG_CMSG_CLOEXEC = 0x800
MSG_CONTROLMBUF = 0x2000000
@@ -1029,6 +1061,10 @@ const (
PARMRK = 0x8
PARODD = 0x2000
PENDIN = 0x20000000
+ PROT_EXEC = 0x4
+ PROT_NONE = 0x0
+ PROT_READ = 0x1
+ PROT_WRITE = 0x2
PRI_IOFLUSH = 0x7c
PRIO_PGRP = 0x1
PRIO_PROCESS = 0x0
コアとなるコードの解説
変更は src/pkg/syscall/zerrors_netbsd_arm.go
ファイルの const
ブロック内で行われています。このファイルは、NetBSD/ARMアーキテクチャに特化したシステムコール関連の定数を定義するGoのソースファイルです。
追加された定数は以下の3つのグループに分類されます。
-
MADV_
で始まる定数:MADV_DONTNEED
,MADV_FREE
,MADV_NORMAL
,MADV_RANDOM
,MADV_SEQUENTIAL
,MADV_SPACEAVAIL
,MADV_WILLNEED
- これらは
madvise
システムコールで使用されるフラグであり、メモリ領域のアクセスパターンや使用意図をカーネルに伝えるためのヒントを提供します。例えば、MADV_DONTNEED
は、そのメモリ領域がもう必要ないことを示し、カーネルがそのページを解放してもよいことを示唆します。
-
MAP_
で始まる定数:MAP_ALIGNMENT_16MB
,MAP_ALIGNMENT_1TB
,MAP_ALIGNMENT_256TB
,MAP_ALIGNMENT_4GB
,MAP_ALIGNMENT_64KB
,MAP_ALIGNMENT_64PB
,MAP_ALIGNMENT_MASK
,MAP_ALIGNMENT_SHIFT
- これらは
mmap
システムコールでメモリ領域をマッピングする際のアライメント(整列)に関する定数です。特定のメモリ境界にマッピングする必要がある場合に使用されます。
- これらは
MAP_ANON
,MAP_FILE
,MAP_FIXED
,MAP_HASSEMAPHORE
,MAP_INHERIT
,MAP_INHERIT_COPY
,MAP_INHERIT_DEFAULT
,MAP_INHERIT_DONATE_COPY
,MAP_INHERIT_NONE
,MAP_INHERIT_SHARE
,MAP_NORESERVE
,MAP_PRIVATE
,MAP_RENAME
,MAP_SHARED
,MAP_STACK
,MAP_TRYFIXED
,MAP_WIRED
- これらは
mmap
システムコールで使用される主要なフラグであり、メモリマッピングの動作(共有/プライベート、匿名/ファイルベース、固定アドレスへのマッピングなど)を制御します。例えば、MAP_SHARED
は複数のプロセス間でメモリを共有するために使用され、MAP_PRIVATE
はコピーオンライトのプライベートマッピングを作成します。
- これらは
-
PROT_
で始まる定数:PROT_EXEC
,PROT_NONE
,PROT_READ
,PROT_WRITE
- これらは
mmap
システムコールのprot
引数で使用されるフラグであり、マッピングされたメモリ領域の保護(パーミッション)を設定します。例えば、PROT_READ | PROT_WRITE
は読み書き可能なメモリ領域を示します。
これらの定数が追加されたことで、Goの syscall
パッケージはNetBSD/ARM環境で mmap
および madvise
システムコールを呼び出す際に、OSが期待する正しい定数値を渡せるようになります。これにより、GoプログラムはNetBSD/ARM上でメモリマッピングやメモリ管理の最適化機能を適切に利用できるようになり、クロスプラットフォーム互換性が向上します。また、コミットメッセージにあるように、これにより syscall
パッケージのテストがNetBSD/ARMでパスするようになったと考えられます。
関連リンク
参考にした情報源リンク
mmap
man page (Linux): https://man7.org/linux/man-pages/man2/mmap.2.htmlmadvise
man page (Linux): https://man7.org/linux/man-pages/man2/madvise.2.html- Go
syscall
package documentation: https://pkg.go.dev/syscall - NetBSD documentation (general): https://www.netbsd.org/docs/
- ARM architecture (general information): https://en.wikipedia.org/wiki/ARM_architecture
- Go source code structure (general understanding of
zerrors
files)