[インデックス 15684] ファイルの概要
このコミットは、Go言語のsyscall
パッケージにおいて、FreeBSDオペレーティングシステム向けの新しいシステムコール定数を大量に追加するものです。具体的には、api/next.txt
ファイルが更新され、FreeBSDの386アーキテクチャとamd64アーキテクチャの両方に対応する多数の定数が追加されています。これにより、GoプログラムがFreeBSDシステム上でより多くの低レベルなシステム機能にアクセスできるようになります。
コミット
commit 5c667f366a59f05141969cc4f50744b96fd8d2ad
Author: Brad Fitzpatrick <bradfitz@golang.org>
Date: Mon Mar 11 11:04:34 2013 -0700
api: update next.txt
Ton of FreeBSD syscall constants.
R=golang-dev, minux.ma
CC=golang-dev
https://golang.org/cl/7476046
GitHub上でのコミットページへのリンク
https://github.com/golang/go/commit/5c667f366a59f05141969cc4f50744b96fd8d2ad
元コミット内容
api: update next.txt
Ton of FreeBSD syscall constants.
このコミットは、api/next.txt
ファイルを更新し、FreeBSDのシステムコール定数を大量に追加したことを示しています。
変更の背景
Go言語は、クロスプラットフォーム対応を重視しており、様々なオペレーティングシステム(OS)上で動作するように設計されています。syscall
パッケージは、GoプログラムがOSの低レベルな機能(システムコール)にアクセスするためのインターフェースを提供します。新しいOSのバージョンがリリースされたり、既存のOSで新しい機能が追加されたりすると、Goのsyscall
パッケージもそれらの変更に対応するために更新される必要があります。
このコミットの背景には、FreeBSDオペレーティングシステムにおけるシステムコール定数の追加または更新があったと考えられます。Goの標準ライブラリがFreeBSDの最新の機能やAPIをサポートするためには、これらの定数をsyscall
パッケージに組み込む必要がありました。api/next.txt
は、Goの次期リリースで公開されるAPIの変更を追跡するためのファイルであり、このファイルに定数を追加することで、GoのAPIレビュープロセスを経て正式にGoのAPIとして公開される準備が整います。
前提知識の解説
システムコール (System Call)
システムコールは、オペレーティングシステムが提供するサービスをユーザープログラムが利用するためのインターフェースです。ファイル操作(読み書き)、メモリ管理、プロセス管理、ネットワーク通信など、OSが管理するリソースにアクセスする際には、直接ハードウェアを操作するのではなく、システムコールを介してOSに処理を依頼します。これにより、システムの安定性とセキュリティが保たれます。
Go言語の syscall
パッケージ
Go言語の標準ライブラリには、syscall
というパッケージがあります。このパッケージは、GoプログラムからOS固有のシステムコールを呼び出すための低レベルなプリミティブを提供します。OSによってシステムコールの種類や引数が異なるため、syscall
パッケージは各OS(Linux, Windows, macOS, FreeBSDなど)およびアーキテクチャ(amd64, 386, armなど)ごとに異なる実装を持っています。
api/next.txt
ファイル
Goプロジェクトでは、次期リリースで公開される予定のAPI変更を追跡するために、api/next.txt
というファイルを使用します。このファイルには、新しい関数、型、定数などが追加される際に、そのシグネチャや定義が記述されます。GoのAPIレビュープロセスでは、このファイルの内容がレビューされ、GoのAPI設計ガイドラインに沿っているか、後方互換性があるかなどが確認されます。このファイルに記載された内容は、最終的にGoの公式APIドキュメントに反映されます。
FreeBSD
FreeBSDは、UNIX系のオープンソースオペレーティングシステムです。高性能で安定性が高く、サーバー用途や組み込みシステムなどで広く利用されています。Go言語はFreeBSDを公式にサポートしており、GoプログラムをFreeBSD環境でコンパイル・実行することができます。
定数 (Constants)
プログラミングにおいて定数とは、プログラムの実行中に値が変化しない固定された値のことです。システムコールにおいては、特定の操作やオプションを表すために数値が割り当てられており、これらが定数として定義されます。例えば、ファイルの読み込みモードを表す定数や、ネットワークプロトコルを表す定数などがあります。
技術的詳細
このコミットは、api/next.txt
ファイルに大量の行を追加しています。追加された行のフォーマットは以下の通りです。
pkg syscall (freebsd-386), const CONSTANT_NAME ideal-int
pkg syscall (freebsd-amd64), const CONSTANT_NAME ideal-int
これは、syscall
パッケージにおいて、FreeBSDの386およびamd64アーキテクチャ向けに、CONSTANT_NAME
という名前の定数がideal-int
型で追加されたことを示しています。
ideal-int
はGoの内部的な型であり、コンパイル時に適切な整数型(int
, int32
, int64
など)に解決されます。これは、異なるアーキテクチャやOS間で定数のサイズが異なる場合でも、Goの型システムが適切に処理できるようにするためのものです。
追加された定数の多くは、FreeBSDのシステムプログラミングに関連するものです。例えば、以下のようなカテゴリの定数が含まれています。
- ターミナル制御 (Termios):
B0
,B110
,B115200
などのボーレート定数や、BRKINT
,CFLUSH
,CLOCAL
,CREAD
などのターミナルモードフラグ。これらはシリアルポートやターミナルの設定を制御するために使用されます。 - BPF (Berkeley Packet Filter):
BPF_T_BINTIME
,BPF_T_MICROTIME
,BPF_T_NANOTIME
などのタイムスタンプ形式や、BPF_T_FLAG_MASK
,BPF_T_FORMAT_MASK
などのフラグ。これらはネットワークパケットキャプチャやフィルタリングに関連します。 - データリンクタイプ (DLT):
DLT_AOS
,DLT_CAN_SOCKETCAN
,DLT_DBUS
など、様々なネットワークデータリンク層のタイプを表す定数。これらはlibpcap
などのライブラリでパケットの形式を識別するために使用されます。 - メモリ管理 (madvise, mmap):
MADV_AUTOSYNC
,MADV_CORE
,MADV_DONTNEED
などのmadvise
システムコールで使用されるアドバイス定数や、MAP_ANON
,MAP_ANONYMOUS
,MAP_PRIVATE
,MAP_SHARED
などのmmap
システムコールで使用されるマッピングフラグ。これらはメモリ領域の振る舞いをOSに伝えるために使用されます。 - プロテクションフラグ (PROT):
PROT_EXEC
,PROT_NONE
,PROT_READ
,PROT_WRITE
など、メモリ領域のアクセス権限を表す定数。これらはmmap
やmprotect
システムコールで使用されます。 - ソケットオプション (SO_PROTOCOL, SO_PROTOTYPE): ソケットの振る舞いを制御するためのオプション。
- システムコール番号 (SYS_):
SYS_CLOCK_GETCPUCLOCKID2
,SYS_WAIT6
など、特定のシステムコールを表す番号。
これらの定数がGoのsyscall
パッケージに追加されることで、Go開発者はFreeBSD上で動作するアプリケーションにおいて、より細かくOSの機能を利用できるようになります。例えば、ネットワークデバイスの低レベルな制御、カスタムなメモリ管理戦略の実装、特定のシステムコールを直接呼び出すなどの高度な操作が可能になります。
コアとなるコードの変更箇所
このコミットにおけるコアとなるコードの変更箇所は、api/next.txt
ファイルへの追加です。
--- a/api/next.txt
+++ b/api/next.txt
@@ -1041,9 +1041,206 @@ pkg syscall (darwin-amd64-cgo), type Termios struct, Lflag uint64
pkg syscall (darwin-amd64-cgo), type Termios struct, Oflag uint64
pkg syscall (darwin-amd64-cgo), type Termios struct, Ospeed uint64
pkg syscall (darwin-amd64-cgo), type Termios struct, Pad_cgo_0 [4]uint8
+pkg syscall (freebsd-386), const B0 ideal-int
+pkg syscall (freebsd-386), const B110 ideal-int
+... (大量のFreeBSD 386定数) ...
+pkg syscall (freebsd-386), const VWERASE ideal-int
pkg syscall (freebsd-386), func SlicePtrFromStrings([]string) ([]*uint8, error)\n pkg syscall (freebsd-386), type IfAnnounceMsghdr struct\n pkg syscall (freebsd-386), type IfAnnounceMsghdr struct, Index uint16
@@ -1054,9 +1251,206 @@ pkg syscall (freebsd-386), type IfAnnounceMsghdr struct, Version uint8
pkg syscall (freebsd-386), type IfAnnounceMsghdr struct, What uint16
pkg syscall (freebsd-386), type InterfaceAnnounceMessage struct
pkg syscall (freebsd-386), type InterfaceAnnounceMessage struct, Header IfAnnounceMsghdr
+pkg syscall (freebsd-amd64), const B0 ideal-int
+pkg syscall (freebsd-amd64), const B110 ideal-int
+... (大量のFreeBSD AMD64定数) ...
+pkg syscall (freebsd-amd64), const VWERASE ideal-int
pkg syscall (freebsd-amd64), func SlicePtrFromStrings([]string) ([]*uint8, error)\n pkg syscall (freebsd-amd64), func Syscall9(uintptr, uintptr, uintptr, uintptr, uintptr, uintptr, uintptr, uintptr, uintptr, uintptr) (uintptr, uintptr, Errno)\n pkg syscall (freebsd-amd64), type IfAnnounceMsghdr struct
この差分は、api/next.txt
ファイルに394行が追加されたことを示しています。これらの行は、FreeBSDの386およびamd64アーキテクチャ向けのsyscall
パッケージに新しい定数が追加されたことを記録しています。
コアとなるコードの解説
api/next.txt
ファイルは、GoのAPI変更を追跡するためのメタデータファイルであり、実際のGoのソースコードではありません。しかし、このファイルへの変更は、Goのsyscall
パッケージのFreeBSD固有の実装(例: src/syscall/zsysnum_freebsd_386.go
, src/syscall/zsysnum_freebsd_amd64.go
など、または関連する定数定義ファイル)に、これらの定数が追加されることを意味します。
Goのビルドシステムは、api/next.txt
の内容を基に、APIの互換性チェックや、場合によっては自動生成されるコードの更新を行います。このコミットによって追加された定数は、FreeBSDのシステムヘッダーファイル(例: /usr/include/sys/termios.h
, /usr/include/net/bpf.h
など)で定義されているC言語の定数に対応しています。Goのsyscall
パッケージは、これらのC言語の定数をGoの定数としてエクスポートすることで、Goプログラムから利用できるようにします。
例えば、FreeBSDのC言語ヘッダーで#define B0 0
のような定義がある場合、Goのsyscall
パッケージはこれに対応するsyscall.B0
という定数を提供します。このコミットは、このような対応付けを大量に追加したことを示しており、GoがFreeBSDのより広範なシステムコールインターフェースをサポートするようになったことを意味します。
関連リンク
- Go言語の
syscall
パッケージのドキュメント: https://pkg.go.dev/syscall - Go言語のAPIレビュープロセスに関する情報 (Go Wiki): https://go.dev/wiki/API
- FreeBSDの公式ウェブサイト: https://www.freebsd.org/
参考にした情報源リンク
- https://github.com/golang/go/commit/5c667f366a59f05141969cc4f50744b96fd8d2ad
- https://golang.org/cl/7476046 (GoのGerritコードレビューシステムへのリンク)
- Go言語の
syscall
パッケージのソースコード (GitHub): https://github.com/golang/go/tree/master/src/syscall - FreeBSDのシステムコールに関するドキュメント (manページなど) - 一般的な情報源として参照。
- Go言語のAPI設計ガイドライン - 一般的な情報源として参照。