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

[インデックス 13062] ファイルの概要

このコミットは、Go言語のsyscallパッケージにおけるNetBSD向けのシステムコール関連ファイルの更新と修正に焦点を当てています。具体的には、mkerrors.shスクリプトのNetBSD対応、types_netbsd.goからのディレクトリモードビットの削除、そしてcgoの動作改善に伴うz*ファイルの再生成が行われています。これにより、NetBSD環境でのGoプログラムがより正確にシステムコールを利用できるようになります。

コミット

commit 2a47e0444c4d75ee28f1f60ed41aa274be56dda9
Author: Joel Sing <jsing@google.com>
Date:   Mon May 14 10:40:13 2012 -0700

    syscall: regenerate z* files for netbsd
    
    Fix mkerrors.sh so that it works on NetBSD.
    
    Remove directory mode bits from types - this already appears in errors.
    
    Regenerate the z* files now that cgo is working.
    
    R=golang-dev, m4dh4tt3r, r
    CC=golang-dev
    https://golang.org/cl/6201077

GitHub上でのコミットページへのリンク

https://github.com/golang/go/commit/2a47e0444c4d75ee28f1f60ed41aa274be56dda9

元コミット内容

syscall: regenerate z* files for netbsd

Fix mkerrors.sh so that it works on NetBSD.

Remove directory mode bits from types - this already appears in errors.

Regenerate the z* files now that cgo is working.

変更の背景

このコミットの主な背景は、Go言語のsyscallパッケージがNetBSDオペレーティングシステム上で正しく機能するための改善です。特に以下の点が挙げられます。

  1. mkerrors.shのNetBSD対応: mkerrors.shは、Goのsyscallパッケージで使用されるエラーコードや定数をCヘッダーファイルから自動生成するためのスクリプトです。NetBSD環境でこのスクリプトが正しく動作しない問題があったため、その修正が必要でした。
  2. 冗長な定義の排除: types_netbsd.goファイルに定義されていたディレクトリモードビット(S_IFMT, S_IFIFOなど)が、既にエラー関連の定義に含まれていたため、冗長性を排除するために削除されました。これにより、コードの重複が解消され、保守性が向上します。
  3. cgoの動作改善: cgoはGoとC言語の相互運用を可能にするツールです。cgoの動作が改善されたことで、NetBSD固有のシステムコール定数や構造体を定義するz*ファイルを正確に再生成できる環境が整いました。これらのファイルは、GoプログラムがNetBSDの低レベルなOS機能にアクセスするために不可欠です。

これらの変更は、GoがNetBSD環境でより堅牢かつ正確に動作するための基盤を強化することを目的としています。

前提知識の解説

このコミットを理解するためには、以下の技術的背景知識が役立ちます。

  • Go言語のsyscallパッケージ:
    • Go言語のsyscallパッケージは、オペレーティングシステムの低レベルなプリミティブ(システムコール)へのアクセスを提供します。ファイル操作、ネットワーク通信、プロセス管理など、OSが提供する基本的な機能に直接アクセスするために使用されます。
    • OSごとにシステムコールのインターフェースや定数が異なるため、syscallパッケージは各OSおよびアーキテクチャ(例: Linux/amd64, NetBSD/386)に特化した実装を持っています。
  • システムコール:
    • アプリケーションがオペレーティングシステムのカーネルが提供するサービスを要求するためのインターフェースです。例えば、ファイルの読み書き、メモリの割り当て、プロセスの生成などがシステムコールを通じて行われます。
  • mkerrors.sh:
    • Goのsyscallパッケージ内で使用されるシェルスクリプトの一つです。このスクリプトは、C言語のヘッダーファイル(例: /usr/include/errno.h, /usr/include/signal.h)から、OS固有のエラーコード(EPERM, ENOENTなど)やシグナル番号(SIGINT, SIGTERMなど)を抽出し、Goのソースコード(zerrors_*.goファイル)として自動生成します。これにより、GoプログラムがOSのエラーやシグナルを正しく解釈できるようになります。
  • z*ファイル (zerrors_*.go, ztypes_*.go):
    • Goのsyscallパッケージには、zerrors_GOOS_GOARCH.goztypes_GOOS_GOARCH.goといった命名規則のファイルが存在します。これらのファイルは、mkerrors.shcgo -godefsといったツールによって自動生成されるGoのソースファイルです。
    • zerrors_*.goファイルは、OS固有のエラー定数やシグナル定数を定義します。
    • ztypes_*.goファイルは、OS固有のC言語の構造体(例: struct stat, struct timeval)に対応するGoの型定義を生成します。これらは、システムコールが返すデータや引数として使用される構造体のレイアウトをGoに認識させるために重要です。
    • zプレフィックスは、これらのファイルが自動生成されたものであり、手動で編集すべきではないことを示唆しています。
  • cgo:
    • Go言語にC言語のコードを埋め込み、GoとCの間で関数呼び出しやデータ構造の共有を可能にするツールです。cgo -godefsコマンドは、CのヘッダーファイルからGoの型定義を自動生成するために特に使用されます。これにより、Cの構造体や定数の正確なメモリレイアウトをGo側で再現し、システムコールとの互換性を確保します。
  • NetBSD:
    • オープンソースのUnix系オペレーティングシステムの一つで、高い移植性を特徴としています。様々なハードウェアアーキテクチャで動作します。Go言語は、このような多様なOS環境をサポートするために、各プラットフォーム固有のシステムコールインターフェースに対応する必要があります。

