私はどのようにしてLinuxカーネルを学んだか Device Tree編

 

タイトル
私はどのようにしてLinuxカーネルを学んだか Device Tree編 ゆたかさんの技術書

著者名
平田豊,MBビジネス研究班

発売日
電子書籍:2020/11/27
紙書籍(POD):2020/12/3

Amazonからのご購入(紙書籍)

Amazonからのご購入(電子書籍)

楽天市場からのご購入(電子書籍)

紀伊國屋書店からのご購入(電子書籍)

上記以外の取り扱い書店

概要

【書籍説明】

組み込みエンジニアとして組み込みLinux開発を行うにあたって、Device Tree(デバイスツリー)というしくみがよく分からなくて困っているのではないでしょうか?

本書では組み込みLinux開発において必須知識となっているDevice Treeについて、じっくりと基本的なところから学ぶことができます。

Device Treeをまったく知らないエンジニアのために、デバイスドライバの基礎のおさらいを行い、Device Treeを基本から学べるようにお話を進めていきます。

Device Treeを知れば、組み込みLinux開発における必修科目は無事に履修完了です。そして、デバイスドライバの理解もより深まり、技術者としてのスキルもパワーアップです。

筆者も日々エンジニアとして学びの毎日であり、人生勉強です。筆者といっしょに新しい知識を学んでいただけたら幸いです。

なお、本書に登場するLinuxカーネルのソースコードは、カーネルバージョン5.6系をベースとしたラズパイ(Raspberry Pi)向けのものを採用しています。
LinuxディストリビューションはUbuntu 20.04 LTSを使用しています。

【著者紹介】

平田豊(ヒラタユタカ)
1976年兵庫県生まれ。石川県金沢在住。執筆活動歴は20年以上で、著書は23冊。
神戸大学工学部情報知能工学科を卒業後、日本電気株式会社に入社。
20年勤務して自主退職後、フリーランス(個人事業主)として独立起業。
YOULAB(ユウラボ)代表。
事業内容は組み込みソフトウェア開発、市販書籍執筆、市販書籍の企画および編集。

【目次】

第1章 開発環境とカーネルバージョン
1.1 カーネルバージョンと組み込み界隈の事情
1.2 組み込みLinuxのアーキテクチャ
1.3 開発環境の検討と構築
1.4 組み込み機器の検討と選定
1.5 組み込みLinuxの動作検証方法
1.6 サンプルデータのダウンロードサービス

第2章 開発環境の構築
2.1 Linuxディストリビューション
2.2 QEMUの導入
2.3 クロスコンパイラの導入
2.4 クロスコンパイラの動作確認
2.5 Linuxカーネルのビルド

第3章 QEMU向けLinuxカーネルの構築
3.1 実機とエミュレータは異なる
3.2 ARM Versatileを使う
3.3 カーネルへのパッチ適用
3.4 カーネルコンフィグレーション
3.4.1 General setup
3.4.2 System Type
3.4.3 Enable loadable module support
3.4.4 Device Drivers
3.4.5 File systems
3.4.6 Library routines
3.4.7 カーネルコンフィグレーションの終了
3.5 カーネルのビルド
3.6 QEMUからのカーネル起動

第4章 デバイスドライバの基礎
4.1 デバイスドライバとはなにか
4.2 デバイスドライバのソースコード
4.3 ユーザー空間とカーネル空間
4.4 デバイスドライバのビルドと実行
4.5 空間の違いを体験する
4.6 ハードウェアの制御方法
4.7 I/Oアクセス
4.7.1 メモリマップドI/O
4.7.2 I/Oポート
4.8 割り込み
4.9 ARMアーキテクチャのケース
4.9.1 メモリマップドI/O
4.9.2 I/Oポート
4.9.3 割り込み

第5章 Device Treeの基礎
5.1 ハードウェアの情報管理
5.2 ハードウェアの改修対応
5.3 改修対応がよくないケース
5.4 Linuxカーネルでの問題点
5.5 Device Treeのしくみ
5.6 DTBの作り方
5.7 DTBの格納方法
5.8 x86でDevice Treeを使わない理由
5.9 ソフトウェア更新の課題
5.10 DTSの基本

第6章 Device Treeの詳細
6.1 ブートローダーからの受け渡し方法
6.2 ATAGS
6.2.1 ATAGSのパラメーター一覧
6.2.2 ATAGSのフォーマット
6.2.3 ATAGSのチェック
6.3 Device Treeの渡し方
6.4 Device Treeの起動時チェック
6.5 Device Treeのマッチング
6.6 Device Treeの訂正
6.7 Device Treeのノード検索
6.8 Device Treeの初期参照
6.8.1 __atags_pointer
6.8.2 initial_boot_params
6.9 Device Treeの展開
6.10 Linux上での見え方

第7章 カーネルコンフィグレーション
7.1 ARMアーキテクチャ固有の設定
7.2 汎用的な設定

第8章 DTBへのアクセス処理
8.1 of_fdt.hヘッダ
8.2 memory.hヘッダ
8.3 libfdt.hヘッダ

