[インデックス 10053] ファイルの概要
本コミットは、Go言語の標準ライブラリにおけるARMアーキテクチャ用のLinuxシステムコール型定義ファイルを更新し、ターミナル制御機能に関する定数と構造体を追加したものです。
コミット
- コミットハッシュ:
ec80beb9f032d3368f723dd9ef3fd5f942b18dd2
- 作成者: Dave Cheney (dave@cheney.net)
- 日時: 2011年10月19日 07:38:32 -0700
- メッセージ: "syscall: update ztypes_linux_arm for terminal changes"
- 詳細: "regenerated on a debian sid arm5 host."
- レビュー: R=bradfitz, iant CC=golang-dev
GitHub上でのコミットページへのリンク
https://github.com/golang/go/commit/ec80beb9f032d3368f723dd9ef3fd5f942b18dd2
元コミット内容
syscall: update ztypes_linux_arm for terminal changes
regenerated on a debian sid arm5 host.
R=bradfitz, iant
CC=golang-dev
https://golang.org/cl/5298046
このコミットは、src/pkg/syscall/ztypes_linux_arm.go
ファイルに111行の追加を行い、1つのファイルが変更されました。変更内容は主に以下の2つのカテゴリに分類されます:
- ターミナル制御定数の追加 - 99個の新しい定数
- Termios構造体の追加 - 12行の新しい型定義
変更の背景
2011年のGoランタイムプロジェクトにおいて、ARMアーキテクチャ上でのターミナル制御機能の完全性を確保するため、このアップデートが必要となりました。当時のDebian sid ARM5ホスト上でファイルが再生成されており、ARM固有のターミナル制御機能をサポートするために必要なシステムコール定義が不足していたことが背景にあります。
特に、このアップデートは以下の要因によるものです:
- ARM環境でのターミナル制御機能の需要増加
- POSIXターミナル制御API(termios)の完全サポート
- クロスプラットフォーム対応の強化
- システムコール定義の一貫性確保
前提知識の解説
termios とは
termiosは、POSIX準拠のUnixライクシステムにおけるターミナルI/O制御のためのインターフェースです。以下の主要な機能を提供します:
-
ターミナルの動作モード制御
- カノニカルモード(行単位入力)
- 非カノニカルモード(文字単位入力)
- エコー制御
- 信号生成制御
-
制御文字の定義
- 割り込み文字(INTR)
- 終了文字(QUIT)
- 消去文字(ERASE)
- 削除文字(KILL)
- ファイル終端文字(EOF)
-
通信パラメータの制御
- ボーレート設定
- データビット数
- パリティ制御
- ストップビット数
Go言語のsyscallパッケージ
Go言語のsyscallパッケージは、オペレーティングシステムの低レベルプリミティブへのインターフェースを提供します。ztypes_*.go
ファイルは、以下の特徴を持ちます:
- 自動生成ファイル: C言語のヘッダーファイルから
cgo -godefs
ツールを使用して生成 - プラットフォーム固有: OS/アーキテクチャ組み合わせごとに異なる定義
- 型安全性: Go言語の型システムと統合された低レベルアクセス
技術的詳細
追加された定数カテゴリ
1. 制御文字インデックス(V*定数)
VINTR = 0 // 割り込み文字インデックス
VQUIT = 0x1 // 終了文字インデックス
VERASE = 0x2 // 消去文字インデックス
VKILL = 0x3 // 削除文字インデックス
VEOF = 0x4 // ファイル終端文字インデックス
これらの定数は、termios構造体のc_cc
配列における各制御文字の位置を示します。
2. 入力モードフラグ(I*定数)
IGNBRK = 0x1 // ブレーク信号を無視
BRKINT = 0x2 // ブレーク信号でINTを送信
IGNPAR = 0x4 // パリティエラーを無視
INPCK = 0x10 // パリティ検査を有効化
ICRNL = 0x100 // CR文字をNLに変換
IXON = 0x400 // 出力フロー制御を有効化
3. 出力モードフラグ(O*定数)
OPOST = 0x1 // 出力処理を有効化
ONLCR = 0x4 // NL文字をCRLFに変換
OCRNL = 0x8 // CR文字をNLに変換
4. 制御モードフラグ(C*定数とボーレート)
CS5 = 0 // 5データビット
CS6 = 0x10 // 6データビット
CS7 = 0x20 // 7データビット
CS8 = 0x30 // 8データビット
CSTOPB = 0x40 // 2ストップビット
PARENB = 0x100 // パリティ有効
B9600 = 0xd // 9600bps
B115200 = 0x1002 // 115200bps
5. ローカルモードフラグ(L*定数)
ISIG = 0x1 // 信号生成を有効化
ICANON = 0x2 // カノニカルモードを有効化
ECHO = 0x8 // エコーを有効化
ECHOE = 0x10 // 消去文字のエコー
ECHOK = 0x20 // 削除文字のエコー
6. ioctl制御定数
TCGETS = 0x5401 // ターミナル属性の取得
TCSETS = 0x5402 // ターミナル属性の設定
追加されたTermios構造体
type Termios struct {
Iflag uint32 // 入力モードフラグ
Oflag uint32 // 出力モードフラグ
Cflag uint32 // 制御モードフラグ
Lflag uint32 // ローカルモードフラグ
Line uint8 // 回線制御
Cc [32]uint8 // 制御文字配列
Pad_godefs_0 [3]byte // アライメント用パディング
Ispeed uint32 // 入力ボーレート
Ospeed uint32 // 出力ボーレート
}
この構造体は、Linux ARMアーキテクチャでのtermios(3)システムコールのC言語構造体と正確に対応しています。
コアとなるコードの変更箇所
1. 定数定義の追加(24-123行目)
+ VINTR = 0
+ VQUIT = 0x1
+ VERASE = 0x2
+ // ... 96個の追加定数
+ TCGETS = 0x5401
+ TCSETS = 0x5402
2. Termios構造体の追加(131-141行目)
+type Termios struct {
+ Iflag uint32
+ Oflag uint32
+ Cflag uint32
+ Lflag uint32
+ Line uint8
+ Cc [32]uint8
+ Pad_godefs_0 [3]byte
+ Ispeed uint32
+ Ospeed uint32
+}
コアとなるコードの解説
制御文字配列の活用
// 制御文字の設定例
var term Termios
term.Cc[VINTR] = 3 // Ctrl-C (ASCII 3)
term.Cc[VEOF] = 4 // Ctrl-D (ASCII 4)
term.Cc[VERASE] = 127 // DEL文字
モードフラグの組み合わせ
// カノニカルモード + エコー有効
term.Lflag = ICANON | ECHO | ECHOE
// 生モード設定
term.Lflag = 0
term.Iflag = 0
term.Oflag = 0
term.Cflag = CS8 | CREAD | CLOCAL
ボーレート設定
// 115200bpsの設定
term.Cflag |= B115200
term.Ispeed = B115200
term.Ospeed = B115200
システムコール使用例
// 現在のターミナル属性を取得
var term Termios
_, _, err := syscall.Syscall(syscall.SYS_IOCTL,
uintptr(fd), TCGETS, uintptr(unsafe.Pointer(&term)))
// ターミナル属性を設定
_, _, err = syscall.Syscall(syscall.SYS_IOCTL,
uintptr(fd), TCSETS, uintptr(unsafe.Pointer(&term)))
パディングの重要性
ARM アーキテクチャでは、メモリアライメントが重要です。Pad_godefs_0 [3]byte
フィールドは、構造体のサイズを4の倍数にアライメントし、C言語構造体との互換性を保証します。
関連リンク
- Go syscall package documentation
- Go source code: ztypes_linux_arm.go
- Linux termios(3) manual page
- POSIX termios.h specification
- Go code review: CL 5298046