技術的詳細

このコミットは、GoのsyscallパッケージがNetBSD環境でより正確に機能するための複数の技術的側面を扱っています。

  1. mkerrors.shのNetBSD対応:

    • mkerrors.shスクリプトは、CヘッダーファイルからGoの定数を生成する際に、特定のOS環境に依存する場合があります。このコミットでは、NetBSD環境でスクリプトが正しく動作しない問題が修正されました。
    • 具体的には、src/pkg/syscall/mkerrors.shconst int schedppq = 1;という行が追加されています。これは、NetBSDの<sys/param.h>ヘッダーファイルがschedppqという定数を参照しているため、mkerrors.shがCコードをコンパイルする際にこの定義が必要となるためです。この修正により、スクリプトがNetBSD上でエラーなく実行され、zerrors_netbsd_*.goファイルが正しく生成されるようになります。
  2. ディレクトリモードビットの削除:

    • src/pkg/syscall/types_netbsd.goから、S_IFMT, S_IFIFO, S_IFCHR, S_IFDIR, S_IFBLK, S_IFREG, S_IFLNK, S_IFSOCK, S_ISUID, S_ISGID, S_ISVTX, S_IRUSR, S_IWUSR, S_IXUSRといったディレクトリモードビットの定数定義が削除されました。
    • コミットメッセージにある「this already appears in errors」という記述は、これらの定数が既にzerrors_netbsd_*.goファイル(mkerrors.shによって生成されるファイル)内で定義されていることを示唆しています。
    • Goのsyscallパッケージでは、OS固有の定数を一元的に管理するために、自動生成されるzerrors_*.goファイルに集約する方針が取られています。types_netbsd.goに手動でこれらの定数を定義することは冗長であり、将来的なOSの変更に対応する際に二重管理の手間や不整合のリスクを生じさせます。この削除により、コードの重複が解消され、定義の信頼性が向上します。
  3. z*ファイルの再生成:

    • cgoの動作が改善されたことにより、NetBSD向けのzerrors_netbsd_386.go, zerrors_netbsd_amd64.go, ztypes_netbsd_386.go, ztypes_netbsd_amd64.goファイルが再生成されました。
    • これらのファイルは、NetBSDのシステムコールで使用される定数やデータ構造の正確な定義を含んでいます。OSのバージョンアップやCヘッダーファイルの変更に伴い、これらの定数値や構造体レイアウトが変更されることがあります。cgoが正しく機能することで、Goのsyscallパッケージは常に最新かつ正確なOSインターフェースに適合できるようになります。
    • 再生成されたファイルでは、既存の定数値の更新(例: AF_BLUETOOTH, AF_MAX, DLT_ENCなどの値の変更)、新しい定数の追加(例: ARPHRD_ARCNET, B0からB9600までのボーレート定数、多数のDLT_定数、ECHO関連の定数、RLIMIT_関連の定数など)、および一部の定数の削除(例: ETHERTYPE_AOE, ETHERTYPE_LLDPなど)が行われています。これは、NetBSDのシステムヘッダーファイルの内容が更新されたことを反映しています。
    • 特に、zerrors_netbsd_386.gozerrors_netbsd_amd64.goでは、AF_ (Address Family), DLT_ (Data Link Type), IFT_ (Interface Type), IPPROTO_ (IP Protocol), IPV6_, IP_, MSG_, SIOC (Socket IO Control) などの多数の定数値が更新または追加されており、NetBSDのネットワークおよびシステムインターフェースの進化に対応しています。
    • ztypes_netbsd_386.goztypes_netbsd_amd64.goでは、Timespec, Timeval, Rusage, Stat_tなどの基本的なシステム構造体の定義が更新されています。これらの構造体は、ファイルシステム情報、時間、リソース使用量などをシステムコールを通じて取得する際に使用されます。

