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

[インデックス 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の機能を利用する際に、osnetなどの高レベルなパッケージを使用しますが、これらのパッケージの多くは内部的に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のネイティブな構造体定義に変更されました。
      //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_SYSCOUNTEVFILT_THREADMARKER0xcから0xeに、IPV6_FRAGTTL0x78から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_*.gozsysnum_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_MARKDEPENDENCYSO_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_PROFILSYS_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_MAXIPV6_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)

参考にした情報源リンク

# [インデックス 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_MARKDEPENDENCYSO_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_PROFILSYS_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_MAXIPV6_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)

参考にした情報源リンク