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

 

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

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

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

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

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

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

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

上記以外の取り扱い書店

ダウンロード

私はどのようにしてLinuxカーネルを学んだか Device Tree編のファイルはこちらからダウンロードいただけます。

概要

【書籍説明】

組み込みエンジニアとして組み込み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-cells295
#include224
#size-cells295
%pS364
.config72
a.out46
ACPI209
ACPIテーブル210
AMBA353
AML210
ARM11
ARM Versatile/PB63
arm-linux-gnueabihf-gcc43
ARMアーキテクチャ11
ASL210
ATAGS229, 249
B237
BAR140
BIOS127
BL237
BLOB196
BNE265
clang12
compatible220, 284
ConfigFS422
CTRL+ALT+Gキー37
Device Tree11, 193, 271
DT196
DTB196
DTC202
dtcコマンド221
DTS202
Dynamic Device Tree413, 425
earlycon376
ext428
fdiskコマンド28
fdt274
FIFO380
fileコマンド46
FIQ171
gcc12
GitHub16
gitリポジトリ42
I/O122
I/Oポート145
if文の嵐190, 192
IRQ155
Kconfig68
lddコマンド49
LDM241
LDR265
Linuxカーネル7
Linuxディストリビューション11
losetupコマンド29
LR232
magicフィールド201
MMIO124
modinfoコマンド33, 104
module_driverマクロ331
mountコマンド29
mrproper51
netstatコマンド24
of_match_table356
of_node357
of_root332
of_root変数304
Oops119
Open Firmware272
panic_on_oops119
PC177, 232
phandle369
platform device335
platform driver335
QEMU18, 27
Raspberry Pi16
raspi-configコマンド37
regプロパティ295
resource構造体358
SoC53
sshpass48
ssコマンド26
STM241
sudo25
TST265
UART374
u-boot31, 204, 229
Ubuntu11
vic373
WARNマクロ372
WDT121
x8610
x86_6410
zImage235, 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/O124
ユーザー空間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からのご購入(電子書籍)

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

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

上記以外の取り扱い書店