
FreeBSD デバイスドライバブック
最初の一歩からカーネルマスタリーへ
著者: Edson Brandi · バージョン 2.0 (2026年4月)
FreeBSD デバイスドライバ: 最初の一歩からカーネルマスタリーへは、無料のオープンソース書籍であり、「カーネルコードを書いたことがない」という状態から、「本番品質の FreeBSD ドライバを書き、デバッグし、投稿できる」ようになるまでを導きます。リファレンスではなくガイド付きコースとして設計されており、38 の章、6 つの付録、および実際の FreeBSD 14.x システム上でコンパイルおよびロードできる多数のハンズオンラボで構成されています。
この本は、すでに資格のある読者ではなく、学ぶ意欲がある読者を対象としています。UNIX の基礎と C 言語から始まり、カーネルが要求するすべての概念を段階的に説明し、その後で初めてドライバ開発の扉を開きます。DMA、割り込み、PCI ワークに到達する頃には、その用語は無理に覚えたものではなく、自然に身についているでしょう。
「カーネルプログラミングは依然としてプログラミングであり、ルールがより明示的で、責任が大きく、力も少し強いだけです。それを理解すれば、恐怖は興奮に変わります。」(第 1 章より)
すでに優れた FreeBSD カーネルリファレンスは存在します(man 9、アーキテクチャハンドブック、Newbus の論文など)。これまで欠けていたのは、以下のような一貫したテキストです。
myfirst ドライバは章ごとに進化し、同期、ハードウェアアクセス、割り込み、DMA を順に獲得していきます。同じコードが自分の手で成熟していく様子を目の当たりにできます。この本は、相互に構築する 7 つのパートに編成されています。
最後には、独自のカーネルモジュールを作成してロードし、キャラクタドライバを構築し、実際の割り込みと DMA を処理し、カーネルパニックをデバッグし、負荷下でドライバをプロファイリングし、作業を FreeBSD プロジェクトに貢献するためのすべてのステップを経験していることでしょう。
推奨ペースは週 1 章、学習時間は週約 5 時間です。このペースなら、1 学年の間に本書全体を終えることができます。一部の章(特に第 4 章の C 言語と、パート 4 のハードウェアに関する章)は自然と複数の週にわたります。
ラボは強く推奨します。 カーネルプログラミングは、他の分野にはないほど筋肉記憶が重要です。同じアタッチパターン、同じクリーンアップチェーン、同じロックの形状が章を超えて繰り返し現れます。それらのパターンを実際にタイプし、コンパイルし、実行中のカーネルにロードし、意図的に失敗させることは、それらを内面化する最も効果的な方法です。
すでに C、UNIX、OS カーネルの一般的な形状を知っている場合は、パート 1 全体にわたる fast-path ノートが、どのセクションを注意深く読むべきか、どのセクションを斜め読みできるかを示しています。
バージョン 2.0 は、リリースページで 3 言語、3 フォーマットで入手可能です。
Markdown ソースは content/ ディレクトリから直接閲覧することも、scripts/build-book.sh を使って自分で書籍をビルドすることもできます。
英語版は本書のオリジナルかつ権威あるバージョンです。 ブラジルポルトガル語版とスペイン語版は AI を使用して翻訳されており、まだ完全な人間による技術レビューを受けていません。 より多くの読者がアクセスできるように公開されていますが、翻訳時に誤訳、不自然な表現、技術的な不正確さが含まれている可能性があります。
翻訳版で不明瞭、矛盾、または技術的に疑わしい点があれば、英語版を信頼の源として参照してください。翻訳のレビューと改善への協力は大歓迎です(以下の 貢献 を参照)。
これは非常に大きな書籍のドラフトリリースです。以下の点に注意してください。
content/ 以下の該当ファイルを開いて、クリーンなバージョンを参照してください。FDD-book/ ├── content/ # Book content (Markdown) │ ├── chapters/ # Chapters by Part │ └── appendices/ # Appendices A-F ├── examples/ # Source code from the book ├── translations/ │ ├── pt_BR/ # Brazilian Portuguese (AI-translated) │ └── es_ES/ # Spanish (AI-translated) └── scripts/ # Build and utility scripts
## Contributing
あらゆる種類の貢献を歓迎します。修正、明確化、新しい例、翻訳、そしてFreeBSD開発者や学習者からのレビューを含みます。
### 貢献方法
- **コンテンツ:** 新しい章の追加、既存資料の洗練
- **技術レビュー:** FreeBSD 14.x に対する正確性のための章のレビュー
- **翻訳レビュー:** AI翻訳された **pt_BR** 版と **es_ES** 版のレビューと改善の支援。FreeBSD/カーネル経験のあるネイティブスピーカーを特に歓迎します。
- **新しい翻訳:** 書籍を別の言語に翻訳する支援
- **コード:** サンプル、ビルドスクリプト、ツールの改善
- **Issues:** バグ、事実誤認、不明瞭な箇所、書式の問題を報告
### 問題の報告
問題を報告する際は、以下を含めてください:
- 読んでいた言語バージョン(`en_US`、`pt_BR`、`es_ES`)
- 使用していた形式(PDF、EPUB、HTML、Markdown)
- 問題が発生した章またはセクション
- 問題の短い説明と、可能であれば修正提案
### ワークフロー
1. リポジトリをフォークする
2. ブランチを作成: `git checkout -b feature/your-change`
3. 変更を加え、`scripts/build-book.sh` でビルドをテストする
4. 明確なメッセージでコミット: `git commit -m "Chapter 18: clarify BAR mapping"`
5. プッシュしてプルリクエストを作成する
本を読んで行き詰まったときは、**Issueを報告することが役立ちます**。ある箇所が間違っているように思えたり、ラボが予期せず失敗したりした場合、報告のたびに次の読者の道がよりスムーズになります。
## よくある質問
### なぜこの本は存在するのですか?
正直な答えは、FreeBSDプロジェクトには新しい貢献者が必要であり、カーネルやドライバの仕事への道は常に必要以上に険しいものです。既存の資料のほとんどは、すでにUNIXを知っていて、Cをよく知っていて、バスが何かを知っていて、カーネルソースツリーの読み方を知っていることを前提としています。それはすでにほとんどの道のりを進んでいる人には有効ですが、始めたいと思っている好奇心旺盛な開発者にはほとんど役に立ちません。
この本の目標は、その参入障壁を下げることです。たとえ少数の読者でもこの本を読み終え、パッチを提出し、コードをレビューし、新しいドライバを書き、あるいは最終的にFreeBSDコミッターになるなら、この本はその役割を果たしたことになります。**次世代のFreeBSD貢献者を育成することが、この著作が書かれた理由です**。
### 始める前にCを知っている必要がありますか?
いいえ。第4章と第5章では、C言語を基礎から教えます。カーネル作業に重要な言語の部分(ポインタ、構造体、メモリレイアウト、プリプロセッサ、呼び出し規約)に焦点を当てています。すでにCをよく知っている場合は、それらの章のサイドバーで、何を流し読みし、何を注意深く読むべきかが示されています。
### UNIXまたはFreeBSDを知っている必要がありますか?
いいえ。第2章では、VMまたはベアメタルにFreeBSDをインストールする手順を説明し、第3章ではUNIXのコマンドライン、ファイルシステム、プロセス、パーミッション、エディタを紹介します。パート1の終わりまでに、作業可能なラボとそれを使用するための語彙を身につけているでしょう。
### 実機ハードウェアは必要ですか?
この本の大部分では、必要ありません。FreeBSD 14.x を実行する仮想マシンで、基礎、最初のドライバの章、並行性と同期、デバッグ資料の大部分には十分です。実機ハードウェアが役立つ(しかし厳密には必須ではない)のは、パート4のPCI、割り込み、DMAの章に到達したときです。それらの章は、VM上で実行した場合でも概念が理解できるように書かれています。
### これはLinuxドライバを書くのに役立ちますか?
間接的には、はい。カーネルプログラミングの規律は非常によく移転します:ロック戦略、メモリ管理、割り込みコンテキスト、DMAマッピング、スリープするコードパスとしないコードパスの違い、防御的なクリーンアップ順序。具体的なAPIは異なります。この本を読んだ後でもLinuxデバイスモデルを知ることはできませんが、その問題と解決策の形状を認識でき、Linux Device Drivers (LDD) をはるかに簡単に読むことができるようになります。
### なぜ特にFreeBSD 14.xなのですか?
すべてのAPI、すべての例、すべてのラボは、FreeBSD 14.3 ソースツリーと対応する `man 9` ページの下で実行されるように計画されました。特定のリリースを対象とすることで、関数シグネチャ、ヘッダの場所、動作について正確に記述できます。概念は14.xを何年も生き延びますが、正確な行番号や小さなAPIの詳細はそうではありません。その本はその点について正直です。
### これは公式のFreeBSDプロジェクトの出版物ですか?
いいえ。これはFreeBSDデバイスドライバ開発に関する独立した教育書です。FreeBSDプロジェクトの公式出版物ではありません。著者はFreeBSDコミッターであり、ドキュメンテーションエンジニアリングチーム(DocEng)のメンバーですが、この本は彼の仕事と見解を反映したものであり、プロジェクトの公式な立場ではありません。
### 実際にどれくらいの時間がかかりますか?
注意深く読み、ラボを行う場合、合計約200時間の作業を見込んでください。それはおおよそ100時間の読書と100時間の実践的なラボ時間です。週5時間なら約6ヶ月の夜間プロジェクト、週10時間なら集中した2ヶ月のスプリントです。ラボを行わずに読むだけだと時間はおおよそ半減しますが、価値も半減します:カーネルプログラミングは、ほとんどない分野で筋肉記憶を報酬とします。
### ラボを省略できますか?
省略することはできますが、おそらくすべきではありません。ラボは散文が反射になる場所です。アタッチ順序、クリーンアップの巻き戻し、ロック獲得パターンなどのパターンはすべての章で繰り返し現れ、それらを内面化する唯一の信頼できる方法は、それらをタイプし、コンパイルし、実行中のカーネルにロードし、意図的に失敗させることです。ラボを省略した読者は、最初はスムーズに進むが、パート3またはパート4あたりで静かに停滞する進捗を報告しています。
### これを読んだ後、どうやってFreeBSDに貢献すればよいですか?
第37章では、完全な提出ワークフローを説明しています:パッチの準備方法、Phabricator(FreeBSDコードレビューシステム)の使用方法、自分の作業をスポンサーしてくれるコミッターを見つける方法、レビューフィードバックへの応答方法、ドライバをツリーに導く方法。前半の章は技術スキルを構築し、第37章は社会的ワークフローを構築します。両方が重要です。
### 本が大きいです。どこから始めるべきですか?
理由がない限り、第1章から始めてください。この本は累積的です。後の章は、以前に確立された語彙と習慣に依存しています。すでにC、UNIX、OSカーネルの一般的な形を知っている場合は、パート1内の高速パスノートが何を流し読むべきかを示しています。特定のサブシステム(USB、ネットワーク、ストレージ、PCI)がここに来た理由なら、パート1と2を注意深く読んでから先に進んでも構いませんが、以前の章の用語が再登場したときに戻ってくることを想定してください。
### 間違いを見つけました。どうすればよいですか?
GitHubでIssueを開いてください。言語バージョン、読んでいた形式、章またはセクション、問題の短い説明、可能であれば修正提案を含めてください。すべての報告が次の読者の体験を向上させます。pt_BR版とes_ES版の翻訳に関する問題は特に歓迎します。それらはまだ完全な人間による技術レビューを受けていないからです。
### この本は本当に無料ですか?
はい。MITライセンスの下で公開されています。読む、共有する、印刷する、引用する、それに基づいて構築する、翻訳することができます。個人利用では帰属表示は推奨されますが必須ではありません。この作業を支援したい場合、最も役立つことは:他の人にこの本を伝える、問題を見つけたらIssueを報告する、レビューや翻訳を貢献する、(最終的にそこに至るなら)あなた自身の作業をFreeBSDプロジェクトに提出することです。
## 著者について
私はEdson Brandiです。テクノロジーへの道のりは決して conventional なものではありませんでした。1995年にブラジルのUnicampで化学の学生として始め、コンピュータで働く計画はありませんでしたが、一つの持続的な疑問がありました:*これは実際にどのように動くのか?* その疑問が私をFreeBSDに導き、FreeBSDはそれ以来私のキャリアを形成してきました。
その後、私は**ブラジルFreeBSDユーザーグループ (FUG-BR)** を設立し、**FreeBSD LiveCD Tool Set** を共同作成し、2002年には**FreeBSD Brasil**を共同設立しました。これはFreeBSDのトレーニング、コンサルティング、サポートを提供する会社で、現在も運営されています。私はFreeBSDコミッターであり、現在は**FreeBSD Documentation Engineering Team (DocEng)** のメンバーとして、FreeBSDのドキュメントを世界中で生き生きとアクセス可能に保つシステムの維持を支援しています。
職業的には、複数の業界でインフラストラクチャとエンジニアリングリーダーシップのキャリアを積み、現在はロンドンのフィンテック企業でITディレクターを務めています。
私は、他の好奇心旺盛な人々に、私がかつて持っていなかった参入障壁の低い道を提供したいと思い、この本を書きました。カーネルコードを書くためにコンピュータサイエンスの学位は必要ありません。必要なのは、好奇心、粘り強さ、忍耐力、そしてあなたの現在地に合わせたガイドです。
Edson Brandi · [email protected]
## ライセンス
この本と付属するソースコードは**MIT License**の下で公開されています。全文は[LICENSE](https://github.com/ebrandi/fdd-book/blob/main/LICENSE)を参照してください。この作品を自由に読み、共有し、基にして構築することができます;帰属表示は推奨されます。
## 謝辞
- FreeBSD開発コミュニティ
- すべての貢献者、レビュアー、翻訳者
- 章を改善するためにIssueを報告したり質問をしたすべての人
## リンク
- **リポジトリ:** https://github.com/ebrandi/FDD-book
- **Issues:** https://github.com/ebrandi/FDD-book/issues
- **議論:** https://github.com/ebrandi/FDD-book/discussions
- **著者:** Edson Brandi · [email protected]
---
<p align="center"><em>この本が役に立ったなら、リポジトリにスターを付け、コンピュータが実際にどのように動作するかに興味がある他の誰かと共有してください。</em></p>
| パート | タイトル | 焦点 |
|---|
| 1 | 基礎:FreeBSD、C、カーネル | ラボのセットアップ、UNIX、カーネルワークのための C、ドライバの解剖 |
| 2 | 最初のドライバを構築する | キャラクタドライバ、デバイスファイル、read/write、I/O |
| 3 | 並行性と同期 | スレッド、ミューテックス、条件変数、タイマー、タスクキュー、セマフォ |
| 4 | ハードウェアとプラットフォームレベルの統合 | PCI、割り込み、MSI/MSI-X、DMA、電源管理 |
| 5 | デバッグ、ツール、実践的な手法 | トレーシング、KGDB、高度なデバッグ、パフォーマンスチューニング |
| 6 | トランスポート固有のドライバを作成する | USB、シリアル、ストレージ/VFS、ネットワークドライバ |
| 7 | マスタリーのテーマ:特殊なシナリオとエッジケース | 移植性、仮想化、セキュリティ、組込み、リバースエンジニアリング、アップストリームへの投稿 |
| ページ数 | 4,500+ |
| 章 | 38 |
| 付録 | 6 |
| 読書時間 | 約 100 時間 |
| ラボ時間 | 約 100 時間 |
| 合計学習時間 | 約 200 時間(週 5 時間なら約 6 ヶ月) |
| 対象 FreeBSD リリース | 14.3 |
| 言語 | 英語(オリジナル)・ブラジルポルトガル語(AI 翻訳)・スペイン語(AI 翻訳) |
| フォーマット | PDF · EPUB · HTML · Markdown ソース |
| 言語 | EPUB | HTML |
|---|
| 英語(オリジナル) | EPUB | HTML | |
| Português (Brasil), AI 翻訳 | EPUB | HTML | |
| Español, AI 翻訳 | EPUB | HTML |