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

[インデックス 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.gomkerrors.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の機能を直接利用できるようにしています。

386amd64 アーキテクチャ

  • 386: Intel 80386プロセッサおよびその互換プロセッサ(32ビットアーキテクチャ)を指します。
  • amd64: AMD64(x86-64)プロセッサアーキテクチャを指します。これは、IntelのEM64Tを含む64ビット拡張命令セットを持つプロセッサの総称です。

Goのsyscallパッケージは、異なるCPUアーキテクチャごとに異なるシステムコール番号やデータ構造を持つ場合があるため、アーキテクチャ固有のz-filesを生成します。

技術的詳細

このコミットは、OpenBSDの386およびamd64アーキテクチャ向けのz-filesを再生成することで、GoのsyscallパッケージがOpenBSDの最新のシステムインターフェースと同期するようにします。

具体的には、以下のファイルが変更されています。

  1. src/pkg/syscall/zerrors_openbsd_386.go
  2. src/pkg/syscall/zerrors_openbsd_amd64.go
  3. src/pkg/syscall/zsysnum_openbsd_386.go
  4. 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のクロスプラットフォーム互換性と安定性が維持されます。

関連リンク

参考にした情報源リンク