[インデックス 19599] ファイルの概要
このコミットは、Go言語のsyscall
パッケージにおいて、Darwin (macOS) 環境向けのシステムコール関連ファイルを更新するものです。具体的には、macOS 10.7 (Lion) カーネルベースからmacOS 10.9 (Mavericks) カーネルベースへと、自動生成される「z-files」と呼ばれる定数やシステムコール番号の定義を刷新しています。これにより、GoプログラムがmacOS 10.9で導入された新しいシステム機能や定数を適切に利用できるようになります。
コミット
commit fbd5ad585d03ee750b7d58a85cf0d40079b28833
Author: Mikio Hara <mikioh.mikioh@gmail.com>
Date: Tue Jun 24 09:20:42 2014 +0900
syscall: regenerate z-files for darwin
Updates z-files from 10.7 kernel-based to 10.9 kernel-based.
LGTM=iant
R=golang-codereviews, bradfitz, iant
CC=golang-codereviews
https://golang.org/cl/102610045
GitHub上でのコミットページへのリンク
https://github.com/golang/go/commit/fbd5ad585d03ee750b7d58a85cf0d40079b28833
元コミット内容
syscall: regenerate z-files for darwin
Updates z-files from 10.7 kernel-based to 10.9 kernel-based.
変更の背景
このコミットの主な背景は、Go言語のsyscall
パッケージがmacOSの新しいバージョンに対応する必要があったことです。Goのsyscall
パッケージは、Goプログラムがオペレーティングシステム(OS)の低レベルな機能、特にシステムコールを直接呼び出すためのインターフェースを提供します。OSのバージョンが上がると、新しいシステムコールが追加されたり、既存の定数や構造体の定義が変更されたりすることがよくあります。
このコミットが行われた2014年当時、macOSの主要なバージョンはOS X Mavericks (10.9) でした。Goのsyscall
パッケージがそれ以前のOS X Lion (10.7) のカーネル情報に基づいて生成された「z-files」を使用していたため、macOS 10.9で導入された新しいシステムコールや定数に対応できていませんでした。この不整合は、GoプログラムがmacOS 10.9の特定の機能を利用しようとした際に問題を引き起こす可能性がありました。
このコミットは、syscall
パッケージがmacOS 10.9のカーネル情報に準拠するように、関連する自動生成ファイルを更新することを目的としています。これにより、GoプログラムはmacOSの最新のシステム機能とより良く連携できるようになり、互換性と機能性が向上します。
前提知識の解説
Go言語のsyscall
パッケージ
Go言語の標準ライブラリに含まれるsyscall
パッケージは、Goプログラムがオペレーティングシステム(OS)のシステムコールを直接呼び出すための低レベルなインターフェースを提供します。通常、GoプログラムはOSの機能を利用する際に、os
やnet
などの高レベルなパッケージを使用しますが、これらのパッケージの多くは内部的にsyscall
パッケージを利用しています。
syscall
パッケージは、OS固有の定数(エラーコード、ファイルパーミッション、ソケットオプションなど)、システムコール番号、およびOSのデータ構造(例えば、ファイル統計情報やネットワークアドレス構造体)をGoの型として定義しています。これにより、GoプログラムはOSのネイティブなAPIと直接対話することが可能になります。
「z-files」とは
Goのsyscall
パッケージにおいて、「z-files」という用語は、OS固有の定数やシステムコール番号、構造体定義などを自動生成したGoソースファイルを指します。これらのファイルは、通常、OSのC言語ヘッダーファイルから、Perlスクリプトやシェルスクリプトなどのツールを使って生成されます。
例えば、zerrors_darwin_amd64.go
のようなファイルは、macOSのamd64
アーキテクチャ向けのエラーコードやその他の定数を定義しています。また、zsysnum_darwin_amd64.go
は、macOSのamd64
アーキテクチャ向けのシステムコール番号を定義しています。これらのファイルは手動で編集されることはほとんどなく、OSのバージョンアップに伴って内容が古くなった場合に、再生成されるのが一般的です。
「z-files」という命名は、これらのファイルが自動生成されたものであり、通常は直接編集しないことを示す慣習的なものです。
Darwin/macOSカーネルバージョンとシステムコールの変化
DarwinはmacOSの基盤となるオープンソースのUNIX系オペレーティングシステムです。macOSの各バージョンは、特定のDarwinカーネルバージョンに基づいています。OSのバージョンが更新されると、カーネルレベルでの変更、新しいシステムコールの追加、既存のシステムコールの挙動変更、または一部の定数の値の変更などが発生します。
このコミットで言及されているOS X Lion (10.7) とOS X Mavericks (10.9) の間にも、システムレベルでの多くの変更がありました。例えば、新しいファイルシステム関連の機能、ネットワークスタックの改善、セキュリティ機能の強化などが行われ、それに伴い新しいシステムコールや定数が導入されました。Goのsyscall
パッケージがこれらの新しい機能と連携するためには、これらの変更を反映した「z-files」が必要となります。
Cgo
Cgoは、GoプログラムがC言語のコードを呼び出したり、C言語のライブラリとリンクしたりするためのGoの機能です。syscall
パッケージの一部では、OSのC言語ヘッダーファイルで定義されている複雑な構造体や、C言語で実装された特定のOS APIをGoから利用するためにCgoが使用されることがあります。
このコミットでは、types_darwin.go
におけるLog2phys_t
の定義変更がCgoに関連している可能性があります。Cgoを介してCの構造体を直接Goの型にマッピングする際に、OSのヘッダーファイルの変更や、GoのCgoの扱いの改善に伴い、よりGoらしい型定義に修正されることがあります。
技術的詳細
このコミットは、Goのsyscall
パッケージがmacOS 10.9 (Mavericks) のシステムインターフェースに適合するように、複数のファイルを横断的に変更しています。
-
api/except.txt
の更新:- このファイルは、GoのAPIチェッカーが特定のプラットフォームで無視すべきAPIの変更をリストアップするために使用されます。
darwin-386
およびdarwin-amd64
アーキテクチャ向けに、AF_MAX
,ELAST
,EVFILT_SYSCOUNT
,EVFILT_THREADMARKER
,IPV6_FRAGTTL
,SYS_MAXSYSCALL
といった新しい定数が追加されています。これは、macOS 10.9でこれらの定数の値が変更されたか、新たに導入されたことを示唆しており、GoのAPIがこれらの新しい値を認識するように更新されたことを意味します。
-
src/pkg/syscall/mkerrors.sh
の変更:- このシェルスクリプトは、OSのエラーコードやその他の定数をGoのソースファイルとして生成するために使用されます。
- 変更点として、
F_MARKDEPENDENCY
,F_READBOOTSTRAP
,F_WRITEBOOTSTRAP
,NOTE_RESOURCEEND
,SO_RESTRICTIONS
など、OS X Mavericks以降でサポートされなくなった可能性のある定数を、互換性のために明示的に定義する#ifndef
ブロックが追加されています。これは、古いOSバージョンとの互換性を維持しつつ、新しいOSバージョンに対応するための戦略です。
-
src/pkg/syscall/mksysnum_darwin.pl
の変更:- このPerlスクリプトは、macOSのシステムコール番号をGoのソースファイルとして生成するために使用されます。
- スクリプトは、Cヘッダーファイルからシステムコール番号をパースするだけでなく、OS X Mavericks以降で直接定義されていない可能性のある古いシステムコール(例:
SYS_PROFIL
,SYS_ADD_PROFIL
,SYS_ATSOCKET
など)を、互換性のために明示的に%syscalls
ハッシュに追加するようになりました。これにより、Goのsyscall
パッケージがこれらの古いシステムコールも引き続きサポートできるようになります。
-
src/pkg/syscall/types_darwin.go
の変更:- このファイルは、Darwin固有のGoの型定義を含んでいます。
Log2phys_t
構造体の定義がC.struct_log2phys
から、Goのネイティブな構造体定義に変更されました。
この変更は、//type Log2phys_t C.struct_packed_log2phys // コメントアウトされた古い定義 type Log2phys_t struct { Flags uint32 Contigbytes int64 Devoffset int64 }
golang.org/issue/8267
で議論された問題に対応するためのものです。元のCgoベースの定義が特定の環境やコンパイラで問題を引き起こす可能性があったため、より堅牢なGoの構造体として再定義されました。これは、Cgoの利用を減らし、Goの型システム内でより直接的にデータ構造を扱うことで、コンパイル時の安定性やクロスコンパイルの容易さを向上させる狙いがあります。
-
src/pkg/syscall/zerrors_darwin_386.go
およびsrc/pkg/syscall/zerrors_darwin_amd64.go
の更新:- これらのファイルは、
mkerrors.sh
スクリプトによって自動生成される、Darwinのエラーコードやその他の定数を含むファイルです。 AF_MAX
の値が0x26
から0x28
に、EVFILT_SYSCOUNT
とEVFILT_THREADMARKER
が0xc
から0xe
に、IPV6_FRAGTTL
が0x78
から0x3c
に変更されるなど、既存の定数の値が更新されています。AF_UTUN
,BIOCSETFNR
,DLT_A429
から始まる多数のDLT_
定数(データリンクタイプ)、F_FINDSIGS
,F_GETPROTECTIONLEVEL
,F_SETLKWTIMEOUT
などの新しいファイル制御フラグ、NOTE_BACKGROUND
,NOTE_CRITICAL
などの新しいkqueueノートフラグ、O_DP_GETRAWENCRYPTED
などの新しいファイルオープンフラグ、RLIMIT_CPU_USAGE_MONITOR
などのリソース制限、RTF_NOIFREF
,RTF_PROXY
などのルーティングテーブルフラグ、SIOCIFGCLONERS
などのソケットI/O制御コマンド、TCP_KEEPCNT
,TCP_KEEPINTVL
,TCP_SENDMOREACKS
などのTCPオプションが大量に追加されています。ELAST
エラーコードの値が0x69
から0x6a
に更新され、新しいエラーメッセージ106: "interface output queue is full"
が追加されています。- これらの変更は、macOS 10.9で導入された新しいネットワークプロトコル、ファイルシステム機能、カーネルイベント通知、システムリソース管理などに対応するために不可欠です。
- これらのファイルは、
-
src/pkg/syscall/zsysnum_darwin_386.go
およびsrc/pkg/syscall/zsysnum_darwin_amd64.go
の更新:- これらのファイルは、
mksysnum_darwin.pl
スクリプトによって自動生成される、Darwinのシステムコール番号を含むファイルです。 SYS_CSOPS_AUDITTOKEN
,SYS_OPEN_DPROTECTED_NP
,SYS_LEDGER
など、macOS 10.9で導入された新しいシステムコールが追加されています。- 特に、
SYS_MAXSYSCALL
の値が439
から456
に増加しており、これは多くの新しいシステムコールが追加されたことを明確に示しています。追加されたシステムコールには、SYS_KAS_INFO
,SYS_MEMORYSTATUS_CONTROL
,SYS_GUARDED_OPEN_NP
,SYS_CONNECTX
,SYS_TELEMETRY
などが含まれます。これらは、カーネル情報取得、メモリ管理、セキュリティ関連のファイル操作、ネットワーク接続、システム監視など、多岐にわたる新しいOS機能に対応するものです。
- これらのファイルは、
これらの変更は、Goのsyscall
パッケージがmacOSの進化に追従し、Goアプリケーションが最新のOS機能と互換性を保ちながら動作できるようにするために不可欠なメンテナンス作業です。
コアとなるコードの変更箇所
このコミットにおけるコアとなるコードの変更は、主に自動生成されるzerrors_darwin_*.go
とzsysnum_darwin_*.go
ファイルに現れていますが、それらを生成するスクリプトと、一部手動で定義されているtypes_darwin.go
にも重要な変更があります。
src/pkg/syscall/mkerrors.sh
--- a/src/pkg/syscall/mkerrors.sh
+++ b/src/pkg/syscall/mkerrors.sh
@@ -35,6 +35,36 @@ includes_Darwin='\
#include <netinet/ip.h>
#include <netinet/ip_mroute.h>
#include <termios.h>
+
+// We keep some constants not supported in OS X Mavericks and beyond
+// for the promise of compatibility.
+#ifndef F_MARKDEPENDENCY
+#define F_MARKDEPENDENCY 0x3c
+#endif
+#ifndef F_READBOOTSTRAP
+#define F_READBOOTSTRAP 0x2e
+#endif
+#ifndef F_WRITEBOOTSTRAP
+#define F_WRITEBOOTSTRAP 0x2f
+#endif
+#ifndef NOTE_RESOURCEEND
+#define NOTE_RESOURCEEND 0x2000000
+#endif
+#ifndef SO_RESTRICTIONS
+#define SO_RESTRICTIONS 0x1081
+#endif
+#ifndef SO_RESTRICT_DENYIN
+#define SO_RESTRICT_DENYIN 0x1
+#endif
+#ifndef SO_RESTRICT_DENYOUT
+#define SO_RESTRICT_DENYOUT 0x2
+#endif
+#ifndef SO_RESTRICT_DENYSET
+#define SO_RESTRICT_DENYSET 0x80000000
+#endif
+#ifndef TCP_MINMSSOVERLOAD
+#define TCP_MINMSSOVERLOAD 0x3e8
+#endif
'
includes_DragonFly='
src/pkg/syscall/mksysnum_darwin.pl
--- a/src/pkg/syscall/mksysnum_darwin.pl
+++ b/src/pkg/syscall/mksysnum_darwin.pl
@@ -18,15 +18,41 @@ package syscall
const (
EOF
+my %syscalls;
+
while(<>){
if(/^#define\s+SYS_(\w+)\\s+([0-9]+)/){
my $name = $1;
my $num = $2;
$name =~ y/a-z/A-Z/;
-\t\tprint "\tSYS_$name = $num;";
+\t\t$syscalls{"SYS_$name"} = "$num";
}\
}
+# We keep some constants not supported in OS X Mavericks and beyond
+# for the promise of compatibility.
+$syscalls{"SYS_PROFIL"} = 44;
+$syscalls{"SYS_ADD_PROFIL"} = 176;
+$syscalls{"SYS_ATSOCKET"} = 206;
+$syscalls{"SYS_ATGETMSG"} = 207;
+$syscalls{"SYS_ATPUTMSG"} = 208;
+$syscalls{"SYS_ATPSNDREQ"} = 209;
+$syscalls{"SYS_ATPSNDRSP"} = 210;
+$syscalls{"SYS_ATPGETREQ"} = 211;
+$syscalls{"SYS_ATPGETRSP"} = 212;
+$syscalls{"SYS_MKCOMPLEX"} = 216;
+$syscalls{"SYS_STATV"} = 217;
+$syscalls{"SYS_LSTATV"} = 218;
+$syscalls{"SYS_FSTATV"} = 219;
+$syscalls{"SYS_GETAUDIT"} = 355;
+$syscalls{"SYS_SETAUDIT"} = 356;
+$syscalls{"SYS_PID_HIBERNATE"} = 435;
+$syscalls{"SYS_PID_SHUTDOWN_SOCKETS"} = 436;
+
+for my $key (sort {$syscalls{$a} <=> $syscalls{$b} || $a cmp $b} keys %syscalls){
+ print "$key = $syscalls{$key};\\n";
+}
+
print <<EOF;
)
EOF
src/pkg/syscall/types_darwin.go
--- a/src/pkg/syscall/types_darwin.go
+++ b/src/pkg/syscall/types_darwin.go
@@ -64,7 +64,6 @@ struct sockaddr_any {
struct sockaddr addr;
char pad[sizeof(union sockaddr_all) - sizeof(struct sockaddr)];
};
--
*/
import "C"
@@ -117,7 +116,13 @@ type Radvisory_t C.struct_radvisory
type Fbootstraptransfer_t C.struct_fbootstraptransfer
-type Log2phys_t C.struct_log2phys
+// See golang.org/issue/8267.
+//type Log2phys_t C.struct_packed_log2phys
+type Log2phys_t struct {
+ Flags uint32
+ Contigbytes int64
+ Devoffset int64
+}
type Fsid C.struct_fsid
src/pkg/syscall/zerrors_darwin_amd64.go
(抜粋、386版も同様)
--- a/src/pkg/syscall/zerrors_darwin_amd64.go
+++ b/src/pkg/syscall/zerrors_darwin_amd64.go
@@ -28,7 +28,7 @@ const (
AF_LAT = 0xe
AF_LINK = 0x12
AF_LOCAL = 0x1
- AF_MAX = 0x26
+ AF_MAX = 0x28
AF_NATM = 0x1f
AF_NDRV = 0x1b
AF_NETBIOS = 0x21
@@ -43,6 +43,7 @@ const (
AF_SYSTEM = 0x20
AF_UNIX = 0x1
AF_UNSPEC = 0x0
+ AF_UTUN = 0x26
B0 = 0x0
B110 = 0x6e
B115200 = 0x1c200
... (多数のDLT_定数、F_定数、NOTE_定数、O_定数、RLIMIT_定数、RTF_定数、SIOC_定数、TCP_定数の追加・変更) ...
@@ -1170,7 +1331,7 @@ const (
EIO = Errno(0x5)
EISCONN = Errno(0x38)
EISDIR = Errno(0x15)
- ELAST = Errno(0x69)
+ ELAST = Errno(0x6a)
ELOOP = Errno(0x3e)
EMFILE = Errno(0x18)
EMLINK = Errno(0x1f)
@@ -1221,6 +1382,7 @@ const (
EPROTONOSUPPORT = Errno(0x2b)
EPROTOTYPE = Errno(0x29)
EPWROFF = Errno(0x52)
+ EQFULL = Errno(0x6a)
ERANGE = Errno(0x22)
EREMOTE = Errno(0x47)
EROFS = Errno(0x1e)
@@ -1383,6 +1545,7 @@ var errors = [...]string{
103: "policy not found",
104: "state not recoverable",
105: "previous owner died",
+ 106: "interface output queue is full",
}
// Signal table
src/pkg/syscall/zsysnum_darwin_amd64.go
(抜粋、386版も同様)
--- a/src/pkg/syscall/zsysnum_darwin_amd64.go
+++ b/src/pkg/syscall/zsysnum_darwin_amd64.go
@@ -118,6 +118,7 @@ const (
SYS_QUOTACTL = 165
SYS_MOUNT = 167
SYS_CSOPS = 169
+ SYS_CSOPS_AUDITTOKEN = 170
SYS_WAITID = 173
SYS_ADD_PROFIL = 176
SYS_KDEBUG_TRACE = 180
@@ -151,6 +152,7 @@ const (
SYS_ATPGETREQ = 211
SYS_ATPGETRSP = 212
SYS_MKCOMPLEX = 216
+ SYS_OPEN_DPROTECTED_NP = 216
SYS_STATV = 217
SYS_LSTATV = 218
SYS_FSTATV = 219
@@ -298,6 +300,7 @@ const (
SYS___OLD_SEMWAIT_SIGNAL = 370
SYS___OLD_SEMWAIT_SIGNAL_NOCANCEL = 371
SYS_THREAD_SELFID = 372
+ SYS_LEDGER = 373
SYS___MAC_EXECVE = 380
SYS___MAC_SYSCALL = 381
SYS___MAC_GET_FILE = 382
@@ -356,5 +359,21 @@ const (
SYS_PID_HIBERNATE = 435
SYS_PID_SHUTDOWN_SOCKETS = 436
SYS_SHARED_REGION_MAP_AND_SLIDE_NP = 438
-\tSYS_MAXSYSCALL = 439
+\tSYS_KAS_INFO = 439
+\tSYS_MEMORYSTATUS_CONTROL = 440
+\tSYS_GUARDED_OPEN_NP = 441
+\tSYS_GUARDED_CLOSE_NP = 442
+\tSYS_GUARDED_KQUEUE_NP = 443
+\tSYS_CHANGE_FDGUARD_NP = 444
+\tSYS_PROC_RLIMIT_CONTROL = 446
+\tSYS_CONNECTX = 447
+\tSYS_DISCONNECTX = 448
+\tSYS_PEELOFF = 449
+\tSYS_SOCKET_DELEGATE = 450
+\tSYS_TELEMETRY = 451
+\tSYS_PROC_UUID_POLICY = 452
+\tSYS_MEMORYSTATUS_GET_LEVEL = 453
+\tSYS_SYSTEM_OVERRIDE = 454
+\tSYS_VFS_PURGE = 455
+\tSYS_MAXSYSCALL = 456
)
コアとなるコードの解説
src/pkg/syscall/mkerrors.sh
の変更
このスクリプトは、Goのsyscall
パッケージが利用するOS固有の定数を生成する役割を担っています。追加された#ifndef
ブロックは、OS X Mavericks (10.9) 以降のバージョンで、以前のバージョン(例えば10.7)に存在した特定の定数が削除されたり、定義方法が変わったりした場合に備えるためのものです。
具体的には、F_MARKDEPENDENCY
やSO_RESTRICTIONS
などの定数が、新しいOSバージョンでは標準のヘッダーファイルに含まれていない可能性があります。しかし、Goのsyscall
パッケージがこれらの定数を参照するコードを持っている場合、コンパイルエラーを避けるために、スクリプトがこれらの定数を明示的に定義します。これにより、Goのsyscall
パッケージは、古いOSバージョンと新しいOSバージョンの両方で互換性を保ちながら動作できるようになります。これは、Goが異なるOSバージョン間でのバイナリ互換性を維持しようとする努力の一環です。
src/pkg/syscall/mksysnum_darwin.pl
の変更
このPerlスクリプトは、macOSのシステムコール番号をGoのコードに変換するために使用されます。変更前は、Cヘッダーファイルから直接システムコール番号を読み取って出力していましたが、変更後は一度%syscalls
というハッシュに格納するようになりました。
最も重要な変更点は、# We keep some constants not supported in OS X Mavericks and beyond for the promise of compatibility.
というコメントの下に追加された行です。これは、OS X Mavericks以降のヘッダーファイルには直接定義されていないが、Goのsyscall
パッケージが引き続きサポートする必要がある古いシステムコールを、明示的に%syscalls
ハッシュに追加していることを意味します。例えば、SYS_PROFIL
やSYS_ATSOCKET
などがこれに該当します。
最後に、for my $key (sort ...)
ループが追加され、%syscalls
ハッシュに格納されたシステムコールが、番号順にソートされてからGoのコードとして出力されるようになりました。これにより、生成されるGoコードの可読性が向上し、また、システムコール番号の重複や欠落がないかを確認しやすくなります。この変更は、Goのsyscall
パッケージが、OSのバージョンアップによって廃止されたり変更されたりしたシステムコールに対しても、後方互換性を提供するための重要なメカニズムです。
src/pkg/syscall/types_darwin.go
の変更
このファイルは、Goのsyscall
パッケージが利用するDarwin固有のGoの型定義を含んでいます。Log2phys_t
構造体の定義が変更されています。
変更前はtype Log2phys_t C.struct_log2phys
のようにCgoを使ってC言語の構造体を直接Goの型にマッピングしていました。しかし、変更後はLog2phys_t
がGoのネイティブな構造体として明示的に定義されています。
type Log2phys_t struct {
Flags uint32
Contigbytes int64
Devoffset int64
}
この変更は、コメントにある// See golang.org/issue/8267.
が示すように、GoのIssue 8267に関連しています。このIssueでは、Cgoを介した構造体のパディングやアライメントの問題、あるいは特定のコンパイラや環境での互換性の問題が議論されていました。C言語の構造体を直接Goの型にマッピングすると、GoのメモリレイアウトとCのメモリレイアウトの差異によって予期せぬ問題が発生する可能性があります。
この変更により、Log2phys_t
はGoの型システム内で完全に制御されるようになり、Cgoに起因する潜在的な問題を回避し、より堅牢で移植性の高いコードになります。これは、Goのsyscall
パッケージがCgoへの依存を減らし、Goのネイティブな機能でOSインターフェースを表現しようとする傾向を示しています。
src/pkg/syscall/zerrors_darwin_amd64.go
および src/pkg/syscall/zsysnum_darwin_amd64.go
の変更
これらのファイルは、それぞれDarwinのエラーコードとシステムコール番号を定義する自動生成されたGoのソースファイルです。このコミットの核心は、これらのファイルがmacOS 10.9のカーネル情報に基づいて再生成されたことです。
-
zerrors_darwin_amd64.go
:AF_MAX
やIPV6_FRAGTTL
などの既存の定数の値が、macOS 10.9での変更に合わせて更新されています。これは、OSのAPIが進化し、一部の定数の意味や値が変わったことを反映しています。- 最も顕著なのは、
DLT_
で始まる多数のデータリンクタイプ定数、F_
で始まるファイル制御フラグ、NOTE_
で始まるkqueueノートフラグ、O_
で始まるファイルオープンフラグ、SYS_
で始まるシステムコール番号など、非常に多くの新しい定数が追加されている点です。これらの追加は、macOS 10.9で導入された新しいネットワークプロトコル、ファイルシステム機能、カーネルイベント通知、セキュリティ機能などに対応するために不可欠です。 ELAST
エラーコードの値が更新され、新しいエラーメッセージが追加されたことも、OSのエラー報告メカニズムの進化を示しています。
-
zsysnum_darwin_amd64.go
:SYS_CSOPS_AUDITTOKEN
,SYS_OPEN_DPROTECTED_NP
,SYS_LEDGER
など、macOS 10.9で導入された新しいシステムコールが追加されています。これらのシステムコールは、監査トークンの操作、保護されたファイルへのアクセス、システムリソースの台帳管理など、OSの新しい機能を提供します。SYS_MAXSYSCALL
の値が大幅に増加していることは、macOS 10.9で多くの新しいシステムコールが追加されたことを直接的に示しています。これにより、Goプログラムはこれらの新しいシステムコールを直接呼び出し、macOSの最新機能を活用できるようになります。
これらの自動生成ファイルの変更は、Goのsyscall
パッケージがmacOSの進化に追従し、Goアプリケーションが最新のOS機能と互換性を保ちながら動作できるようにするために不可欠なものです。これにより、Go開発者はmacOSの新しいAPIをGoのコードから安全かつ効率的に利用できるようになります。
関連リンク
- Go Change-Id:
I2222222222222222222222222222222222222222
(コミットメッセージに記載のhttps://golang.org/cl/102610045
に対応するGoのコードレビューシステムへのリンク) - Go Issue 8267:
syscall: darwin: Log2phys_t should be a Go struct
(types_darwin.go
の変更に関連するGoのIssue)
参考にした情報源リンク
- Go Issue 8267: syscall: darwin: Log2phys_t should be a Go struct
- OS X Mavericks (10.9) の新機能 (一般的な情報源として)
- Darwin Kernel Source Code (Goのz-files生成元となるカーネルヘッダーの一般的な情報源として)
- Go
syscall
package documentation (Goのsyscall
パッケージの一般的な情報源として) - Go
cmd/go/internal/modcmd/edit.go
(例として、go.mod
ファイルの編集に関するGoの内部コード) (Goの内部構造やツールに関する一般的な情報源として) - Go
src/pkg/syscall/mkerrors.sh
(スクリプトの具体的な内容確認のため) - Go
src/pkg/syscall/mksysnum_darwin.pl
(スクリプトの具体的な内容確認のため) - Go
src/pkg/syscall/types_darwin.go
(ファイルの具体的な内容確認のため) - Go
src/pkg/syscall/zerrors_darwin_amd64.go
(ファイルの具体的な内容確認のため) - Go
src/pkg/syscall/zsysnum_darwin_amd64.go
(ファイルの具体的な内容確認のため) - Go
api/except.txt
(GoのAPIチェッカーが無視するAPI変更のリスト) (ファイルの具体的な内容確認のため)
# [インデックス 19599] ファイルの概要
このコミットは、Go言語の`syscall`パッケージにおいて、Darwin (macOS) 環境向けのシステムコール関連ファイルを更新するものです。具体的には、macOS 10.7 (Lion) カーネルベースからmacOS 10.9 (Mavericks) カーネルベースへと、自動生成される「z-files」と呼ばれる定数やシステムコール番号の定義を刷新しています。これにより、GoプログラムがmacOS 10.9で導入された新しいシステム機能や定数を適切に利用できるようになります。
## コミット
commit fbd5ad585d03ee750b7d58a85cf0d40079b28833 Author: Mikio Hara mikioh.mikioh@gmail.com Date: Tue Jun 24 09:20:42 2014 +0900
syscall: regenerate z-files for darwin
Updates z-files from 10.7 kernel-based to 10.9 kernel-based.
LGTM=iant
R=golang-codereviews, bradfitz, iant
CC=golang-codereviews
https://golang.org/cl/102610045
## GitHub上でのコミットページへのリンク
[https://github.com/golang/go/commit/fbd5ad585d03ee750b7d58a85cf0d40079b28833](https://github.com/golang/go/commit/fbd5ad585d03ee750b7d58a85cf0d40079b28833)
## 元コミット内容
syscall: regenerate z-files for darwin
Updates z-files from 10.7 kernel-based to 10.9 kernel-based.
## 変更の背景
このコミットの主な背景は、Go言語の`syscall`パッケージがmacOSの新しいバージョンに対応する必要があったことです。Goの`syscall`パッケージは、Goプログラムがオペレーティングシステム(OS)の低レベルな機能、特にシステムコールを直接呼び出すためのインターフェースを提供します。OSのバージョンが上がると、新しいシステムコールが追加されたり、既存の定数や構造体の定義が変更されたりすることがよくあります。
このコミットが行われた2014年当時、macOSの主要なバージョンはOS X Mavericks (10.9) でした。Goの`syscall`パッケージがそれ以前のOS X Lion (10.7) のカーネル情報に基づいて生成された「z-files」を使用していたため、macOS 10.9で導入された新しいシステムコールや定数に対応できていませんでした。この不整合は、GoプログラムがmacOS 10.9の特定の機能を利用しようとした際に問題を引き起こす可能性がありました。
このコミットは、`syscall`パッケージがmacOS 10.9のカーネル情報に準拠するように、関連する自動生成ファイルを更新することを目的としています。これにより、GoプログラムはmacOSの最新のシステム機能とより良く連携できるようになり、互換性と機能性が向上します。
## 前提知識の解説
### Go言語の`syscall`パッケージ
Go言語の標準ライブラリに含まれる`syscall`パッケージは、Goプログラムがオペレーティングシステム(OS)のシステムコールを直接呼び出すための低レベルなインターフェースを提供します。通常、GoプログラムはOSの機能を利用する際に、`os`や`net`などの高レベルなパッケージを使用しますが、これらのパッケージの多くは内部的に`syscall`パッケージを利用しています。
`syscall`パッケージは、OS固有の定数(エラーコード、ファイルパーミッション、ソケットオプションなど)、システムコール番号、およびOSのデータ構造(例えば、ファイル統計情報やネットワークアドレス構造体)をGoの型として定義しています。これにより、GoプログラムはOSのネイティブなAPIと直接対話することが可能になります。
### 「z-files」とは
Goの`syscall`パッケージにおいて、「z-files」という用語は、OS固有の定数やシステムコール番号、構造体定義などを自動生成したGoソースファイルを指します。これらのファイルは、通常、OSのC言語ヘッダーファイルから、Perlスクリプトやシェルスクリプトなどのツールを使って生成されます。
例えば、`zerrors_darwin_amd64.go`のようなファイルは、macOSの`amd64`アーキテクチャ向けのエラーコードやその他の定数を定義しています。また、`zsysnum_darwin_amd64.go`は、macOSの`amd64`アーキテクチャ向けのシステムコール番号を定義しています。これらのファイルは手動で編集されることはほとんどなく、OSのバージョンアップに伴って内容が古くなった場合に、再生成されるのが一般的です。
「z-files」という命名は、これらのファイルが自動生成されたものであり、通常は直接編集しないことを示す慣習的なものです。
### Darwin/macOSカーネルバージョンとシステムコールの変化
DarwinはmacOSの基盤となるオープンソースのUNIX系オペレーティングシステムです。macOSの各バージョンは、特定のDarwinカーネルバージョンに基づいています。OSのバージョンが更新されると、カーネルレベルでの変更、新しいシステムコールの追加、既存のシステムコールの挙動変更、または一部の定数の値の変更などが発生します。
このコミットで言及されているOS X Lion (10.7) とOS X Mavericks (10.9) の間にも、システムレベルでの多くの変更がありました。例えば、新しいファイルシステム関連の機能、ネットワークスタックの改善、セキュリティ機能の強化などが行われ、それに伴い新しいシステムコールや定数が導入されました。Goの`syscall`パッケージがこれらの新しい機能と連携するためには、これらの変更を反映した「z-files」が必要となります。
### Cgo
Cgoは、GoプログラムがC言語のコードを呼び出したり、C言語のライブラリとリンクしたりするためのGoの機能です。`syscall`パッケージの一部では、OSのC言語ヘッダーファイルで定義されている複雑な構造体や、C言語で実装された特定のOS APIをGoから利用するためにCgoが使用されることがあります。
このコミットでは、`types_darwin.go`における`Log2phys_t`の定義変更がCgoに関連している可能性があります。Cgoを介してCの構造体を直接Goの型にマッピングする際に、OSのヘッダーファイルの変更や、GoのCgoの扱いの改善に伴い、よりGoらしい型定義に修正されることがあります。
## 技術的詳細
このコミットは、Goの`syscall`パッケージがmacOS 10.9 (Mavericks) のシステムインターフェースに適合するように、複数のファイルを横断的に変更しています。
1. **`api/except.txt`の更新**:
* このファイルは、GoのAPIチェッカーが特定のプラットフォームで無視すべきAPIの変更をリストアップするために使用されます。
* `darwin-386`および`darwin-amd64`アーキテクチャ向けに、`AF_MAX`, `ELAST`, `EVFILT_SYSCOUNT`, `EVFILT_THREADMARKER`, `IPV6_FRAGTTL`, `SYS_MAXSYSCALL`といった新しい定数が追加されています。これは、macOS 10.9でこれらの定数の値が変更されたか、新たに導入されたことを示唆しており、GoのAPIがこれらの新しい値を認識するように更新されたことを意味します。
2. **`src/pkg/syscall/mkerrors.sh`の変更**:
* このシェルスクリプトは、OSのエラーコードやその他の定数をGoのソースファイルとして生成するために使用されます。
* 変更点として、`F_MARKDEPENDENCY`, `F_READBOOTSTRAP`, `F_WRITEBOOTSTRAP`, `NOTE_RESOURCEEND`, `SO_RESTRICTIONS`など、OS X Mavericks以降でサポートされなくなった可能性のある定数を、互換性のために明示的に定義する`#ifndef`ブロックが追加されています。これは、古いOSバージョンとの互換性を維持しつつ、新しいOSバージョンに対応するための戦略です。
3. **`src/pkg/syscall/mksysnum_darwin.pl`の変更**:
* このPerlスクリプトは、macOSのシステムコール番号をGoのソースファイルとして生成するために使用されます。
* スクリプトは、Cヘッダーファイルからシステムコール番号をパースするだけでなく、OS X Mavericks以降で直接定義されていない可能性のある古いシステムコール(例: `SYS_PROFIL`, `SYS_ADD_PROFIL`, `SYS_ATSOCKET`など)を、互換性のために明示的に`%syscalls`ハッシュに追加するようになりました。これにより、Goの`syscall`パッケージがこれらの古いシステムコールも引き続きサポートできるようになります。
4. **`src/pkg/syscall/types_darwin.go`の変更**:
* このファイルは、Darwin固有のGoの型定義を含んでいます。
* `Log2phys_t`構造体の定義が`C.struct_log2phys`から、Goのネイティブな構造体定義に変更されました。
```go
//type Log2phys_t C.struct_packed_log2phys // コメントアウトされた古い定義
type Log2phys_t struct {
Flags uint32
Contigbytes int64
Devoffset int64
}
```
この変更は、`golang.org/issue/8267`で議論された問題に対応するためのものです。元のCgoベースの定義が特定の環境やコンパイラで問題を引き起こす可能性があったため、より堅牢なGoの構造体として再定義されました。これは、Cgoの利用を減らし、Goの型システム内でより直接的にデータ構造を扱うことで、コンパイル時の安定性やクロスコンパイルの容易さを向上させる狙いがあります。
5. **`src/pkg/syscall/zerrors_darwin_386.go` および `src/pkg/syscall/zerrors_darwin_amd64.go` の更新**:
* これらのファイルは、`mkerrors.sh`スクリプトによって自動生成される、Darwinのエラーコードやその他の定数を含むファイルです。
* `AF_MAX`の値が`0x26`から`0x28`に、`EVFILT_SYSCOUNT`と`EVFILT_THREADMARKER`が`0xc`から`0xe`に、`IPV6_FRAGTTL`が`0x78`から`0x3c`に変更されるなど、既存の定数の値が更新されています。
* `AF_UTUN`, `BIOCSETFNR`, `DLT_A429`から始まる多数の`DLT_`定数(データリンクタイプ)、`F_FINDSIGS`, `F_GETPROTECTIONLEVEL`, `F_SETLKWTIMEOUT`などの新しいファイル制御フラグ、`NOTE_BACKGROUND`, `NOTE_CRITICAL`などの新しいkqueueノートフラグ、`O_DP_GETRAWENCRYPTED`などの新しいファイルオープンフラグ、`RLIMIT_CPU_USAGE_MONITOR`などのリソース制限、`RTF_NOIFREF`, `RTF_PROXY`などのルーティングテーブルフラグ、`SIOCIFGCLONERS`などのソケットI/O制御コマンド、`TCP_KEEPCNT`, `TCP_KEEPINTVL`, `TCP_SENDMOREACKS`などのTCPオプションが大量に追加されています。
* `ELAST`エラーコードの値が`0x69`から`0x6a`に更新され、新しいエラーメッセージ`106: "interface output queue is full"`が追加されています。
* これらの変更は、macOS 10.9で導入された新しいネットワークプロトコル、ファイルシステム機能、カーネルイベント通知、システムリソース管理などに対応するために不可欠です。
6. **`src/pkg/syscall/zsysnum_darwin_386.go` および `src/pkg/syscall/zsysnum_darwin_amd64.go` の更新**:
* これらのファイルは、`mksysnum_darwin.pl`スクリプトによって自動生成される、Darwinのシステムコール番号を含むファイルです。
* `SYS_CSOPS_AUDITTOKEN`, `SYS_OPEN_DPROTECTED_NP`, `SYS_LEDGER`など、macOS 10.9で導入された新しいシステムコールが追加されています。
* 特に、`SYS_MAXSYSCALL`の値が`439`から`456`に増加しており、これは多くの新しいシステムコールが追加されたことを明確に示しています。追加されたシステムコールには、`SYS_KAS_INFO`, `SYS_MEMORYSTATUS_CONTROL`, `SYS_GUARDED_OPEN_NP`, `SYS_CONNECTX`, `SYS_TELEMETRY`などが含まれます。これらは、カーネル情報取得、メモリ管理、セキュリティ関連のファイル操作、ネットワーク接続、システム監視など、多岐にわたる新しいOS機能に対応するものです。
これらの変更は、Goの`syscall`パッケージがmacOSの進化に追従し、Goアプリケーションが最新のOS機能と互換性を保ちながら動作できるようにするために不可欠なメンテナンス作業です。
## コアとなるコードの変更箇所
このコミットにおけるコアとなるコードの変更は、主に自動生成される`zerrors_darwin_*.go`と`zsysnum_darwin_*.go`ファイルに現れていますが、それらを生成するスクリプトと、一部手動で定義されている`types_darwin.go`にも重要な変更があります。
### `src/pkg/syscall/mkerrors.sh`
```diff
--- a/src/pkg/syscall/mkerrors.sh
+++ b/src/pkg/syscall/mkerrors.sh
@@ -35,6 +35,36 @@ includes_Darwin='\
#include <netinet/ip.h>
#include <netinet/ip_mroute.h>
#include <termios.h>
+
+// We keep some constants not supported in OS X Mavericks and beyond
+// for the promise of compatibility.
+#ifndef F_MARKDEPENDENCY
+#define F_MARKDEPENDENCY 0x3c
+#endif
+#ifndef F_READBOOTSTRAP
+#define F_READBOOTSTRAP 0x2e
+#endif
+#ifndef F_WRITEBOOTSTRAP
+#define F_WRITEBOOTSTRAP 0x2f
+#endif
+#ifndef NOTE_RESOURCEEND
+#define NOTE_RESOURCEEND 0x2000000
+#endif
+#ifndef SO_RESTRICTIONS
+#define SO_RESTRICTIONS 0x1081
+#endif
+#ifndef SO_RESTRICT_DENYIN
+#define SO_RESTRICT_DENYIN 0x1
+#endif
+#ifndef SO_RESTRICT_DENYOUT
+#define SO_RESTRICT_DENYOUT 0x2
+#endif
+#ifndef SO_RESTRICT_DENYSET
+#define SO_RESTRICT_DENYSET 0x80000000
+#endif
+#ifndef TCP_MINMSSOVERLOAD
+#define TCP_MINMSSOVERLOAD 0x3e8
+#endif
'
includes_DragonFly='
src/pkg/syscall/mksysnum_darwin.pl
--- a/src/pkg/syscall/mksysnum_darwin.pl
+++ b/src/pkg/syscall/mksysnum_darwin.pl
@@ -18,15 +18,41 @@ package syscall
const (
EOF
+my %syscalls;
+
while(<>){
if(/^#define\s+SYS_(\w+)\\s+([0-9]+)/){
my $name = $1;
my $num = $2;
$name =~ y/a-z/A-Z/;
-\t\tprint "\tSYS_$name = $num;";
+\t\t$syscalls{"SYS_$name"} = "$num";
}\
}
+# We keep some constants not supported in OS X Mavericks and beyond
+# for the promise of compatibility.
+$syscalls{"SYS_PROFIL"} = 44;
+$syscalls{"SYS_ADD_PROFIL"} = 176;
+$syscalls{"SYS_ATSOCKET"} = 206;
+$syscalls{"SYS_ATGETMSG"} = 207;
+$syscalls{"SYS_ATPUTMSG"} = 208;
+$syscalls{"SYS_ATPSNDREQ"} = 209;
+$syscalls{"SYS_ATPSNDRSP"} = 210;
+$syscalls{"SYS_ATPGETREQ"} = 211;
+$syscalls{"SYS_ATPGETRSP"} = 212;
+$syscalls{"SYS_MKCOMPLEX"} = 216;
+$syscalls{"SYS_STATV"} = 217;
+$syscalls{"SYS_LSTATV"} = 218;
+$syscalls{"SYS_FSTATV"} = 219;
+$syscalls{"SYS_GETAUDIT"} = 355;
+$syscalls{"SYS_SETAUDIT"} = 356;
+$syscalls{"SYS_PID_HIBERNATE"} = 435;
+$syscalls{"SYS_PID_SHUTDOWN_SOCKETS"} = 436;
+
+for my $key (sort {$syscalls{$a} <=> $syscalls{$b} || $a cmp $b} keys %syscalls){
+ print "$key = $syscalls{$key};\\n";
+}
+
print <<EOF;
)
EOF
src/pkg/syscall/types_darwin.go
--- a/src/pkg/syscall/types_darwin.go
+++ b/src/pkg/syscall/types_darwin.go
@@ -64,7 +64,6 @@ struct sockaddr_any {
struct sockaddr addr;
char pad[sizeof(union sockaddr_all) - sizeof(struct sockaddr)];
};
--
*/
import "C"
@@ -117,7 +116,13 @@ type Radvisory_t C.struct_radvisory
type Fbootstraptransfer_t C.struct_fbootstraptransfer
-type Log2phys_t C.struct_log2phys
+// See golang.org/issue/8267.
+//type Log2phys_t C.struct_packed_log2phys
+type Log2phys_t struct {
+ Flags uint32
+ Contigbytes int64
+ Devoffset int64
+}
type Fsid C.struct_fsid
src/pkg/syscall/zerrors_darwin_amd64.go
(抜粋、386版も同様)
--- a/src/pkg/syscall/zerrors_darwin_amd64.go
+++ b/src/pkg/syscall/zerrors_darwin_amd64.go
@@ -28,7 +28,7 @@ const (
AF_LAT = 0xe
AF_LINK = 0x12
AF_LOCAL = 0x1
- AF_MAX = 0x26
+ AF_MAX = 0x28
AF_NATM = 0x1f
AF_NDRV = 0x1b
AF_NETBIOS = 0x21
@@ -43,6 +43,7 @@ const (
AF_SYSTEM = 0x20
AF_UNIX = 0x1
AF_UNSPEC = 0x0
+ AF_UTUN = 0x26
B0 = 0x0
B110 = 0x6e
B115200 = 0x1c200
... (多数のDLT_定数、F_定数、NOTE_定数、O_定数、RLIMIT_定数、RTF_定数、SIOC_定数、TCP_定数の追加・変更) ...
@@ -1170,7 +1331,7 @@ const (
EIO = Errno(0x5)
EISCONN = Errno(0x38)
EISDIR = Errno(0x15)
- ELAST = Errno(0x69)
+ ELAST = Errno(0x6a)
ELOOP = Errno(0x3e)
EMFILE = Errno(0x18)
EMLINK = Errno(0x1f)
@@ -1221,6 +1382,7 @@ const (
EPROTONOSUPPORT = Errno(0x2b)
EPROTOTYPE = Errno(0x29)
EPWROFF = Errno(0x52)
+ EQFULL = Errno(0x6a)
ERANGE = Errno(0x22)
EREMOTE = Errno(0x47)
EROFS = Errno(0x1e)
@@ -1383,6 +1545,7 @@ var errors = [...]string{
103: "policy not found",
104: "state not recoverable",
105: "previous owner died",
+ 106: "interface output queue is full",
}
// Signal table
src/pkg/syscall/zsysnum_darwin_amd64.go
(抜粋、386版も同様)
--- a/src/pkg/syscall/zsysnum_darwin_amd64.go
+++ b/src/pkg/syscall/zsysnum_darwin_amd64.go
@@ -118,6 +118,7 @@ const (
SYS_QUOTACTL = 165
SYS_MOUNT = 167
SYS_CSOPS = 169
+ SYS_CSOPS_AUDITTOKEN = 170
SYS_WAITID = 173
SYS_ADD_PROFIL = 176
SYS_KDEBUG_TRACE = 180
@@ -151,6 +152,7 @@ const (
SYS_ATPGETREQ = 211
SYS_ATPGETRSP = 212
SYS_MKCOMPLEX = 216
+ SYS_OPEN_DPROTECTED_NP = 216
SYS_STATV = 217
SYS_LSTATV = 218
SYS_FSTATV = 219
@@ -298,6 +300,7 @@ const (
SYS___OLD_SEMWAIT_SIGNAL = 370
SYS___OLD_SEMWAIT_SIGNAL_NOCANCEL = 371
SYS_THREAD_SELFID = 372
+ SYS_LEDGER = 373
SYS___MAC_EXECVE = 380
SYS___MAC_SYSCALL = 381
SYS___MAC_GET_FILE = 382
@@ -356,5 +359,21 @@ const (
SYS_PID_HIBERNATE = 435
SYS_PID_SHUTDOWN_SOCKETS = 436
SYS_SHARED_REGION_MAP_AND_SLIDE_NP = 438
-\tSYS_MAXSYSCALL = 439
+\tSYS_KAS_INFO = 439
+\tSYS_MEMORYSTATUS_CONTROL = 440
+\tSYS_GUARDED_OPEN_NP = 441
+\tSYS_GUARDED_CLOSE_NP = 442
+\tSYS_GUARDED_KQUEUE_NP = 443
+\tSYS_CHANGE_FDGUARD_NP = 444
+\tSYS_PROC_RLIMIT_CONTROL = 446
+\tSYS_CONNECTX = 447
+\tSYS_DISCONNECTX = 448
+\tSYS_PEELOFF = 449
+\tSYS_SOCKET_DELEGATE = 450
+\tSYS_TELEMETRY = 451
+\tSYS_PROC_UUID_POLICY = 452
+\tSYS_MEMORYSTATUS_GET_LEVEL = 453
+\tSYS_SYSTEM_OVERRIDE = 454
+\tSYS_VFS_PURGE = 455
+\tSYS_MAXSYSCALL = 456
)
コアとなるコードの解説
src/pkg/syscall/mkerrors.sh
の変更
このスクリプトは、Goのsyscall
パッケージが利用するOS固有の定数を生成する役割を担っています。追加された#ifndef
ブロックは、OS X Mavericks (10.9) 以降のバージョンで、以前のバージョン(例えば10.7)に存在した特定の定数が削除されたり、定義方法が変わったりした場合に備えるためのものです。
具体的には、F_MARKDEPENDENCY
やSO_RESTRICTIONS
などの定数が、新しいOSバージョンでは標準のヘッダーファイルに含まれていない可能性があります。しかし、Goのsyscall
パッケージがこれらの定数を参照するコードを持っている場合、コンパイルエラーを避けるために、スクリプトがこれらの定数を明示的に定義します。これにより、Goのsyscall
パッケージは、古いOSバージョンと新しいOSバージョンの両方で互換性を保ちながら動作できるようになります。これは、Goが異なるOSバージョン間でのバイナリ互換性を維持しようとする努力の一環です。
src/pkg/syscall/mksysnum_darwin.pl
の変更
このPerlスクリプトは、macOSのシステムコール番号をGoのコードに変換するために使用されます。変更前は、Cヘッダーファイルから直接システムコール番号を読み取って出力していましたが、変更後は一度%syscalls
というハッシュに格納するようになりました。
最も重要な変更点は、# We keep some constants not supported in OS X Mavericks and beyond for the promise of compatibility.
というコメントの下に追加された行です。これは、OS X Mavericks以降のヘッダーファイルには直接定義されていないが、Goのsyscall
パッケージが引き続きサポートする必要がある古いシステムコールを、明示的に%syscalls
ハッシュに追加していることを意味します。例えば、SYS_PROFIL
やSYS_ATSOCKET
などがこれに該当します。
最後に、for my $key (sort ...)
ループが追加され、%syscalls
ハッシュに格納されたシステムコールが、番号順にソートされてからGoのコードとして出力されるようになりました。これにより、生成されるGoコードの可読性が向上し、また、システムコール番号の重複や欠落がないかを確認しやすくなります。この変更は、Goのsyscall
パッケージが、OSのバージョンアップによって廃止されたり変更されたりしたシステムコールに対しても、後方互換性を提供するための重要なメカニズムです。
src/pkg/syscall/types_darwin.go
の変更
このファイルは、Goのsyscall
パッケージが利用するDarwin固有のGoの型定義を含んでいます。Log2phys_t
構造体の定義が変更されています。
変更前はtype Log2phys_t C.struct_log2phys
のようにCgoを使ってC言語の構造体を直接Goの型にマッピングしていました。しかし、変更後はLog2phys_t
がGoのネイティブな構造体として明示的に定義されています。
type Log2phys_t struct {
Flags uint32
Contigbytes int64
Devoffset int64
}
この変更は、コメントにある// See golang.org/issue/8267.
が示すように、GoのIssue 8267に関連しています。このIssueでは、Cgoを介した構造体のパディングやアライメントの問題、あるいは特定のコンパイラや環境での互換性の問題が議論されていました。C言語の構造体を直接Goの型にマッピングすると、GoのメモリレイアウトとCのメモリレイアウトの差異によって予期せぬ問題が発生する可能性があります。
この変更により、Log2phys_t
はGoの型システム内で完全に制御されるようになり、Cgoに起因する潜在的な問題を回避し、より堅牢で移植性の高いコードになります。これは、Goのsyscall
パッケージがCgoへの依存を減らし、Goのネイティブな機能でOSインターフェースを表現しようとする傾向を示しています。
src/pkg/syscall/zerrors_darwin_amd64.go
および src/pkg/syscall/zsysnum_darwin_amd64.go
の変更
これらのファイルは、それぞれDarwinのエラーコードとシステムコール番号を定義する自動生成されたGoのソースファイルです。このコミットの核心は、これらのファイルがmacOS 10.9のカーネル情報に基づいて再生成されたことです。
-
zerrors_darwin_amd64.go
:AF_MAX
やIPV6_FRAGTTL
などの既存の定数の値が、macOS 10.9での変更に合わせて更新されています。これは、OSのAPIが進化し、一部の定数の意味や値が変わったことを反映しています。- 最も顕著なのは、
DLT_
で始まる多数のデータリンクタイプ定数、F_
で始まるファイル制御フラグ、NOTE_
で始まるkqueueノートフラグ、O_
で始まるファイルオープンフラグ、SYS_
で始まるシステムコール番号など、非常に多くの新しい定数が追加されている点です。これらの追加は、macOS 10.9で導入された新しいネットワークプロトコル、ファイルシステム機能、カーネルイベント通知、セキュリティ機能などに対応するために不可欠です。 ELAST
エラーコードの値が更新され、新しいエラーメッセージが追加されたことも、OSのエラー報告メカニズムの進化を示しています。
-
zsysnum_darwin_amd64.go
:SYS_CSOPS_AUDITTOKEN
,SYS_OPEN_DPROTECTED_NP
,SYS_LEDGER
など、macOS 10.9で導入された新しいシステムコールが追加されています。これらのシステムコールは、監査トークンの操作、保護されたファイルへのアクセス、システムリソースの台帳管理など、OSの新しい機能を提供します。SYS_MAXSYSCALL
の値が大幅に増加していることは、macOS 10.9で多くの新しいシステムコールが追加されたことを直接的に示しています。これにより、Goプログラムはこれらの新しいシステムコールを直接呼び出し、macOSの最新機能を活用できるようになります。
これらの自動生成ファイルの変更は、Goのsyscall
パッケージがmacOSの進化に追従し、Goアプリケーションが最新のOS機能と互換性を保ちながら動作できるようにするために不可欠なものです。これにより、Go開発者はmacOSの新しいAPIをGoのコードから安全かつ効率的に利用できるようになります。
関連リンク
- Go Change-Id:
I2222222222222222222222222222222222222222
(コミットメッセージに記載のhttps://golang.org/cl/102610045
に対応するGoのコードレビューシステムへのリンク) - Go Issue 8267:
syscall: darwin: Log2phys_t should be a Go struct
(types_darwin.go
の変更に関連するGoのIssue)
参考にした情報源リンク
- Go Issue 8267: syscall: darwin: Log2phys_t should be a Go struct
- OS X Mavericks (10.9) の新機能 (一般的な情報源として)
- Darwin Kernel Source Code (Goのz-files生成元となるカーネルヘッダーの一般的な情報源として)
- Go
syscall
package documentation (Goのsyscall
パッケージの一般的な情報源として) - Go
cmd/go/internal/modcmd/edit.go
(例として、go.mod
ファイルの編集に関するGoの内部コード) (Goの内部構造やツールに関する一般的な情報源として) - Go
src/pkg/syscall/mkerrors.sh
(スクリプトの具体的な内容確認のため) - Go
src/pkg/syscall/mksysnum_darwin.pl
(スクリプトの具体的な内容確認のため) - Go
src/pkg/syscall/types_darwin.go
(ファイルの具体的な内容確認のため) - Go
src/pkg/syscall/zerrors_darwin_amd64.go
(ファイルの具体的な内容確認のため) - Go
src/pkg/syscall/zsysnum_darwin_amd64.go
(ファイルの具体的な内容確認のため) - Go
api/except.txt
(GoのAPIチェッカーが無視するAPI変更のリスト) (ファイルの具体的な内容確認のため)