これらの変更は、GoのsyscallパッケージがNetBSDの最新のシステムインターフェースと完全に同期し、GoプログラムがNetBSD上で安定して動作するための重要なステップです。

コアとなるコードの変更箇所

このコミットで変更された主要なファイルと、その変更の概要は以下の通りです。

  1. src/pkg/syscall/mkerrors.sh:

    • NetBSD向けのインクルードセクション(includes_NetBSD)に、const int schedppq = 1;という行が追加されました。これは、NetBSDのシステムヘッダーが参照するschedppq定数を定義し、スクリプトがNetBSD上で正しくコンパイル・実行されるようにするための修正です。
  2. src/pkg/syscall/types_netbsd.go:

    • constブロック内に定義されていたディレクトリモードビット(S_IFMT, S_IFIFO, S_IFCHR, S_IFDIR, S_IFBLK, S_IFREG, S_IFLNK, S_IFSOCK, S_ISUID, S_ISGID, S_ISVTX, S_IRUSR, S_IWUSR, S_IXUSR)の定義がすべて削除されました。これらの定数は、自動生成されるzerrors_netbsd_*.goファイルに既に存在するため、冗長な定義が排除されました。
  3. src/pkg/syscall/zerrors_netbsd_386.go および src/pkg/syscall/zerrors_netbsd_amd64.go:

    • これらのファイルは自動生成されたものであり、NetBSDの32ビット(386)および64ビット(amd64)アーキテクチャ向けのエラーコードおよびその他のシステム定数を含んでいます。
    • 多数の定数値が更新(例: AF_BLUETOOTHの値が0x20から0x1fに変更)されました。
    • 新しい定数(例: AF_ARP, AF_IEEE80211, B0からB921600までのボーレート定数、多数のDLT_定数、ECHO関連定数、RLIMIT_関連定数など)が追加されました。
    • 一部の定数(例: ETHERTYPE_AOE, ETHERTYPE_LLDPなど)が削除されました。
    • errors変数内のエラーメッセージの文字列も一部更新されています(例: 34: "result too large""result too large or too small"に)。
  4. src/pkg/syscall/ztypes_netbsd_386.go および src/pkg/syscall/ztypes_netbsd_amd64.go:

    • これらのファイルも自動生成されたものであり、NetBSDの32ビットおよび64ビットアーキテクチャ向けのC言語の構造体に対応するGoの型定義を含んでいます。
    • Timespec, Timeval, Rusage, Stat_tなどの構造体定義が更新されました。これは、NetBSDのシステムヘッダーにおけるこれらの構造体のレイアウト変更を反映したものです。

これらの変更は、GoのsyscallパッケージがNetBSDの最新のシステムインターフェースと同期し、GoプログラムがNetBSD上で安定して動作するための重要なステップです。

コアとなるコードの解説

このコミットの核となる変更は、GoのsyscallパッケージがNetBSDのシステムコールインターフェースと正確に同期するための自動生成メカニズムの改善と、冗長な定義の排除です。

mkerrors.shの修正 (src/pkg/syscall/mkerrors.sh)

--- a/src/pkg/syscall/mkerrors.sh
+++ b/src/pkg/syscall/mkerrors.sh
@@ -104,6 +104,9 @@ includes_NetBSD='\
 #include <netinet/ip.h>\
 #include <netinet/ip_mroute.h>\
 #include <netinet/if_ether.h>\
+\
+// Needed since <sys/param.h> refers to it...
+const int schedppq = 1;\
 '
 
 includes_OpenBSD='\

