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

[インデックス 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つのカテゴリに分類されます:

  1. ターミナル制御定数の追加 - 99個の新しい定数
  2. Termios構造体の追加 - 12行の新しい型定義

変更の背景

2011年のGoランタイムプロジェクトにおいて、ARMアーキテクチャ上でのターミナル制御機能の完全性を確保するため、このアップデートが必要となりました。当時のDebian sid ARM5ホスト上でファイルが再生成されており、ARM固有のターミナル制御機能をサポートするために必要なシステムコール定義が不足していたことが背景にあります。

特に、このアップデートは以下の要因によるものです:

  • ARM環境でのターミナル制御機能の需要増加
  • POSIXターミナル制御API(termios)の完全サポート
  • クロスプラットフォーム対応の強化
  • システムコール定義の一貫性確保

前提知識の解説

termios とは

termiosは、POSIX準拠のUnixライクシステムにおけるターミナルI/O制御のためのインターフェースです。以下の主要な機能を提供します:

  1. ターミナルの動作モード制御

    • カノニカルモード(行単位入力)
    • 非カノニカルモード(文字単位入力)
    • エコー制御
    • 信号生成制御
  2. 制御文字の定義

    • 割り込み文字(INTR)
    • 終了文字(QUIT)
    • 消去文字(ERASE)
    • 削除文字(KILL)
    • ファイル終端文字(EOF)
  3. 通信パラメータの制御

    • ボーレート設定
    • データビット数
    • パリティ制御
    • ストップビット数

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言語構造体との互換性を保証します。

関連リンク

参考にした情報源リンク