第9章 デバイスドライバからのアクセス
9.1 デバイスドライバの書き方
9.2 of_rootを使ったアクセス
9.3 プラットフォームデバイスとドライバ
9.4 Device Treeへの対応
9.4.1 platform deviceの作り方
9.4.2 platform driverの作り方
9.5 platform driver以外のデバイスドライバ
9.6 Versatileのplatform deviceとplatform driver
9.7 Device Treeからの情報取得の実例
9.7.1 ネットワークと割り込み
9.7.2 シリアルコンソールとearlycon
9.8 関数リファレンス

第10章 オーバーレイとDynamic Device Tree
10.1 オーバーレイ
10.1.1 カーネルコンフィグレーション
10.1.2 オーバーレイ用Device Tree
10.1.3 オーバーレイの追加と削除を行うカーネル関数
10.1.4 DTBをアセンブラソースで取り込む
10.1.5 ConfigFSでDTBを送り込む
10.1.6 platform driverの作り方
10.2 Dynamic Device Tree
10.2.1 使用例
10.2.2 使用可能な関数
10.2.3 デバイスドライバのサンプル

【索引】

索引名 ページ数
#address-cells 295
#include 224
#size-cells 295
%pS 364
.config 72
a.out 46
ACPI 209
ACPIテーブル 210
AMBA 353
AML 210
ARM 11
ARM Versatile/PB 63
arm-linux-gnueabihf-gcc 43
ARMアーキテクチャ 11
ASL 210
ATAGS 229, 249
B 237
BAR 140
BIOS 127
BL 237
BLOB 196
BNE 265
clang 12
compatible 220, 284
ConfigFS 422
CTRL+ALT+Gキー 37
Device Tree 11, 193, 271
DT 196
DTB 196
DTC 202
dtcコマンド 221
DTS 202
Dynamic Device Tree 413, 425
earlycon 376
ext4 28
fdiskコマンド 28
fdt 274
FIFO 380
fileコマンド 46
FIQ 171
gcc 12
GitHub 16
gitリポジトリ 42
I/O 122
I/Oポート 145
if文の嵐 190, 192
IRQ 155
Kconfig 68
lddコマンド 49
LDM 241
LDR 265
Linuxカーネル 7
Linuxディストリビューション 11
losetupコマンド 29
LR 232
magicフィールド 201
MMIO 124
modinfoコマンド 33, 104
module_driverマクロ 331
mountコマンド 29
mrproper 51
netstatコマンド 24
of_match_table 356
of_node 357
of_root 332
of_root変数 304
Oops 119
Open Firmware 272
panic_on_oops 119
PC 177, 232
phandle 369
platform device 335
platform driver 335
QEMU 18, 27
Raspberry Pi 16
raspi-configコマンド 37
regプロパティ 295
resource構造体 358
SoC 53
sshpass 48
ssコマンド 26
STM 241
sudo 25
TST 265
UART 374
u-boot 31, 204, 229
Ubuntu 11
vic 373
WARNマクロ 372
WDT 121
x86 10
x86_64 10
zImage 235, 310
アセンブラのコード 221
エラッタ 199
エンディアン 273
エントリポイント 230
オーバーレイ 412
オンラインアップデート 215
オンラインファームウェアアップデート 215
カーネル・スタートアップ・エントリポイント 240
カーネル空間 94
カーネルコンフィグレーション 72
カーネルパニック 119
カーネルモジュール 33
開発効率 191
仮想メモリ 94
機器の故障 188
木構造 219
クロスコンパイラ 13
コメント 219
再帰呼び出し 353
条件実行機能 266
シリアルコンソール 376
スプリアス割り込み 156
静的リンク形式 100
セルフコンパイラ 13
ソフトウェアビジビリティ 183
ダイナミックリンカーローダー 49
チェックサム 280
デバイスツリー 193, 219
デバイスドライバ 88
動的リンク形式 100
ノード 289
ハードウェアリビジョン 185
パワーオンリセット 31
ビッグエンディアン 302
ブートローダー 204
プリプロセス機能 185
プリプロセッサ 224
プログラムカウンタ 232
プロパティ 220
プロプライエタリ 31, 205
ベースアドレス 179
ベクタテーブル 172
ポート番号 179
保守のコスト 191
メモリマッピング 182
メモリマップドI/O 124
ユーザー空間 94
ユニットアドレス 291
呼び出し規約 231
ラズパイ 16
リンカースクリプト 173
ルートファイルシステム 27
例外 171
ワークアラウンド 199
割り込み 123
割り込み番号 154, 179
割り込み要因 138

*上記索引のページ数は電子書籍版のページとなります。
POD(紙書籍版)も内容は同じですがページ数は異なります。
電子版もPOD版も巻末には作品がありますので、そちらも併せてご利用ください。

正誤表(初版第1刷)
https://hp.vector.co.jp/authors/VA013320/about/book/mangabito/errata_iam_linux_kernel_devicetree.html

 

Amazonからのご購入(紙書籍)

Amazonからのご購入(電子書籍)

楽天市場からのご購入(電子書籍)

紀伊國屋書店からのご購入(電子書籍)

上記以外の取り扱い書店