[インデックス 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公式ブログや技術記事など)