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

[インデックス 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のビルドプロセス中に自動生成されることが多いです(zerrorsz は "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: mmapaddr 引数で指定されたアドレスに厳密にマッピングすることをカーネルに要求します。指定されたアドレスが利用できない場合、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 mmapprot 引数)

  • PROT_EXEC: マッピングされたメモリ領域が実行可能であることを示します。
  • PROT_NONE: マッピングされたメモリ領域にアクセスできないことを示します。
  • PROT_READ: マッピングされたメモリ領域が読み取り可能であることを示します。
  • PROT_WRITE: マッピングされたメモリ領域が書き込み可能であることを示します。

これらの定数は、mmap で確保されるメモリ領域のアクセス権限(保護)を設定するために使用されます。

これらの定数が zerrors_netbsd_arm.go に追加されることで、Goの syscall パッケージはNetBSD/ARM環境で mmapmadvise を呼び出す際に、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つのグループに分類されます。

  1. MADV_ で始まる定数:

    • MADV_DONTNEED, MADV_FREE, MADV_NORMAL, MADV_RANDOM, MADV_SEQUENTIAL, MADV_SPACEAVAIL, MADV_WILLNEED
    • これらは madvise システムコールで使用されるフラグであり、メモリ領域のアクセスパターンや使用意図をカーネルに伝えるためのヒントを提供します。例えば、MADV_DONTNEED は、そのメモリ領域がもう必要ないことを示し、カーネルがそのページを解放してもよいことを示唆します。
  2. 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 はコピーオンライトのプライベートマッピングを作成します。
  3. 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でパスするようになったと考えられます。

関連リンク

参考にした情報源リンク

[インデックス 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のビルドプロセス中に自動生成されることが多いです(zerrorsz は "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: mmapaddr 引数で指定されたアドレスに厳密にマッピングすることをカーネルに要求します。指定されたアドレスが利用できない場合、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 mmapprot 引数)

  • PROT_EXEC: マッピングされたメモリ領域が実行可能であることを示します。
  • PROT_NONE: マッピングされたメモリ領域にアクセスできないことを示します。
  • PROT_READ: マッピングされたメモリ領域が読み取り可能であることを示します。
  • PROT_WRITE: マッピングされたメモリ領域が書き込み可能であることを示します。

これらの定数は、mmap で確保されるメモリ領域のアクセス権限(保護)を設定するために使用されます。

これらの定数が zerrors_netbsd_arm.go に追加されることで、Goの syscall パッケージはNetBSD/ARM環境で mmapmadvise を呼び出す際に、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つのグループに分類されます。

  1. MADV_ で始まる定数:

    • MADV_DONTNEED, MADV_FREE, MADV_NORMAL, MADV_RANDOM, MADV_SEQUENTIAL, MADV_SPACEAVAIL, MADV_WILLNEED
    • これらは madvise システムコールで使用されるフラグであり、メモリ領域のアクセスパターンや使用意図をカーネルに伝えるためのヒントを提供します。例えば、MADV_DONTNEED は、そのメモリ領域がもう必要ないことを示し、カーネルがそのページを解放してもよいことを示唆します。
  2. 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 はコピーオンライトのプライベートマッピングを作成します。
  3. 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でパスするようになったと考えられます。

関連リンク

参考にした情報源リンク