---
title: システムプログラミング：プログラムの起動から I/O までの学習ルート
url: https://doc.liz6.com/ja/systems-programming/00-learning-path
locale: ja
area: systems-programming
tags:
- システムプログラミング
date: 2026-09-12
modified: 2026-09-12
description: C または Rust で読み書きができ、ポインタとプロセスの概念を知っている読者を対象としています。コンパイルおよびデバッグ可能な Linux 環境を準備してください。まずは使用しているマシンのアーキテクチャの ABI 例を読み、他のアーキテクチャは対照用として使用してください。このルートでは、カーネルの事前コンパイルは必要ありません。
---

# システムプログラミング：プログラムの起動から I/O までの学習ルート

C または Rust で読み書きができ、ポインタとプロセスの概念を知っている読者を対象としています。コンパイルおよびデバッグ可能な Linux 環境を準備してください。まずは使用しているマシンのアーキテクチャの ABI 例を読み、他のアーキテクチャは対照用として使用してください。このルートでは、カーネルの事前コンパイルは必要ありません。

## 学習目標

ソースコード、バイナリ、ランタイム、システムコール、および外部効果を結びつけ、バッファリング、エラー、永続化の境界を説明し、ツールを用いて検証できるようになります。

## 必読順と理解の確認

1. [ELF ファイル形式](01-elf-and-binary-formats/01-elf-file-format.md) → [ロードと起動：ELF エントリから main へ](01-elf-and-binary-formats/03-loading-and-startup-start-main.md) → [プロセスのメモリレイアウト](03-processes-and-memory/01-process-memory-layout.md)。

   最小限のプログラムをコンパイルし、ELF エントリとランタイムのメモリマップを確認します。理解の確認：ファイルオフセットと仮想アドレスを区別し、main の前にどのような処理が行われるかを説明します。各観測値にはアーキテクチャとビルドオプションを明記してください。

2. [Linux x86-64 システムコール ABI](02-system-call-abi/01-x86-64-system-call-abi.md) → [バッファリング I/O（stdio）](05-io-and-file-systems/01-buffered-i-o-stdio.md)。

   プログラムの出力を追跡し、ライブラリのバッファから write 呼び出しまでをトレースします。ARM64 マシンを使用している場合は、同じディレクトリ内の ARM64 関連記事を読み替えてください。理解の確認：printf、fflush、write、および永続化の異なる境界を説明し、遅延して露呈する I/O エラーを再現して処理できることを確認します。

3. [パイプと socketpair](06-ipc-and-synchronization/02-pipes-and-socketpair.md) → [epoll とイベント駆動プログラミング](05-io-and-file-systems/03-epoll-and-event-driven-programming.md) → [Valgrind と Sanitizers の実践](08-performance-and-debugging/02-valgrind-and-sanitizers-in-practice.md)。

   プログラムにパイプまたは socketpair を追加し、短い読み書き、EOF、ブロッキングおよびノンブロッキング処理を行います。理解の確認：「準備完了」状態がメッセージの完全な到着を意味しないことを理解し、エラーチェックとリソースのクローズがすべての終了パスをカバーしていることを確認します。

## 発展学習

[ARM64 ABI](02-system-call-abi/02-arm64-system-call-abi.md) と基本編の x86-64 記事のどちらか一方を選択して読みます。その後、必要に応じて[ダイナミックリンク](01-elf-and-binary-formats/02-dynamic-linking-and-ld-so.md)、[futex](06-ipc-and-synchronization/01-futex-the-kernel-hop-in-userspace-locks.md)、[io_uring](05-io-and-file-systems/02-io_uring.md) を読みます。パフォーマンス分析は、再現可能なベンチマークと正しい結果が得られた後に行います。

## 仕上げの課題

入力を読み取り、それをパイプを介して子プロセスに渡して処理する小さなツールを作成します。空の入力、早期クローズ、およびエラーパスをテストします。システムコールのトレースを添付し、どこでバッファリングされ、どこでブロッキングされ、各ファイルディスクリプタの所有者が誰であるかを説明します。これらのインターフェースの背後にある実装を理解する必要がある場合は、[カーネルルート](../linux-kernel/00-learning-path.md) に進みます。

初めて読むときでは、長い証明や実装の詳細は飛ばしても構いませんが、各段階の理解の確認を完了してください。「用語は知っているが結果を説明できない」という状況に陥った場合は、現在の例に戻って条件を一つ変えてから次の記事に進んでください。ディレクトリ全体を一読する必要はありません。
