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

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

このコミットは、Go言語のsyscallパッケージにおいて、FreeBSDオペレーティングシステム向けの新しいシステムコール定数を大量に追加するものです。具体的には、api/next.txtファイルが更新され、FreeBSDの386アーキテクチャとamd64アーキテクチャの両方に対応する多数の定数が追加されています。これにより、GoプログラムがFreeBSDシステム上でより多くの低レベルなシステム機能にアクセスできるようになります。

コミット

commit 5c667f366a59f05141969cc4f50744b96fd8d2ad
Author: Brad Fitzpatrick <bradfitz@golang.org>
Date:   Mon Mar 11 11:04:34 2013 -0700

    api: update next.txt
    
    Ton of FreeBSD syscall constants.
    
    R=golang-dev, minux.ma
    CC=golang-dev
    https://golang.org/cl/7476046

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

https://github.com/golang/go/commit/5c667f366a59f05141969cc4f50744b96fd8d2ad

元コミット内容

api: update next.txt Ton of FreeBSD syscall constants.

このコミットは、api/next.txtファイルを更新し、FreeBSDのシステムコール定数を大量に追加したことを示しています。

変更の背景

Go言語は、クロスプラットフォーム対応を重視しており、様々なオペレーティングシステム(OS)上で動作するように設計されています。syscallパッケージは、GoプログラムがOSの低レベルな機能(システムコール)にアクセスするためのインターフェースを提供します。新しいOSのバージョンがリリースされたり、既存のOSで新しい機能が追加されたりすると、Goのsyscallパッケージもそれらの変更に対応するために更新される必要があります。

このコミットの背景には、FreeBSDオペレーティングシステムにおけるシステムコール定数の追加または更新があったと考えられます。Goの標準ライブラリがFreeBSDの最新の機能やAPIをサポートするためには、これらの定数をsyscallパッケージに組み込む必要がありました。api/next.txtは、Goの次期リリースで公開されるAPIの変更を追跡するためのファイルであり、このファイルに定数を追加することで、GoのAPIレビュープロセスを経て正式にGoのAPIとして公開される準備が整います。

前提知識の解説

システムコール (System Call)

システムコールは、オペレーティングシステムが提供するサービスをユーザープログラムが利用するためのインターフェースです。ファイル操作(読み書き)、メモリ管理、プロセス管理、ネットワーク通信など、OSが管理するリソースにアクセスする際には、直接ハードウェアを操作するのではなく、システムコールを介してOSに処理を依頼します。これにより、システムの安定性とセキュリティが保たれます。

Go言語の syscall パッケージ

Go言語の標準ライブラリには、syscallというパッケージがあります。このパッケージは、GoプログラムからOS固有のシステムコールを呼び出すための低レベルなプリミティブを提供します。OSによってシステムコールの種類や引数が異なるため、syscallパッケージは各OS(Linux, Windows, macOS, FreeBSDなど)およびアーキテクチャ(amd64, 386, armなど)ごとに異なる実装を持っています。

api/next.txt ファイル

Goプロジェクトでは、次期リリースで公開される予定のAPI変更を追跡するために、api/next.txtというファイルを使用します。このファイルには、新しい関数、型、定数などが追加される際に、そのシグネチャや定義が記述されます。GoのAPIレビュープロセスでは、このファイルの内容がレビューされ、GoのAPI設計ガイドラインに沿っているか、後方互換性があるかなどが確認されます。このファイルに記載された内容は、最終的にGoの公式APIドキュメントに反映されます。

FreeBSD

FreeBSDは、UNIX系のオープンソースオペレーティングシステムです。高性能で安定性が高く、サーバー用途や組み込みシステムなどで広く利用されています。Go言語はFreeBSDを公式にサポートしており、GoプログラムをFreeBSD環境でコンパイル・実行することができます。

定数 (Constants)

プログラミングにおいて定数とは、プログラムの実行中に値が変化しない固定された値のことです。システムコールにおいては、特定の操作やオプションを表すために数値が割り当てられており、これらが定数として定義されます。例えば、ファイルの読み込みモードを表す定数や、ネットワークプロトコルを表す定数などがあります。

技術的詳細

このコミットは、api/next.txtファイルに大量の行を追加しています。追加された行のフォーマットは以下の通りです。

pkg syscall (freebsd-386), const CONSTANT_NAME ideal-int pkg syscall (freebsd-amd64), const CONSTANT_NAME ideal-int

これは、syscallパッケージにおいて、FreeBSDの386およびamd64アーキテクチャ向けに、CONSTANT_NAMEという名前の定数がideal-int型で追加されたことを示しています。

ideal-intはGoの内部的な型であり、コンパイル時に適切な整数型(int, int32, int64など)に解決されます。これは、異なるアーキテクチャやOS間で定数のサイズが異なる場合でも、Goの型システムが適切に処理できるようにするためのものです。

