[インデックス 164] ファイルの概要
このコミットは、Go言語プロジェクトに6dbという新しいデバッガを追加するものです。6dbは、AMD64アーキテクチャ向けのデバッガであり、Plan 9およびInferno OSのlibmachユーティリティから移植されたコードをベースにしています。この追加により、Go言語の初期開発段階において、AMD64バイナリのデバッグ機能が提供されることになります。
コミット
commit ed5e39a66dedbb21d6a48fe1a9885d4737292636
Author: Rob Pike <r@golang.org>
Date: Thu Jun 12 14:50:25 2008 -0700
Add 6db
SVN=122505
GitHub上でのコミットページへのリンク
https://github.com/golang/go/commit/ed5e39a66dedbb21d6a48fe1a9885d4737292636
元コミット内容
コミットメッセージは非常に簡潔で、「Add 6db」とだけ記されています。これは、6dbというツールがGoプロジェクトに追加されたことを示しています。SVN=122505は、このコミットがSubversionリポジトリからの移行の一部であることを示唆しています。
変更の背景
このコミットが行われた2008年6月は、Go言語がまだ一般に公開される前の初期開発段階にありました。Go言語は、Rob Pike、Ken Thompson、Robert Griesemerといった著名なコンピュータ科学者によってGoogleで開発が開始されました。彼らは、既存のプログラミング言語の欠点(コンパイル時間の長さ、依存関係の管理の複雑さ、実行時の効率性など)を解決することを目指していました。
デバッガは、ソフトウェア開発において不可欠なツールです。プログラムの実行フローを追跡し、変数の値を検査し、バグを特定するために使用されます。Go言語のような新しい言語とランタイムを開発する際には、その言語で書かれたプログラムを効率的にデバッグできるツールが早期に必要となります。
このコミットで追加された6dbは、Go言語の初期のツールチェインの一部として、AMD64アーキテクチャ上でGoプログラムをデバッグするための基盤を提供することを目的としています。特に、Plan 9やInferno OSの経験を持つ開発者(Rob Pikeを含む)がGo言語の開発に携わっていたため、これらのOSで培われたデバッグツールの設計思想やコードがGoプロジェクトに持ち込まれたと考えられます。libmachは、Plan 9およびInferno OSにおける機械依存のデバッグユーティリティを提供するライブラリであり、そのコードを再利用することで、Go言語のデバッガ開発を加速させることができたと推測されます。
前提知識の解説
このコミットを理解するためには、以下の概念に関する知識が役立ちます。
- Plan 9 from Bell Labs / Inferno OS:
- Bell Labsで開発された分散オペレーティングシステム。Unixの設計思想をさらに推し進め、すべてをファイルとして扱うという原則を徹底しています。
- Inferno OSはPlan 9の技術を基にしたポータブルなオペレーティングシステムで、仮想マシン上で動作し、分散アプリケーション開発に特化しています。
- これらのOSでは、ツールチェインの各コンポーネント(コンパイラ、アセンブラ、リンカ、デバッガなど)が特定のアーキテクチャを示す数字と文字の組み合わせで命名される慣習がありました(例:
8cはx86 Cコンパイラ、6cはAMD64 Cコンパイラ)。6dbもこの命名規則に従っています。
libmach:- Plan 9およびInferno OSのデバッグユーティリティ群で利用されるライブラリ。機械語レベルでのプログラムの検査、メモリマップの管理、シンボルテーブルの解析、レジスタの読み書き、逆アセンブルなどの機能を提供します。
- 異なるCPUアーキテクチャ(x86, AMD64, ARMなど)に対応するために、アーキテクチャ固有のコードが含まれています。
- デバッガの基本原理:
- ブレークポイント: プログラムの特定の場所で実行を一時停止させる機能。
- ステップ実行: プログラムを1行ずつ、または1命令ずつ実行する機能。
- レジスタ/メモリ検査: CPUレジスタやメモリ上の変数の値を表示・変更する機能。
- シンボルテーブル: プログラム内の変数名、関数名、行番号などの情報と、それらがメモリ上で対応するアドレスをマッピングするデータ構造。デバッガはこれを利用して、人間が理解しやすい形で情報を提供します。
- 逆アセンブル: 機械語コードをアセンブリ言語に変換して表示する機能。
- AMD64アーキテクチャ:
- Intel 64(旧称EM64T)やAMD64として知られる64ビット命令セットアーキテクチャ。x86アーキテクチャの64ビット拡張であり、より多くのレジスタとより大きなメモリ空間を扱えます。
- a.out形式:
- Unix系システムでかつて広く使われていた実行可能ファイル、オブジェクトファイル、共有ライブラリのフォーマット。Go言語の初期段階では、この形式やそれに類似した形式が内部的に利用されていた可能性があります。
diff --git a/... b/...:- Gitの差分表示形式。
new file mode 100644は新しいファイルが追加されたことを示し、index 0000000000..は以前のバージョンが存在しないことを意味します。
- Gitの差分表示形式。
技術的詳細
このコミットは、src/libmachamd64ディレクトリ以下に大量の新しいファイルを追加しており、これらはAMD64アーキテクチャ向けのlibmachの実装を構成しています。主要なファイルとその役割は以下の通りです。
include/bootexec.h: 実行可能ファイルのヘッダ構造を定義しています。MIPS、SPARC、NeXT、i386などの様々なアーキテクチャ固有の実行可能ファイルフォーマットの構造体が含まれています。これは、デバッガが異なる形式のバイナリを解析するために必要です。include/mach_amd64.h: AMD64アーキテクチャに特化した機械依存の定義が含まれています。Exec構造体(a.out形式のヘッダ情報)、Sym構造体(シンボル情報)、Map構造体(メモリセグメントのマッピング)、Reglist構造体(レジスタ情報)、Mach構造体(機械固有のパラメータ)、Machdata構造体(デバッガサービス関数のジャンプテーブル)などが定義されています。特に、_MAGICマクロは、異なるアーキテクチャの実行可能ファイルを識別するためのマジックナンバーを定義しており、S_MAGICがAMD64用です。include/ureg_amd64.h/include/ureg_x86.h: それぞれAMD64とx86のユーザーレジスタ(Ureg構造体)の定義が含まれています。デバッガがプロセスのレジスタ状態を読み取るために使用します。src/libmachamd64/6.c: AMD64アーキテクチャのレジスタリスト(amd64reglist)と、機械固有のパラメータ(mamd64)を定義しています。これには、レジスタのオフセット、サイズ、PC/SPレジスタの名前、ページサイズ、カーネルベースアドレスなどが含まれます。src/libmachamd64/6obj.c: AMD64オブジェクトファイルの識別と解析を行うコードが含まれています。_is6関数はファイルがAMD64オブジェクトファイルであるかを識別し、_read6関数はオブジェクトファイルからプログラム(Prog)情報を読み取ります。これは、シンボル情報やコード/データセクションの情報を抽出するために使用されます。src/libmachamd64/8.c: i386(x86)アーキテクチャのレジスタリスト(i386reglist)と機械固有のパラメータ(mi386)を定義しています。これは、6dbがi386バイナリも扱う可能性があるか、あるいはコードベースがi386とAMD64で共有されていることを示唆しています。src/libmachamd64/8db.c: このコミットで最も大きなファイルであり、i386/AMD64アーキテクチャ向けのデバッガの主要なロジックと逆アセンブラのテーブルが含まれています。i386mach構造体は、ブレークポイント命令、バイトオーダー変換関数、Cトレースバック、フレームファインダー、例外ハンドラ、浮動小数点数プリンタ、命令の逆アセンブル関数など、デバッガの機械依存サービスへのポインタを定義しています。i386excep関数は、発生した例外(トラップ)の種類を識別し、対応するエラーメッセージを返します。i386trace関数は、C言語のコールスタックをトレースする機能を提供します。i386frame関数は、特定の関数アドレスに対応するスタックフレームを見つけます。- 大量の
Optable構造体と配列(optab0F00,optab0F01,optab0FAE,optab0F,optab80,optab81など)は、i386/AMD64命令セットの逆アセンブルに必要なオペコードとオペランドの解析ルールを定義しています。これにより、機械語コードを人間が読めるアセンブリ命令に変換できます。
src/cmd/make.bash/src/make.bash: ビルドスクリプトが更新され、6dbがビルドプロセスに含まれるようになりました。これにより、Goプロジェクトのビルド時に6dbが自動的にコンパイルされ、インストールされるようになります。
これらのファイルは、Go言語の初期のランタイムとツールチェインが、既存の成熟したシステム(Plan 9/Inferno OS)のコンポーネントを再利用して構築されたことを明確に示しています。特に、libmachの移植は、デバッグ機能の迅速な実装に貢献したと考えられます。
コアとなるコードの変更箇所
このコミットは、主に新しいファイルの追加によって構成されています。
- 新規追加ファイル:
include/bootexec.hinclude/mach_amd64.hinclude/ureg_amd64.hinclude/ureg_x86.hsrc/libmachamd64/6.csrc/libmachamd64/6obj.csrc/libmachamd64/8.csrc/libmachamd64/8db.csrc/libmachamd64/Makefilesrc/libmachamd64/access.csrc/libmachamd64/elf.hsrc/libmachamd64/executable.csrc/libmachamd64/machdata.csrc/libmachamd64/map.csrc/libmachamd64/obj.csrc/libmachamd64/obj.hsrc/libmachamd64/setmach.csrc/libmachamd64/swap.csrc/libmachamd64/sym.c
- 変更されたファイル:
src/cmd/make.bash:db(おそらく6dbのビルドディレクトリ)のビルドとインストールを追加する行が追記されています。src/make.bash: 同様にdbのビルドとインストールが追加されています。
コアとなるコードの解説
このコミットの核心は、src/libmachamd64/8db.cにあります。このファイルは、AMD64およびi386アーキテクチャ向けのデバッガの逆アセンブル機能と、機械依存のデバッグサービスを提供します。
8db.cの主要な要素は以下の通りです。
-
Machdata i386mach構造体: これは、デバッガが特定のアーキテクチャ(ここではi386/AMD64)と対話するために必要な関数ポインタのテーブルです。bpinst: ブレークポイント命令(i386ではINT 3、つまり0xCC)。bpsize: ブレークポイント命令のサイズ。swab,swal,swav: バイトオーダー変換関数(リトルエンディアンからローカルバイトオーダーへ)。ctrace: C言語のコールスタックをトレースする関数。findframe: スタックフレームを見つける関数。excep: 例外(トラップ)を処理し、その名前を返す関数。sftos,dftos: 浮動小数点数を文字列に変換する関数。foll: 命令の次のアドレスを追跡する関数。inst: 命令を文字列として表示する関数。das: 記号的な逆アセンブルを行う関数。instlen: 命令の長さを計算する関数。
-
逆アセンブルテーブル (
Optable配列):optab0F,optab660F,optabF20F,optabF30F,optab80,optab81,optab83,optabC0,optabC1,optabD0,optabD1,optabD2,optabD3,optabD8など、多数のOptable構造体の配列が定義されています。Optable構造体は、オペランドのタイプ(operand[2])と、そのオペコードに対応するアセンブリ命令のフォーマット文字列(proto)を保持します。- これらのテーブルは、i386/AMD64の複雑な命令セットを解析し、対応するアセンブリニーモニックとオペランドを生成するために使用されます。例えば、
%eはMod R/Mバイトで指定される実効アドレス、%rはMod R/Mバイトで指定されるレジスタ、%iは即値オペランドなどを表します。 - これらのテーブルは、命令のプレフィックス(例:
0x0Fは2バイト命令の開始、0x66はオペランドサイズオーバーライド)やMod R/Mバイト、SIBバイトなどを考慮して、正しい命令を特定し、そのオペランドを解釈するように設計されています。
このコードは、Go言語のデバッガがAMD64バイナリを理解し、デバッグセッション中にレジスタ、メモリ、スタック、そして最も重要な命令レベルでの実行を検査できるようにするための基盤を提供します。
関連リンク
- Go言語の初期開発に関する情報: https://go.dev/doc/history
- Plan 9 from Bell Labs: https://9p.io/plan9/
- Inferno OS: https://www.vitanuova.com/inferno/
libmachのInferno OSソースコード(参照元): http://code.google.com/p/inferno-os/source/browse/utils/libmach/
参考にした情報源リンク
- Go言語の公式ドキュメント
- Plan 9 from Bell Labsのドキュメント
- Inferno OSのソースコードとドキュメント
- x86/AMD64命令セットリファレンス
- Gitのコミット履歴と差分表示
- Rob Pikeの公開された著作や講演
- Stack Overflowや技術ブログなど、関連する技術コミュニティの議論
6dbに関するGo言語のIssueや変更履歴(もしあれば)libmachの機能に関する一般的な情報# [インデックス 164] ファイルの概要
このコミットは、Go言語プロジェクトに6dbという新しいデバッガを追加するものです。6dbは、AMD64アーキテクチャ向けのデバッガであり、Plan 9およびInferno OSのlibmachユーティリティから移植されたコードをベースにしています。この追加により、Go言語の初期開発段階において、AMD64バイナリのデバッグ機能が提供されることになります。
コミット
commit ed5e39a66dedbb21d6a48fe1a9885d4737292636
Author: Rob Pike <r@golang.org>
Date: Thu Jun 12 14:50:25 2008 -0700
Add 6db
SVN=122505
GitHub上でのコミットページへのリンク
https://github.com/golang/go/commit/ed5e39a66dedbb21d6a48fe1a9885d4737292636
元コミット内容
コミットメッセージは非常に簡潔で、「Add 6db」とだけ記されています。これは、6dbというツールがGoプロジェクトに追加されたことを示しています。SVN=122505は、このコミットがSubversionリポジトリからの移行の一部であることを示唆しています。
変更の背景
このコミットが行われた2008年6月は、Go言語がまだ一般に公開される前の初期開発段階にありました。Go言語は、Rob Pike、Ken Thompson、Robert Griesemerといった著名なコンピュータ科学者によってGoogleで開発が開始されました。彼らは、既存のプログラミング言語の欠点(コンパイル時間の長さ、依存関係の管理の複雑さ、実行時の効率性など)を解決することを目指していました。
デバッガは、ソフトウェア開発において不可欠なツールです。プログラムの実行フローを追跡し、変数の値を検査し、バグを特定するために使用されます。Go言語のような新しい言語とランタイムを開発する際には、その言語で書かれたプログラムを効率的にデバッグできるツールが早期に必要となります。
このコミットで追加された6dbは、Go言語の初期のツールチェインの一部として、AMD64アーキテクチャ上でGoプログラムをデバッグするための基盤を提供することを目的としています。特に、Plan 9やInferno OSの経験を持つ開発者(Rob Pikeを含む)がGo言語の開発に携わっていたため、これらのOSで培われたデバッグツールの設計思想やコードがGoプロジェクトに持ち込まれたと考えられます。libmachは、Plan 9およびInferno OSにおける機械依存のデバッグユーティリティを提供するライブラリであり、そのコードを再利用することで、Go言語のデバッガ開発を加速させることができたと推測されます。
前提知識の解説
このコミットを理解するためには、以下の概念に関する知識が役立ちます。
- Plan 9 from Bell Labs / Inferno OS:
- Bell Labsで開発された分散オペレーティングシステム。Unixの設計思想をさらに推し進め、すべてをファイルとして扱うという原則を徹底しています。
- Inferno OSはPlan 9の技術を基にしたポータブルなオペレーティングシステムで、仮想マシン上で動作し、分散アプリケーション開発に特化しています。
- これらのOSでは、ツールチェインの各コンポーネント(コンパイラ、アセンブラ、リンカ、デバッガなど)が特定のアーキテクチャを示す数字と文字の組み合わせで命名される慣習がありました(例:
8cはx86 Cコンパイラ、6cはAMD64 Cコンパイラ)。6dbもこの命名規則に従っています。
libmach:- Plan 9およびInferno OSのデバッグユーティリティ群で利用されるライブラリ。機械語レベルでのプログラムの検査、メモリマップの管理、シンボルテーブルの解析、レジスタの読み書き、逆アセンブルなどの機能を提供します。
- 異なるCPUアーキテクチャ(x86, AMD64, ARMなど)に対応するために、アーキテクチャ固有のコードが含まれています。
- デバッガの基本原理:
- ブレークポイント: プログラムの特定の場所で実行を一時停止させる機能。
- ステップ実行: プログラムを1行ずつ、または1命令ずつ実行する機能。
- レジスタ/メモリ検査: CPUレジスタやメモリ上の変数の値を表示・変更する機能。
- シンボルテーブル: プログラム内の変数名、関数名、行番号などの情報と、それらがメモリ上で対応するアドレスをマッピングするデータ構造。デバッガはこれを利用して、人間が理解しやすい形で情報を提供します。
- 逆アセンブル: 機械語コードをアセンブリ言語に変換して表示する機能。
- AMD64アーキテクチャ:
- Intel 64(旧称EM64T)やAMD64として知られる64ビット命令セットアーキテクチャ。x86アーキテクチャの64ビット拡張であり、より多くのレジスタとより大きなメモリ空間を扱えます。
- a.out形式:
- Unix系システムでかつて広く使われていた実行可能ファイル、オブジェクトファイル、共有ライブラリのフォーマット。Go言語の初期段階では、この形式やそれに類似した形式が内部的に利用されていた可能性があります。
diff --git a/... b/...:- Gitの差分表示形式。
new file mode 100644は新しいファイルが追加されたことを示し、index 0000000000..は以前のバージョンが存在しないことを意味します。
- Gitの差分表示形式。
技術的詳細
このコミットは、src/libmachamd64ディレクトリ以下に大量の新しいファイルを追加しており、これらはAMD64アーキテクチャ向けのlibmachの実装を構成しています。主要なファイルとその役割は以下の通りです。
include/bootexec.h: 実行可能ファイルのヘッダ構造を定義しています。MIPS、SPARC、NeXT、i386などの様々なアーキテクチャ固有の実行可能ファイルフォーマットの構造体が含まれています。これは、デバッガが異なる形式のバイナリを解析するために必要です。include/mach_amd64.h: AMD64アーキテクチャに特化した機械依存の定義が含まれています。Exec構造体(a.out形式のヘッダ情報)、Sym構造体(シンボル情報)、Map構造体(メモリセグメントのマッピング)、Reglist構造体(レジスタ情報)、Mach構造体(機械固有のパラメータ)、Machdata構造体(デバッガサービス関数のジャンプテーブル)などが定義されています。特に、_MAGICマクロは、異なるアーキテクチャの実行可能ファイルを識別するためのマジックナンバーを定義しており、S_MAGICがAMD64用です。include/ureg_amd64.h/include/ureg_x86.h: それぞれAMD64とx86のユーザーレジスタ(Ureg構造体)の定義が含まれています。デバッガがプロセスのレジスタ状態を読み取るために使用します。src/libmachamd64/6.c: AMD64アーキテクチャのレジスタリスト(amd64reglist)と、機械固有のパラメータ(mamd64)を定義しています。これには、レジスタのオフセット、サイズ、PC/SPレジスタの名前、ページサイズ、カーネルベースアドレスなどが含まれます。src/libmachamd64/6obj.c: AMD64オブジェクトファイルの識別と解析を行うコードが含まれています。_is6関数はファイルがAMD64オブジェクトファイルであるかを識別し、_read6関数はオブジェクトファイルからプログラム(Prog)情報を読み取ります。これは、シンボル情報やコード/データセクションの情報を抽出するために使用されます。src/libmachamd64/8.c: i386(x86)アーキテクチャのレジスタリスト(i386reglist)と機械固有のパラメータ(mi386)を定義しています。これは、6dbがi386バイナリも扱う可能性があるか、あるいはコードベースがi386とAMD64で共有されていることを示唆しています。src/libmachamd64/8db.c: このコミットで最も大きなファイルであり、i386/AMD64アーキテクチャ向けのデバッガの主要なロジックと逆アセンブラのテーブルが含まれています。i386mach構造体は、ブレークポイント命令、バイトオーダー変換関数、Cトレースバック、フレームファインダー、例外ハンドラ、浮動小数点数プリンタ、命令の逆アセンブル関数など、デバッガの機械依存サービスへのポインタを定義しています。i386excep関数は、発生した例外(トラップ)の種類を識別し、対応するエラーメッセージを返します。i386trace関数は、C言語のコールスタックをトレースする機能を提供します。i386frame関数は、特定の関数アドレスに対応するスタックフレームを見つけます。- 大量の
Optable構造体と配列(optab0F00,optab0F01,optab0FAE,optab0F,optab80,optab81,optab83,optabC0,optabC1,optabD0,optabD1,optabD2,optabD3,optabD8など)は、i386/AMD64命令セットの逆アセンブルに必要なオペコードとオペランドの解析ルールを定義しています。これにより、機械語コードを人間が読めるアセンブリ命令に変換できます。
src/cmd/make.bash/src/make.bash: ビルドスクリプトが更新され、6dbがビルドプロセスに含まれるようになりました。これにより、Goプロジェクトのビルド時に6dbが自動的にコンパイルされ、インストールされるようになります。
これらのファイルは、Go言語の初期のランタイムとツールチェインが、既存の成熟したシステム(Plan 9/Inferno OS)のコンポーネントを再利用して構築されたことを明確に示しています。特に、libmachの移植は、デバッグ機能の迅速な実装に貢献したと考えられます。
コアとなるコードの変更箇所
このコミットは、主に新しいファイルの追加によって構成されています。
- 新規追加ファイル:
include/bootexec.hinclude/mach_amd64.hinclude/ureg_amd64.hinclude/ureg_x86.hsrc/libmachamd64/6.csrc/libmachamd64/6obj.csrc/libmachamd64/8.csrc/libmachamd64/8db.csrc/libmachamd64/Makefilesrc/libmachamd64/access.csrc/libmachamd64/elf.hsrc/libmachamd64/executable.csrc/libmachamd64/machdata.csrc/libmachamd64/map.csrc/libmachamd64/obj.csrc/libmachamd64/obj.hsrc/libmachamd64/setmach.csrc/libmachamd64/swap.csrc/libmachamd64/sym.c
- 変更されたファイル:
src/cmd/make.bash:db(おそらく6dbのビルドディレクトリ)のビルドとインストールを追加する行が追記されています。src/make.bash: 同様にdbのビルドとインストールが追加されています。
コアとなるコードの解説
このコミットの核心は、src/libmachamd64/8db.cにあります。このファイルは、AMD64およびi386アーキテクチャ向けのデバッガの逆アセンブル機能と、機械依存のデバッグサービスを提供します。
8db.cの主要な要素は以下の通りです。
-
Machdata i386mach構造体: これは、デバッガが特定のアーキテクチャ(ここではi386/AMD64)と対話するために必要な関数ポインタのテーブルです。bpinst: ブレークポイント命令(i386ではINT 3、つまり0xCC)。bpsize: ブレークポイント命令のサイズ。swab,swal,swav: バイトオーダー変換関数(リトルエンディアンからローカルバイトオーダーへ)。ctrace: C言語のコールスタックをトレースする関数。findframe: スタックフレームを見つける関数。excep: 例外(トラップ)を処理し、その名前を返す関数。sftos,dftos: 浮動小数点数を文字列に変換する関数。foll: 命令の次のアドレスを追跡する関数。inst: 命令を文字列として表示する関数。das: 記号的な逆アセンブルを行う関数。instlen: 命令の長さを計算する関数。
-
逆アセンブルテーブル (
Optable配列):optab0F,optab660F,optabF20F,optabF30F,optab80,optab81,optab83,optabC0,optabC1,optabD0,optabD1,optabD2,optabD3,optabD8など、多数のOptable構造体の配列が定義されています。Optable構造体は、オペランドのタイプ(operand[2])と、そのオペコードに対応するアセンブリ命令のフォーマット文字列(proto)を保持します。- これらのテーブルは、i386/AMD64の複雑な命令セットを解析し、対応するアセンブリニーモニックとオペランドを生成するために使用されます。例えば、
%eはMod R/Mバイトで指定される実効アドレス、%rはMod R/Mバイトで指定されるレジスタ、%iは即値オペランドなどを表します。 - これらのテーブルは、命令のプレフィックス(例:
0x0Fは2バイト命令の開始、0x66はオペランドサイズオーバーライド)やMod R/Mバイト、SIBバイトなどを考慮して、正しい命令を特定し、そのオペランドを解釈するように設計されています。
このコードは、Go言語のデバッガがAMD64バイナリを理解し、デバッグセッション中にレジスタ、メモリ、スタック、そして最も重要な命令レベルでの実行を検査できるようにするための基盤を提供します。
関連リンク
- Go言語の初期開発に関する情報: https://go.dev/doc/history
- Plan 9 from Bell Labs: https://9p.io/plan9/
- Inferno OS: https://www.vitanuova.com/inferno/
libmachのInferno OSソースコード(参照元): http://code.google.com/p/inferno-os/source/browse/utils/libmach/
参考にした情報源リンク
- Go言語の公式ドキュメント
- Plan 9 from Bell Labsのドキュメント
- Inferno OSのソースコードとドキュメント
- x86/AMD64命令セットリファレンス
- Gitのコミット履歴と差分表示
- Rob Pikeの公開された著作や講演
- Stack Overflowや技術ブログなど、関連する技術コミュニティの議論
6dbに関するGo言語のIssueや変更履歴(もしあれば)libmachの機能に関する一般的な情報