Linux デバイスドライバの開発 : プログラムを組みながら、デバイスドライバの基礎を学ぶ
- 著者:
- 平田, 豊, 1976-
- 出版社:
- 工学社
- 出版日:
- 202108
- ISBN:
- 9784777521609
なぜ注目されているか
技書の森解説
Linux の上でハードウェアを動かす部品、デバイスドライバーの作り方を、実際にプログラムを組みながら基礎から学ぶための入門書が『Linux デバイスドライバの開発』 (平田 豊 著、工学社、2021 年 8 月 26 日発売) です。工学社の I/O BOOKS の一冊で、副題は「プログラムを組みながら、デバイスドライバの基礎を学ぶ」。掲載されている Linux カーネルのソースコードはカーネル 5.11 をベースにした ARM 向けのもので、作業用のディストリビューションには Ubuntu 18.04 が使われています。アプリケーション開発とは概念が異なり、ハードウェアの知識も求められるデバイスドライバー開発を、これから始めるプログラマーや技術者が基本的な考え方から押さえられるように書かれています。
開発環境の構築からデジタル署名までの主な内容
内容は大きく、開発環境の構築、デバイスドライバーの基本、デバイスドライバーの応用の 3 つの流れで紹介されています。開発環境の構築では buildroot による環境構築と組み込み Linux の動作確認を行い、最初のサンプルドライバーを作ります。基本の部分では、デバイスドライバーとは何か、その実体はどのようなものかという整理から入り、仮想メモリ、Makefile、printf のしくみ、浮動小数点、printk の書式指定、Clang によるクロスコンパイラーといった、カーネルの中でコードを書くときに知っておくべき事柄を扱います。応用の部分では、モジュールパラメーター、デバイスファイル、メジャー番号とマイナー番号とその動的な割り当て、write と read の実装、D と呼ばれるスリープ状態、write と read の排他制御、そしてデジタル署名までが並びます。
アプリ開発と違う、カーネルの中で書くことの難しさ
デバイスドライバーは OS カーネルの一部として動くため、普段のアプリケーションとは前提が大きく変わります。ユーザー空間のプログラムは標準ライブラリの printf で文字を出しますが、カーネルの中ではそのライブラリが使えず、printk でカーネルのログに書き出します。浮動小数点の演算も、カーネルの中では自由に使えないのが原則です。アプリケーションから見たドライバーは /dev の下に置かれたデバイスファイルで、open や read、write といった システムコール を通じて呼び出され、どのドライバーにつながるかはメジャー番号とマイナー番号で決まります。複数のプロセスが同じデバイスに同時に書き込む可能性があるため、排他制御 を怠るとデータが壊れ、待ち方を誤ればプロセスが割り込みを受け付けない D 状態のまま止まってしまいます。さらに、署名の無いカーネルモジュールを読み込ませない設定の環境では、作ったドライバーに署名を付ける手順も必要になります。誤りがシステム全体の停止に直結する 低レイヤー の世界で、こうした約束事を一つずつ手を動かして確かめられる構成になっている点が、本書の入門書としての価値です。
C 言語の経験を前提にした組み込み Linux 入門の位置づけ
カーネルとドライバーのコードは C 言語で書かれるため、ポインターや構造体を含む C の読み書きと、Linux のコマンド操作には慣れておく必要があります。著者は日本電気に 20 年勤めたのちに独立し、組み込みソフトウェア開発を事業とする技術者で、端末エミュレータ Tera Term のオープンソース化にも携わっています。工学社からは『Linux カーネル解析入門』などの著書も出ており、カーネルの内部構造まで深く知りたくなった段階で読み進める先にもなります。一方、デバイスドライバーの API を網羅的に引ける分厚い参考書を求めている人や、特定の SoC やボード向けの量産ドライバーをそのまま書き上げたい人には、入門の範囲にとどまる本書は物足りないはずです。カーネル 5.11 と Ubuntu 18.04 という 2021 年時点の環境を前提にしているため、別の版のカーネルで試す場合は、関数の名前や引数の変化を自分で調べながら読み替える場面もあります。
組み込み機器の開発に配属され、アプリケーションは書けるのにドライバーの仕組みが見えずに困っている人にとって、本書は「よく分からない」を、手元で動くサンプルを通じて具体的な理解に変える足場になります。デバイスファイルがどうつながり、どこで排他が必要になるのかを一度自分で組んで確かめておけば、実務でドライバーのコードを読むときの見通しが立てやすくなります。
言及した記事 (1 件)
この本に興味がある方におすすめ
関連する本
関連記事
関連用語
ライトアンプリフィケーション
データベースへの 1 回の論理的な書き込みが、内部的に複数回の物理的な書き込みを引き起こす現象
CQRS
データの読み取り (Query) と書き込み (Command) を別々のモデルで処理し、それぞれを独立して最適化するアーキテクチャパターン
楽観的ロック
データの読み取り時にロックせず、更新時にバージョンを検証して競合を検出する排他制御
時系列データベース
タイムスタンプ付きのデータを効率的に保存 / クエリするために最適化されたデータベース
Redis
インメモリデータストアで、キャッシュ、セッション管理、Pub/Sub に使われる
競技プログラミング
与えられた問題を制限時間内に正確 / 高速に解くプログラミング競技