この変更は、mkerrors.shスクリプトがNetBSD環境で実行される際に発生するコンパイルエラーを解決するためのものです。NetBSDの<sys/param.h>ヘッダーファイルは、schedppqという定数を参照していますが、この定数が定義されていない環境でmkerrors.shがCコードをコンパイルしようとするとエラーになります。

const int schedppq = 1;という行をincludes_NetBSDセクションに追加することで、mkerrors.shが生成するCソースコードにこの定義が含められ、コンパイルが成功するようになります。これにより、NetBSD固有のエラーコードや定数をGoのzerrors_netbsd_*.goファイルに正確に自動生成できるようになります。

types_netbsd.goからのディレクトリモードビットの削除 (src/pkg/syscall/types_netbsd.go)

--- a/src/pkg/syscall/types_netbsd.go
+++ b/src/pkg/syscall/types_netbsd.go
@@ -97,23 +97,6 @@ type _Gid_t C.gid_t
 
 // Files
 
-const ( // Directory mode bits
-	S_IFMT   = C.S_IFMT
-	S_IFIFO  = C.S_IFIFO
-	S_IFCHR  = C.S_IFCHR
-	S_IFDIR  = C.S_IFDIR
-	S_IFBLK  = C.S_IFBLK
-	S_IFREG  = C.S_IFREG
-	S_IFLNK  = C.S_IFLNK
-	S_IFSOCK = C.S_IFSOCK
-	S_ISUID  = C.S_ISUID
-	S_ISGID  = C.S_ISGID
-	S_ISVTX  = C.S_ISVTX
-	S_IRUSR  = C.S_IRUSR
-	S_IWUSR  = C.S_IWUSR
-	S_IXUSR  = C.S_IXUSR
-)
-
 type Stat_t C.struct_stat
 
 type Statfs_t C.struct_statfs

この変更は、types_netbsd.goファイルから、ファイルモードに関連する定数(S_IFMTなど)の定義を削除するものです。コミットメッセージにあるように、これらの定数は既に自動生成されるzerrors_netbsd_*.goファイル内に存在しています。

Goのsyscallパッケージでは、OS固有の定数をmkerrors.shcgo -godefsによって自動生成されるz*ファイルに集約する方針が取られています。types_netbsd.goにこれらの定数を手動で定義することは、以下の問題を引き起こす可能性があります。

  • 冗長性: 同じ定数が複数の場所に定義されることになり、コードの重複が発生します。
  • 不整合のリスク: OSのヘッダーファイルで定数値が変更された場合、手動で定義されたtypes_netbsd.goの値を更新し忘れると、Goプログラムが誤った定数を使用する可能性があります。自動生成されたファイルであれば、スクリプトを再実行するだけで最新の定義が反映されます。

この削除により、コードベースのクリーンアップと、定数定義の一貫性および保守性の向上が図られます。

zerrors_netbsd_*.go および ztypes_netbsd_*.go の再生成

これらのファイルは、上記のmkerrors.shの修正とcgoの動作改善の結果として再生成されました。差分を見ると、非常に多くの定数値の変更、追加、削除が行われていることがわかります。これは、NetBSDのシステムヘッダーファイルの内容が更新されたことを直接反映しています。

  • zerrors_netbsd_386.go / zerrors_netbsd_amd64.go:
    • ネットワーク関連の定数(AF_, DLT_, IPPROTO_など)や、ファイルシステム、プロセス、端末制御など、多岐にわたるシステム定数が更新されています。例えば、AF_BLUETOOTHの値が変更されたり、新しいデータリンクタイプ(DLT_)が追加されたりしています。
    • エラーメッセージの文字列も、より正確な表現に修正されています。
  • ztypes_netbsd_386.go / ztypes_netbsd_amd64.go:
    • Timespec, Timeval, Rusage, Stat_tなどのC言語の構造体に対応するGoの型定義が更新されています。これらの構造体のフィールドの順序やサイズがOSの更新によって変更されることがあるため、cgo -godefsによって正確なGoの型が生成されることが重要です。

これらの自動生成ファイルの更新は、GoのsyscallパッケージがNetBSDの最新のシステムインターフェースと完全に同期していることを保証し、GoプログラムがNetBSD上で安定して動作するための基盤を提供します。

関連リンク

参考にした情報源リンク