[インデックス 19172] ファイルの概要
このコミットは、Go 1.3のリリースノートである doc/go1.3.html
ファイルに、FreeBSDのサポート状況に関するドキュメントを追加するものです。具体的には、Go 1.2以降のFreeBSDサポート要件と、Go 1.3における新たな要件(COMPAT_FREEBSD32
フラグ)について明記しています。
コミット
- コミットハッシュ:
59f6c81f98addb4fcc28810b4f4eff2990377f87
- 作者: Rob Pike r@golang.org
- コミット日時: 2014年4月16日 10:40:41 -0700
GitHub上でのコミットページへのリンク
https://github.com/golang/go/commit/59f6c81f98addb4fcc28810b4f4eff2990377f87
元コミット内容
doc/go1.3.html: document the state of FreeBSD
Update #7056
LGTM=bradfitz
R=golang-codereviews, bradfitz
CC=golang-codereviews
https://golang.org/cl/88070045
変更の背景
このコミットの主な背景は、Go言語のFreeBSDサポートに関する情報を、Go 1.3のリリースノートに明確に記載することです。コミットメッセージにある Update #7056
は、GoのIssueトラッカーにおける特定の課題(Issue 7056: doc: document FreeBSD support requirements
)に対応していることを示唆しています。
Go言語はクロスプラットフォーム対応を重視しており、様々なオペレーティングシステム上で動作します。しかし、特定のOSバージョンや設定によっては、Goのランタイムが正しく機能しない、あるいは最適に動作しない場合があります。FreeBSDもその一つで、特に32ビット互換性に関する要件がGo 1.3で変更されたため、ユーザーが混乱しないように公式ドキュメントでその変更点を明記する必要がありました。
Go 1.2のリリース以降、FreeBSD 8以降がGoの動作に必要となっていましたが、これが明示的にアナウンスされていなかったため、Go 1.3のリリースに合わせてこの情報を追記し、さらにGo 1.3で新たに必要となるカーネル設定(COMPAT_FREEBSD32
)についても周知徹底を図る目的があります。これにより、FreeBSDユーザーがGo 1.3へスムーズに移行し、問題なくGoアプリケーションを開発・実行できるよう支援することが意図されています。
前提知識の解説
FreeBSD
FreeBSDは、UNIX系のオープンソースオペレーティングシステムです。堅牢性、高性能、セキュリティの高さで知られ、サーバー、組み込みシステム、デスクトップなど幅広い用途で利用されています。Linuxと同様に、多くの開発者や企業に支持されています。
Go言語のクロスコンパイルとランタイム
Go言語は、その強力なクロスコンパイル機能が特徴です。開発者は、あるOS(例: Linux)上でコードを書き、別のOS(例: Windows, macOS, FreeBSD)向けに実行ファイルを生成できます。Goのランタイムは、生成されたバイナリがターゲットOS上で効率的に動作するために、OS固有のシステムコールやメモリ管理、スケジューリングなどを抽象化して提供します。
COMPAT_FREEBSD32
フラグ
COMPAT_FREEBSD32
は、FreeBSDカーネルのコンパイルオプションの一つです。このフラグを有効にすると、FreeBSDカーネルは32ビットアプリケーションのシステムコールを処理するための互換レイヤーを提供します。
Go言語のランタイムは、内部的にシステムコールを多用します。特に、Go 1.3の時点では、GoのランタイムがFreeBSD上で32ビットのシステムコールインターフェースを利用する部分があった可能性があります。FreeBSDが64ビットシステムとして動作している場合でも、32ビットアプリケーションとの互換性を保つためにこのフラグが必要となることがあります。これは、Goのランタイムが特定のシステムコールを32ビット形式で呼び出すことを期待している場合や、Goのツールチェインが生成するバイナリが32ビットのシステムコールインターフェースに依存している場合に重要となります。
このフラグが設定されていないカーネルでは、Goアプリケーションが特定のシステムコールを実行しようとした際に、互換性の問題によりクラッシュしたり、予期せぬ動作を引き起こしたりする可能性があります。
技術的詳細
このコミットは、Go 1.3のリリースノートである doc/go1.3.html
に、FreeBSDにおけるGoのサポート状況に関する重要な情報を追加しています。
追加された内容は以下の2点です。
-
Go 1.2以降のFreeBSDサポート要件: Go 1.2のリリース以降、GoをFreeBSD上で動作させるにはFreeBSD 8以降が必要であるという情報が追記されました。これは、Go 1.2でFreeBSDの古いバージョンに対するサポートが終了したことを意味します。
-
Go 1.3におけるFreeBSDサポートの新たな要件: Go 1.3からは、FreeBSD上でGoを動作させるために、カーネルが
COMPAT_FREEBSD32
フラグを有効にしてコンパイルされている必要があることが明記されました。これは、GoのランタイムがFreeBSDの32ビット互換レイヤーに依存していることを示唆しています。Goの内部実装、特にシステムコールやメモリ管理の低レベルな部分が、この32ビット互換レイヤーを必要とするように設計されているためと考えられます。
この変更は、GoのランタイムがFreeBSDの特定のカーネル機能に依存していることをユーザーに明確に伝えることで、Goアプリケーションのデプロイや実行時の問題を未然に防ぐことを目的としています。特に、FreeBSDのシステム管理者は、Go 1.3以降のバージョンを使用する際に、カーネルの再コンパイルが必要になる可能性があることを認識する必要があります。
また、コミットの差分を見ると、以前のバージョンで存在したいくつかの「TODO」コメントが削除されています。これらはFreeBSD 10におけるソケット作成の高速化(SOCK_CLOEXEC
とAccept4
の使用)や、syscall
パッケージへのAccept4
の追加、FreeBSD 10のサポートに関するものでした。これらのTODOが削除されたのは、Go 1.3のリリース時点ではこれらの機能が実装されたか、あるいはGo 1.3のスコープ外と判断されたためと考えられます。今回のコミットはドキュメントの更新に焦点を当てており、これらのTODOの削除は、ドキュメントの整理の一環として行われたものと推測されます。
コアとなるコードの変更箇所
変更は doc/go1.3.html
ファイルに対して行われています。
--- a/doc/go1.3.html
+++ b/doc/go1.3.html
@@ -53,6 +53,18 @@ as of Go 1.3 it is not supported by Go either.
</p>
+<h3 id="solaris">Support for FreeBSD</h3>
+
+<p>
+It was not announced at the time, but since the release of Go 1.2, support for Go on FreeBSD
+requires FreeBSD 8 or above.
+</p>
+
+<p>
+As of Go 1.3, support for Go on FreeBSD requires that the kernel be compiled with the
+<code>COMPAT_FREEBSD32</code> flag configured.
+</p>
+
<h2 id="memory">Changes to the memory model</h2>
<p>
@@ -370,8 +382,6 @@ now closes <a href="/pkg/net/http/#Request"><code>Request.Body</code></a>
consistently, even on error.
</li>
-<li> TODO: net: enable fast socket creation using SOCK_CLOEXEC and Accept4 on FreeBSD 10 (69100043)</li>
-
<li>
The <a href="/pkg/os/exec/"><code>os/exec</code></a> package now implements
what the documentation has always said with regard to relative paths for the binary.
@@ -395,8 +405,6 @@ now considers the <code>DEL</code> character, <code>U+007F</code>, to be
non-printing.\n </li>
-<li> TODO: syscall: add Accept4 for freebsd (CL 68880043)</li>
-
<li>
On Windows, the <a href="/pkg/syscall/"><code>syscall</code></a> package now
supports the cdecl calling convention through the addition of a new function
@@ -405,8 +413,6 @@ alongside the existing function
<a href="/pkg/syscall/#NewCallback"><code>NewCallback</code></a>.\n </li>
-<li> TODO: syscall: add support for FreeBSD 10 (CL 56770044, 56980043)</li>
-
<li>
The <a href="/pkg/testing/"><code>testing</code></a> package now
diagnoses tests that call <code>panic(nil)</code>, which are almost always erroneous.\n
コアとなるコードの解説
追加されたHTMLスニペットは、Go 1.3のリリースノートに新しいセクション「Support for FreeBSD」を導入しています。
-
<h3 id="solaris">Support for FreeBSD</h3>
: これは、FreeBSDサポートに関する新しいサブセクションのヘッダーです。id="solaris"
となっているのは、おそらくコピー&ペーストのミスか、以前のセクションのIDを再利用したためで、機能的には問題ありませんが、セマンティクス的にはid="freebsd"
の方が適切でしょう。 -
最初の
<p>
タグ内のテキスト: 「It was not announced at the time, but since the release of Go 1.2, support for Go on FreeBSD requires FreeBSD 8 or above.」 この文は、Go 1.2のリリース以降、GoをFreeBSDで実行するにはFreeBSD 8以上のバージョンが必要であることを明確に述べています。これは、Go 1.2で古いFreeBSDバージョンへのサポートが非推奨または終了したことを示唆しています。 -
2番目の
<p>
タグ内のテキスト: 「As of Go 1.3, support for Go on FreeBSD requires that the kernel be compiled with theCOMPAT_FREEBSD32
flag configured.」 この文は、Go 1.3以降、FreeBSD上でGoを動作させるには、カーネルがCOMPAT_FREEBSD32
フラグを有効にしてコンパイルされている必要があるという、新たな要件を提示しています。これは、Goのランタイムが32ビット互換レイヤーに依存していることを示しており、FreeBSDユーザーはGo 1.3を使用する前にカーネル設定を確認する必要があることを意味します。
削除された「TODO」コメントは、Go 1.3のリリースノートの他の箇所にあったもので、FreeBSD 10に関連するネットワークやシステムコール機能の改善に関する将来の作業項目でした。これらが削除されたのは、Go 1.3のリリーススコープから外れたか、あるいは既に実装されたため、ドキュメントから不要なTODOを削除したと考えられます。今回のコミットの主目的はFreeBSDサポートの要件を明確にすることであり、これらのTODOの削除はドキュメントのクリーンアップの一環です。
関連リンク
- Go Change-ID: https://golang.org/cl/88070045
- Go Issue 7056: https://github.com/golang/go/issues/7056 (このコミットが解決したIssue)
参考にした情報源リンク
- FreeBSD Handbook: https://www.freebsd.org/doc/handbook/ (FreeBSDカーネルのコンパイルオプションに関する一般的な情報源)
- Go 1.3 Release Notes (公式ドキュメント): https://go.dev/doc/go1.3 (コミットが変更を加えた対象のドキュメントの最終版)
- Go言語公式ドキュメント: https://go.dev/doc/ (Go言語のクロスプラットフォーム対応に関する一般的な情報源)
COMPAT_FREEBSD32
に関する情報 (FreeBSDのmanページやドキュメント):man 4 compat
などで検索すると、互換性レイヤーに関する情報が見つかることがあります。