[インデックス 14393] ファイルの概要
コミット
commit fc5e64cb8f790c559a6f6c8801a8e1f03aee21a5
Author: Joel Sing <jsing@google.com>
Date: Wed Nov 14 03:19:34 2012 +1100
syscall: regenerate z-files for openbsd/amd64
Regenerate z-files for OpenBSD/amd64 on OpenBSD 5.2.
R=golang-dev, bradfitz, mikioh.mikioh
CC=golang-dev
https://golang.org/cl/6843045
GitHub上でのコミットページへのリンク
https://github.com/golang/go/commit/fc5e64cb8f790c559a6f6c8801a8e1f03aee21a5
元コミット内容
このコミットは、Go言語のsyscall
パッケージにおいて、OpenBSD/amd64アーキテクチャ向けの「z-files」を再生成するものです。具体的には、OpenBSD 5.2のシステムコール、エラーコード、データ構造の定義に合わせて、Go言語のsyscall
パッケージが利用する定数や構造体を更新しています。
変更の背景
Go言語のsyscall
パッケージは、オペレーティングシステム(OS)の低レベルな機能にアクセスするためのインターフェースを提供します。OSのバージョンが上がると、システムコール番号、エラーコード、各種データ構造の定義などが変更されることがあります。Goのsyscall
パッケージがこれらのOS固有の定数や構造体を正しく扱うためには、OSの変更に合わせてこれらの定義を更新する必要があります。
このコミットは、OpenBSD 5.2への対応が背景にあります。OpenBSD 5.2で導入された、あるいは変更されたシステムコール、定数、構造体に対応するため、Goのsyscall
パッケージ内のOpenBSD/amd64向けの定義ファイル(通称「z-files」)を再生成する必要が生じました。これにより、GoプログラムがOpenBSD 5.2上で正しくシステムコールを呼び出し、OSの機能を利用できるようになります。
前提知識の解説
Go言語の syscall
パッケージ
Go言語のsyscall
パッケージは、Goプログラムから直接オペレーティングシステムのシステムコールを呼び出すための低レベルなインターフェースを提供します。これにより、ファイル操作、ネットワーク通信、プロセス管理など、OSカーネルが提供する基本的な機能にアクセスできます。このパッケージは、OSごとに異なるシステムコールの定義や呼び出し規約を抽象化し、Goプログラムが様々なOS上で動作できるようにするための基盤となっています。
z-files (Go言語の syscall
パッケージにおける)
Go言語のsyscall
パッケージでは、各OSおよびアーキテクチャ固有のシステムコール番号、エラーコード、定数、構造体などの定義を自動生成しています。これらの自動生成されたファイルは、慣習的にファイル名の先頭にz
が付くことが多いため、「z-files」と呼ばれます。例えば、zerrors_openbsd_amd64.go
、zsysnum_openbsd_amd64.go
、ztypes_openbsd_amd64.go
などがこれに該当します。これらのファイルは、OSのヘッダーファイル(C言語のヘッダーファイルなど)から情報を抽出し、Goのコードとして変換するツール(例: go tool cgo
やmksyscall.pl
など)によって生成されます。OSのバージョンアップに伴い、これらのヘッダーファイルの内容が変更されると、z-filesも再生成してGoのコードベースに反映させる必要があります。
OpenBSD
OpenBSDは、セキュリティを重視して開発されているUNIX系オペレーティングシステムです。厳格なコードレビューとセキュリティ監査が特徴で、多くのセキュリティ機能が組み込まれています。システムコールやカーネルの内部構造は、他のBSD系OS(FreeBSD, NetBSD)やLinuxとは異なる部分が多く、Goのsyscall
パッケージのような低レベルなOSインターフェースを扱う際には、OpenBSD固有の定義に合わせる必要があります。
AMD64 (x86-64)
AMD64は、64ビットの命令セットアーキテクチャであり、Intelのx86-64と互換性があります。現代のほとんどのデスクトップPCやサーバーで使用されている主流のアーキテクチャです。Goのsyscall
パッケージは、このアーキテクチャ上でのシステムコール呼び出し規約にも対応する必要があります。
技術的詳細
このコミットの主要な目的は、OpenBSD 5.2の変更に合わせてGoのsyscall
パッケージの定義を同期させることです。これは、GoプログラムがOpenBSD 5.2環境で安定して動作するために不可欠なメンテナンス作業です。
具体的には、以下のファイルが更新されています。
-
src/pkg/syscall/zerrors_openbsd_amd64.go
:- このファイルは、OpenBSD/amd64システムにおける各種エラーコードや定数を定義しています。
- 変更点を見ると、
B0
からB9600
までのボーレート関連の定数(シリアル通信速度)、BRKINT
、CLOCAL
、CREAD
などのターミナル制御関連の定数、DLT_C_HDLC
、DLT_PPP_SERIAL
などのデータリンクタイプ、FLUSHO
、HUPCL
、ICANON
などの入出力制御フラグ、IP_IPSECFLOWINFO
などのIP関連定数、MSG_NOSIGNAL
などのメッセージフラグ、NOFLSH
、OCRNL
、ONLCR
などの出力処理フラグ、PARENB
、PARMRK
などのパリティ関連定数、TCIFLUSH
、TCIOFLUSH
などのターミナルI/Oフラッシュ定数、TOSTOP
、VDISCARD
などの仮想端末制御文字が多数追加されています。 - また、
RTF_FMASK
、SCM_CREDS
、SIOCGETVLANPRIO
、SIOCSETVLANPRIO
、SO_JUMBO
などの一部の定数が削除または値が変更されています。これは、OpenBSD 5.2でこれらの定数が廃止されたか、値が変更されたことを示唆しています。
-
src/pkg/syscall/zsysctl_openbsd.go
:- このファイルは、
sysctl
システムコールで使用されるMIB(Management Information Base)エントリを定義しています。sysctl
は、カーネルの様々なパラメータを読み書きするためのインターフェースです。 kern.maxthread
とkern.nthreads
という新しいMIBエントリが追加されています。これは、OpenBSD 5.2でスレッド関連のカーネルパラメータが追加されたことを反映しています。
- このファイルは、
-
src/pkg/syscall/zsysnum_openbsd_amd64.go
:- このファイルは、OpenBSD/amd64システムにおけるシステムコール番号とそれに対応するGoの定数を定義しています。
SYS___TFORK
が新しいシステムコール番号8
として追加され、以前の328
から移動しています。これは、__tfork
システムコールの番号がOpenBSD 5.2で変更されたことを示します。SYS_GETDTABLECOUNT
が新しいシステムコール番号18
として追加されています。LFS_BMAPV
、LFS_MARKV
、LFS_SEGCLEAN
、LFS_SEGWAIT
、SYS_NNPFSPIOCTL
、SYS_RFORK
といったシステムコールが削除されています。これは、これらのシステムコールがOpenBSD 5.2で廃止されたか、別の方法で置き換えられたことを意味します。
-
src/pkg/syscall/ztypes_openbsd_amd64.go
:- このファイルは、OpenBSD/amd64システムにおけるC言語の構造体に対応するGoの構造体定義を含んでいます。
SizeofIfMsghdr
とSizeofIfData
の定数値が変更されています。これは、対応するC言語の構造体のサイズがOpenBSD 5.2で変更されたことを示します。IfData
構造体において、Capabilities
フィールドが追加され、Pad_cgo_0
とPad_cgo_1
のパディングバイトの配置が変更されています。これは、ネットワークインターフェースのデータ構造に新しい機能関連のフィールドが追加されたことを反映しています。
これらの変更は、Goのsyscall
パッケージがOpenBSD 5.2のカーネルインターフェースと完全に互換性を持つようにするために不可欠です。特に、システムコール番号の変更や構造体レイアウトの変更は、GoプログラムがOSの機能を正しく利用するために正確に反映される必要があります。
コアとなるコードの変更箇所
src/pkg/syscall/zerrors_openbsd_amd64.go
: 多数の定数の追加、一部定数の削除/値変更。src/pkg/syscall/zsysctl_openbsd.go
:kern.maxthread
とkern.nthreads
のMIBエントリ追加。src/pkg/syscall/zsysnum_openbsd_amd64.go
:SYS___TFORK
のシステムコール番号変更、SYS_GETDTABLECOUNT
の追加、複数のシステムコールの削除。src/pkg/syscall/ztypes_openbsd_amd64.go
:SizeofIfMsghdr
とSizeofIfData
の定数値変更、IfData
構造体のフィールド追加とパディング変更。
コアとなるコードの解説
src/pkg/syscall/zerrors_openbsd_amd64.go
の変更
このファイルでは、OpenBSD 5.2で新しく導入された、または変更された様々なシステム定数が追加されています。例えば、シリアル通信のボーレート(B0
からB9600
)、ターミナルI/O制御フラグ(BRKINT
, CLOCAL
, CREAD
など)、データリンク層のタイプ(DLT_C_HDLC
, DLT_PPP_SERIAL
)、IP関連のオプション(IP_IPSECFLOWINFO
)、ソケットメッセージフラグ(MSG_NOSIGNAL
)など、多岐にわたる定数が追加されています。これらの定数は、GoプログラムがOpenBSDの低レベルなAPIを正確に利用するために必要です。一部の定数(RTF_FMASK
, SCM_CREDS
など)が削除または変更されているのは、OpenBSD 5.2でこれらの定義が変更されたためです。
src/pkg/syscall/zsysctl_openbsd.go
の変更
sysctlMib
配列にkern.maxthread
とkern.nthreads
が追加されました。これは、OpenBSD 5.2でカーネルのスレッド管理に関する新しい情報がsysctl
を通じて取得可能になったことを示しています。Goプログラムがこれらの情報を取得できるようになります。
src/pkg/syscall/zsysnum_openbsd_amd64.go
の変更
最も重要な変更は、SYS___TFORK
のシステムコール番号が328
から8
に変更されたことです。これは、OpenBSD 5.2でこのシステムコールの番号が再割り当てされたことを意味します。また、SYS_GETDTABLECOUNT
という新しいシステムコールが追加されました。一方で、LFS_BMAPV
などのLFS(Log-structured File System)関連のシステムコールや、SYS_NNPFSPIOCTL
、SYS_RFORK
といったシステムコールが削除されています。これは、OpenBSD 5.2でこれらの機能が廃止されたか、別のシステムコールに統合されたことを示唆しています。Goプログラムは、これらの変更に合わせてシステムコールを呼び出す必要があります。
src/pkg/syscall/ztypes_openbsd_amd64.go
の変更
SizeofIfMsghdr
とSizeofIfData
の定数値がそれぞれ0xf0
から0xf8
、0xd8
から0xe0
に増加しています。これは、対応するC言語の構造体if_msghdr
とif_data
のサイズがOpenBSD 5.2で大きくなったことを示します。
特にIfData
構造体では、Capabilities uint32
フィールドが追加されています。これは、ネットワークインターフェースの機能に関する情報がこの構造体に含まれるようになったことを意味します。また、Goの構造体とCの構造体のアライメントを合わせるためのパディングバイト(Pad_cgo_0
, Pad_cgo_1
)の配置も調整されています。これらの変更は、Goプログラムがネットワークインターフェースの状態や情報を正しく取得・設定するために不可欠です。
これらの変更は、Goのsyscall
パッケージがOpenBSD 5.2のカーネルインターフェースと完全に同期し、GoプログラムがOpenBSD環境で最新の機能と安定性を享受できるようにするためのものです。
関連リンク
- Go Code Review: https://golang.org/cl/6843045
参考にした情報源リンク
- Go言語
syscall
パッケージのドキュメント (Go公式ドキュメント): https://pkg.go.dev/syscall - OpenBSD 公式サイト: https://www.openbsd.org/
- OpenBSD 5.2 リリース情報 (Web検索で関連情報を参照)
- Go言語の
syscall
パッケージにおけるz-filesの生成プロセスに関する情報 (Goのソースコードや関連する開発者ブログ、メーリングリストの議論など) - C言語の
sys/socket.h
,sys/ioctl.h
,sys/termios.h
,net/if.h
などのOpenBSDヘッダーファイルの内容 (OpenBSDのソースコードリポジトリやmanページなど) - Go言語の
syscall
パッケージの歴史とメンテナンスに関する議論 (Go開発者メーリングリストのアーカイブなど) - Go言語のクロスプラットフォーム対応に関する一般的な情報 (Go公式ブログや技術記事など)