[インデックス 10770] ファイルの概要
このコミットは、Go言語のsyscall
パッケージにおいて、OpenBSDオペレーティングシステム向けのz-files
(自動生成されるシステムコール関連ファイル)を再生成したものです。これにより、OpenBSDのシステムコール番号、エラーコード、およびその他のシステム定数が最新の状態に更新され、GoプログラムがOpenBSD環境で正しく動作するための基盤が強化されました。
コミット
- コミットハッシュ:
7b5ae29afd389ae09bc20f13d0b1a5eb53daa11f
- 作者: Joel Sing jsing@google.com
- コミット日時: 2011年12月14日 水曜日 10:46:49 +1100
- 関連レビュー:
R=golang-dev, bradfitz
,CC=golang-dev
- 関連チェンジリスト:
https://golang.org/cl/5414053
GitHub上でのコミットページへのリンク
https://github.com/golang/go/commit/7b5ae29afd389ae09bc20f13d0b1a5eb53daa11f
元コミット内容
syscall: regenerate z-files for openbsd
R=golang-dev, bradfitz
CC=golang-dev
https://golang.org/cl/5414053
変更の背景
Go言語のsyscall
パッケージは、オペレーティングシステム(OS)の低レベルな機能、特にシステムコールへのアクセスを提供します。OSのバージョンアップやパッチ適用により、システムコール番号、エラーコード、および関連する定数が変更されることがあります。Goのsyscall
パッケージは、これらのOS固有の情報をz-files
と呼ばれる自動生成されたファイル群に依存しています。
このコミットの背景には、OpenBSDのシステム環境の変化に対応する必要がありました。具体的には、OpenBSDのカーネルやユーザーランドのヘッダーファイルに新しい定数やシステムコールが追加された、あるいは既存の定数の定義が変更された可能性があります。Goのsyscall
パッケージがこれらの変更を正確に反映し、OpenBSD上でGoプログラムが安定して動作するためには、これらのz-files
を最新のOSヘッダー情報に基づいて再生成することが不可欠でした。これにより、GoプログラムがOpenBSDの最新のAPIと互換性を持ち、予期せぬエラーや未定義の動作を避けることができます。
前提知識の解説
Go言語の syscall
パッケージ
Go言語の標準ライブラリの一部であるsyscall
パッケージは、Goプログラムから直接OSのシステムコールを呼び出すためのインターフェースを提供します。これにより、ファイル操作、プロセス管理、ネットワーク通信など、OSカーネルが提供する低レベルな機能にアクセスできます。このパッケージは、OSごとに異なるシステムコールの詳細を抽象化し、Goプログラムがクロスプラットフォームで動作できるようにするための重要な役割を担っています。
z-files
とは
Goのsyscall
パッケージにおいて、「z-files
」とは、特定のOSおよびアーキテクチャ(例: openbsd_386
, openbsd_amd64
)に特化したシステムコール番号、エラーコード、およびその他の定数を定義する自動生成されたGoソースファイル群を指します。これらのファイルは、通常、OSのカーネルヘッダーファイル(C言語のヘッダーファイル)を解析する専用のツール(例: mksyscall.go
やmkerrors.go
のようなスクリプト)によって生成されます。
zerrors_*.go
: OS固有のエラーコード(Errno
型)やその他のシステム定数(例: ファイルアクセスフラグ、ソケットオプションなど)を定義します。zsysnum_*.go
: OS固有のシステムコール番号(SYS_
プレフィックスを持つ定数)と、それに対応するC言語の関数シグネチャのコメントを定義します。
これらのファイルは手動で編集されることはなく、OSの変更に合わせて定期的に再生成されることで、Goのsyscall
パッケージが常に最新のOSインターフェースと同期していることを保証します。
OpenBSDのシステムコールとエラーコード
OpenBSDは、セキュリティとコードの品質に重点を置いたUNIX系オペレーティングシステムです。他のUNIX系OSと同様に、アプリケーションとカーネル間のインターフェースとしてシステムコールを提供します。各システムコールには一意の番号が割り当てられており、エラーが発生した場合には特定のエラーコード(errno
)が返されます。Goのsyscall
パッケージは、これらのOpenBSD固有のシステムコール番号とエラーコードをGoの定数としてマッピングすることで、GoプログラムがOpenBSDの機能を直接利用できるようにしています。
386
と amd64
アーキテクチャ
386
: Intel 80386プロセッサおよびその互換プロセッサ(32ビットアーキテクチャ)を指します。amd64
: AMD64(x86-64)プロセッサアーキテクチャを指します。これは、IntelのEM64Tを含む64ビット拡張命令セットを持つプロセッサの総称です。
Goのsyscall
パッケージは、異なるCPUアーキテクチャごとに異なるシステムコール番号やデータ構造を持つ場合があるため、アーキテクチャ固有のz-files
を生成します。
技術的詳細
このコミットは、OpenBSDの386
およびamd64
アーキテクチャ向けのz-files
を再生成することで、Goのsyscall
パッケージがOpenBSDの最新のシステムインターフェースと同期するようにします。
具体的には、以下のファイルが変更されています。
src/pkg/syscall/zerrors_openbsd_386.go
src/pkg/syscall/zerrors_openbsd_amd64.go
src/pkg/syscall/zsysnum_openbsd_386.go
src/pkg/syscall/zsysnum_openbsd_amd64.go
これらのファイルは、OpenBSDのカーネルヘッダーから抽出された情報に基づいて、Goの定数としてシステムコール番号、エラーコード、およびその他のシステム定数を定義しています。再生成プロセスにより、以下のような変更が取り込まれます。
- 新しい定数の追加: OpenBSDの新しいバージョンで導入された、あるいは以前の生成プロセスで見落とされていた新しい定数(例:
ECHO
,F_OK
,LOCK_EX
,RLIMIT_CORE
,RUSAGE_CHILDREN
など)が追加されます。これらは、GoプログラムがOpenBSDの新しい機能やより詳細なシステム情報にアクセスするために必要です。 - 定数の再分類/修正:
zerrors_openbsd_*.go
の差分を見ると、ECHO
,ECHOCTL
,ENDRUNDISC
といった定数がErrno
(エラーコード)のリストから削除され、一般的な定数として追加されています。これは、これらの定数が実際にはエラーコードではなく、端末制御フラグやディスク関連の定数など、別のカテゴリに属するため、より適切な場所に再配置されたことを示唆しています。これにより、Goのsyscall
パッケージの定数定義がより正確になります。 - システムコール番号の更新:
zsysnum_openbsd_*.go
では、既存のシステムコール番号の並び替えや、SYS_FUTIMENS
,SYS___TFORK
,SYS___SET_TCB
,SYS___GET_TCB
といった新しいシステムコールが追加されています。これらの新しいシステムコールは、OpenBSDの新しい機能(例: 高精度なタイムスタンプ設定、スレッド関連の低レベル操作)をGoプログラムから利用可能にします。
この再生成は、Goのsyscall
パッケージがOpenBSD環境で堅牢かつ最新の機能を提供するために不可欠なメンテナンス作業です。
コアとなるコードの変更箇所
このコミットは、主にGoのsyscall
パッケージ内のOpenBSD固有の自動生成ファイルに影響を与えています。具体的な変更は、定数の追加、削除、およびシステムコール番号の更新です。
src/pkg/syscall/zerrors_openbsd_386.go
および src/pkg/syscall/zerrors_openbsd_amd64.go
これらのファイルでは、OpenBSDのエラーコードやその他のシステム定数が定義されています。
追加された主な定数(例):
// zerrors_openbsd_386.go および zerrors_openbsd_amd64.go に追加
const (
// ...
ECHO = 0x8
ECHOCTL = 0x40
ECHOE = 0x2
ECHOK = 0x4
ECHOKE = 0x1
ECHONL = 0x10
ECHOPRT = 0x20
// ...
F_OK = 0x0
// ...
LOCK_EX = 0x2
LOCK_NB = 0x4
LOCK_SH = 0x1
LOCK_UN = 0x8
// ...
RLIMIT_CORE = 0x4
RLIMIT_CPU = 0x0
RLIMIT_DATA = 0x2
RLIMIT_FSIZE = 0x1
RLIMIT_NOFILE = 0x8
RLIMIT_STACK = 0x3
RLIM_INFINITY = 0x7fffffffffffffff
// ...
RUSAGE_CHILDREN = -0x1
RUSAGE_SELF = 0x0
RUSAGE_THREAD = 0x1
// ...
)
Errno
からの削除(再分類)された定数(例):
// zerrors_openbsd_386.go および zerrors_openbsd_amd64.go から削除
const (
// ...
// 以前はErrnoとして定義されていたが、一般的な定数として再定義された
// ECHO = Errno(0x8)
// ECHOCTL = Errno(0x40)
// ECHOE = Errno(0x2)
// ECHOK = Errno(0x4)
// ECHOKE = Errno(0x1)
// ECHONL = Errno(0x10)
// ECHOPRT = Errno(0x20)
// ...
// ENDRUNDISC = Errno(0x9)
// ...
)
src/pkg/syscall/zsysnum_openbsd_386.go
および src/pkg/syscall/zsysnum_openbsd_amd64.go
これらのファイルでは、OpenBSDのシステムコール番号が定義されています。
追加された主なシステムコール(例):
// zsysnum_openbsd_386.go および zsysnum_openbsd_amd64.go に追加
const (
// ...
SYS_FUTIMENS = 327 // { int sys_futimens(int fd, const struct timespec *times); }
SYS___TFORK = 328 // { int sys___tfork(struct __tfork *param); }
SYS___SET_TCB = 329 // { void sys___set_tcb(void *tcb); }
SYS___GET_TCB = 330 // { void *sys___get_tcb(void); }
)
既存のシステムコール定義も、コメントの更新や並び替えが行われています。
コアとなるコードの解説
このコミットによる変更は、Goのsyscall
パッケージがOpenBSDのシステムとより正確かつ完全に連携できるようにするためのものです。
-
定数の追加:
ECHO
,F_OK
,LOCK_EX
,RLIMIT_CORE
,RUSAGE_CHILDREN
などの新しい定数が追加されたことで、GoプログラムはOpenBSDのより多くの機能やシステム情報にアクセスできるようになります。例えば、F_OK
はファイルの存在チェックに、LOCK_EX
は排他ロックに、RLIMIT_CORE
はコアダンプのサイズ制限に、RUSAGE_CHILDREN
は子プロセスのリソース使用量取得にそれぞれ対応します。これにより、Goで書かれたアプリケーションがOpenBSD上でより高度なシステムプログラミングを行えるようになります。 -
定数の再分類:
ECHO
などの定数がErrno
(エラーコード)のリストから削除され、一般的な定数として再定義されたことは重要です。これは、これらの値がシステムコールが返すエラーを示すものではなく、特定の操作(例: 端末の挙動制御)のためのフラグやオプションであることを明確にします。このような修正は、Goのsyscall
パッケージのAPIの正確性を高め、開発者がこれらの定数を誤解して使用するリスクを減らします。 -
システムコール番号の更新:
SYS_FUTIMENS
,SYS___TFORK
,SYS___SET_TCB
,SYS___GET_TCB
といった新しいシステムコールの追加は、OpenBSDの最新のカーネル機能への対応を示しています。SYS_FUTIMENS
: ファイルのアクセス時刻と更新時刻を高精度で設定するためのシステムコールです。SYS___TFORK
,SYS___SET_TCB
,SYS___GET_TCB
: これらは通常、スレッドや軽量プロセス(LWP)の作成、スレッド制御ブロック(TCB)の設定・取得といった、低レベルなスレッド管理に関連するシステムコールです。GoのランタイムがOpenBSD上でより効率的かつ正確に並行処理を管理するために利用される可能性があります。
これらの変更は、Goのsyscall
パッケージがOpenBSDの進化に追従し、Go開発者がOpenBSDプラットフォームの機能を最大限に活用できるような基盤を提供するために不可欠です。自動生成プロセスによってこれらのファイルが最新の状態に保たれることで、Goのクロスプラットフォーム互換性と安定性が維持されます。
関連リンク
- Go言語
syscall
パッケージのドキュメント: https://pkg.go.dev/syscall - OpenBSD 公式サイト: https://www.openbsd.org/
- OpenBSD システムコールマニュアルページ (例:
man 2 intro
でシステムコールの一覧が見られる): https://man.openbsd.org/
参考にした情報源リンク
- Go言語の
syscall
パッケージのソースコード (特にz*
ファイルが生成される仕組み): https://github.com/golang/go/tree/master/src/syscall - Go言語の
mksyscall
ツールに関する情報 (Goのsyscall
パッケージのz-files
生成に使われるツール): https://go.dev/src/cmd/go/internal/mksyscall/ (これは内部ツールであり、直接アクセスは難しい場合がありますが、概念的な理解に役立ちます) - OpenBSDのカーネルソースコード (システムコールや定数の定義元): https://cvsweb.openbsd.org/cgi-bin/cvsweb/src/sys/
- UNIX系OSにおけるシステムコールと
errno
の概念に関する一般的な情報源。