追加された定数の多くは、FreeBSDのシステムプログラミングに関連するものです。例えば、以下のようなカテゴリの定数が含まれています。

  • ターミナル制御 (Termios): B0, B110, B115200などのボーレート定数や、BRKINT, CFLUSH, CLOCAL, CREADなどのターミナルモードフラグ。これらはシリアルポートやターミナルの設定を制御するために使用されます。
  • BPF (Berkeley Packet Filter): BPF_T_BINTIME, BPF_T_MICROTIME, BPF_T_NANOTIMEなどのタイムスタンプ形式や、BPF_T_FLAG_MASK, BPF_T_FORMAT_MASKなどのフラグ。これらはネットワークパケットキャプチャやフィルタリングに関連します。
  • データリンクタイプ (DLT): DLT_AOS, DLT_CAN_SOCKETCAN, DLT_DBUSなど、様々なネットワークデータリンク層のタイプを表す定数。これらはlibpcapなどのライブラリでパケットの形式を識別するために使用されます。
  • メモリ管理 (madvise, mmap): MADV_AUTOSYNC, MADV_CORE, MADV_DONTNEEDなどのmadviseシステムコールで使用されるアドバイス定数や、MAP_ANON, MAP_ANONYMOUS, MAP_PRIVATE, MAP_SHAREDなどのmmapシステムコールで使用されるマッピングフラグ。これらはメモリ領域の振る舞いをOSに伝えるために使用されます。
  • プロテクションフラグ (PROT): PROT_EXEC, PROT_NONE, PROT_READ, PROT_WRITEなど、メモリ領域のアクセス権限を表す定数。これらはmmapmprotectシステムコールで使用されます。
  • ソケットオプション (SO_PROTOCOL, SO_PROTOTYPE): ソケットの振る舞いを制御するためのオプション。
  • システムコール番号 (SYS_): SYS_CLOCK_GETCPUCLOCKID2, SYS_WAIT6など、特定のシステムコールを表す番号。

これらの定数がGoのsyscallパッケージに追加されることで、Go開発者はFreeBSD上で動作するアプリケーションにおいて、より細かくOSの機能を利用できるようになります。例えば、ネットワークデバイスの低レベルな制御、カスタムなメモリ管理戦略の実装、特定のシステムコールを直接呼び出すなどの高度な操作が可能になります。

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

このコミットにおけるコアとなるコードの変更箇所は、api/next.txtファイルへの追加です。

--- a/api/next.txt
+++ b/api/next.txt
@@ -1041,9 +1041,206 @@ pkg syscall (darwin-amd64-cgo), type Termios struct, Lflag uint64
 pkg syscall (darwin-amd64-cgo), type Termios struct, Oflag uint64
 pkg syscall (darwin-amd64-cgo), type Termios struct, Ospeed uint64
 pkg syscall (darwin-amd64-cgo), type Termios struct, Pad_cgo_0 [4]uint8
+pkg syscall (freebsd-386), const B0 ideal-int
+pkg syscall (freebsd-386), const B110 ideal-int
+... (大量のFreeBSD 386定数) ...
+pkg syscall (freebsd-386), const VWERASE ideal-int
 pkg syscall (freebsd-386), func SlicePtrFromStrings([]string) ([]*uint8, error)\n pkg syscall (freebsd-386), type IfAnnounceMsghdr struct\n pkg syscall (freebsd-386), type IfAnnounceMsghdr struct, Index uint16
 @@ -1054,9 +1251,206 @@ pkg syscall (freebsd-386), type IfAnnounceMsghdr struct, Version uint8
 pkg syscall (freebsd-386), type IfAnnounceMsghdr struct, What uint16
 pkg syscall (freebsd-386), type InterfaceAnnounceMessage struct
 pkg syscall (freebsd-386), type InterfaceAnnounceMessage struct, Header IfAnnounceMsghdr
+pkg syscall (freebsd-amd64), const B0 ideal-int
+pkg syscall (freebsd-amd64), const B110 ideal-int
+... (大量のFreeBSD AMD64定数) ...
+pkg syscall (freebsd-amd64), const VWERASE ideal-int
 pkg syscall (freebsd-amd64), func SlicePtrFromStrings([]string) ([]*uint8, error)\n pkg syscall (freebsd-amd64), func Syscall9(uintptr, uintptr, uintptr, uintptr, uintptr, uintptr, uintptr, uintptr, uintptr, uintptr) (uintptr, uintptr, Errno)\n pkg syscall (freebsd-amd64), type IfAnnounceMsghdr struct

この差分は、api/next.txtファイルに394行が追加されたことを示しています。これらの行は、FreeBSDの386およびamd64アーキテクチャ向けのsyscallパッケージに新しい定数が追加されたことを記録しています。

コアとなるコードの解説

api/next.txtファイルは、GoのAPI変更を追跡するためのメタデータファイルであり、実際のGoのソースコードではありません。しかし、このファイルへの変更は、GoのsyscallパッケージのFreeBSD固有の実装(例: src/syscall/zsysnum_freebsd_386.go, src/syscall/zsysnum_freebsd_amd64.goなど、または関連する定数定義ファイル)に、これらの定数が追加されることを意味します。

Goのビルドシステムは、api/next.txtの内容を基に、APIの互換性チェックや、場合によっては自動生成されるコードの更新を行います。このコミットによって追加された定数は、FreeBSDのシステムヘッダーファイル(例: /usr/include/sys/termios.h, /usr/include/net/bpf.hなど)で定義されているC言語の定数に対応しています。Goのsyscallパッケージは、これらのC言語の定数をGoの定数としてエクスポートすることで、Goプログラムから利用できるようにします。

例えば、FreeBSDのC言語ヘッダーで#define B0 0のような定義がある場合、Goのsyscallパッケージはこれに対応するsyscall.B0という定数を提供します。このコミットは、このような対応付けを大量に追加したことを示しており、GoがFreeBSDのより広範なシステムコールインターフェースをサポートするようになったことを意味します。

関連リンク

参考にした情報源リンク