🐧 Linux 総合学習プラットフォーム

デバイスドライバ実装の用語集(82語)

デバイスドライバ実装に関する Linux 用語を、読み・意味・補足つきでまとめました。

__exitいぐじっと
終了処理専用の関数に付けるマクロ。カーネル組込み時にはコードごと省かれる。
モジュールをカーネルに直接組み込んだ場合はアンロードが起きないため、__exitの付いた関数はバイナリから除外される。module_exitで指定するクリーンアップ関数に付けるのが定番の使い方。
__initいにっと
初期化専用の関数に付け、実行後にそのメモリを解放してよいと示すマクロ。
この印が付いた関数は起動時またはモジュールロード時にしか呼ばれないため、実行後にカーネルがそのメモリを破棄できる。メモリの限られた組込み環境で特に効果がある。module_initと組で使う。
.ko ファイルけーおーふぁいる
ビルド済みのカーネルモジュール本体。kernel object の略。
C言語のソースを make でビルドすると生成される。insmod に渡して組み込む。modprobe は /lib/modules 配下に配置済みの .ko を名前で探して読み込む。
.releaseどっとりりーす
file_operations で close に対応するメンバ。名前が .close でない点に注意。
アプリが close したときに呼ばれるハンドラを登録する。ファイルの最後の利用者が手を離したときの後始末という意味合いで release という語が使われる。
/devでぶ
デバイスファイルが集まる特別なディレクトリ。
/dev/null(捨て場)、/dev/sda(ディスク)、/dev/ttyS0(シリアル)など。現代では udev が機器の接続に応じて中身を動的に作る。
alloc_chrdev_regionあろけーとしーえるでぶりーじょん
空きメジャー番号を動的に確保するカーネル関数。
alloc_chrdev_region(&dev, baseminor, count, name) で未使用の番号を割り当ててもらう。取り外し時は unregister_chrdev_region で対にして解放する。
alloc_chrdev_regionあろっくきゃらでぶりーじょん
キャラクタデバイス用のデバイス番号を動的に確保するカーネル関数。
メジャー番号を固定で指定するregister_chrdev_regionと違い、空いている番号をカーネルに割り当ててもらう現代的な方法。確保した番号はcdevの登録に使い、終了時はunregister_chrdev_regionで返す。
cdevしーでぶ
カーネルがキャラクタ型デバイスを管理する入れ物。
cdev_init で file_operations と結びつけ、cdev_add でデバイス番号とともにカーネルへ登録する。取り外しは cdev_del で行う。MKDEV / MAJOR / MINOR で番号を組み立て・分解する。
cdevしーでぶ
キャラクタデバイスをカーネルに登録するときに使う、デバイスを表す構造体。
自作ドライバではcdev_initでfile_operationsと結びつけ、cdev_addでデバイス番号とともにカーネルへ登録する。この登録によって、/devのデバイスファイルへのopenやreadが自分のドライバの関数へ届くようになる。取り外し時はcdev_delで解除する。
cdev_addしーでぶあど
初期化済みのcdev構造体をカーネルに登録し、デバイスを有効化する関数。
cdev_initでfile_operationsと結び付けたcdevを、デバイス番号とともにシステムへ追加する。この呼び出しの直後からopen等が飛んでくる可能性があるため、初期化を全て済ませてから呼ぶのが鉄則。
copy_from_userこぴーふろむゆーざー
ユーザ空間のデータを、カーネル空間のバッファへ安全にコピーするカーネル関数。
ドライバのwrite処理で、アプリから渡されたデータを受け取るときに使う。ユーザ空間のポインタをカーネル側で直接参照するのは危険なため、アドレス検査付きのこの関数を経由する。copy_to_userと向きが逆になるだけで、役割は対になっている。
copy_to_userこぴーとぅーゆーざー
カーネル空間のデータを、ユーザ空間のバッファへ安全にコピーするカーネル関数。
ドライバのread処理で、読み取った結果をアプリ側のバッファへ渡すときに使う。ユーザ空間のアドレスは不正な場合があるため、検査付きのこの関数を使い、memcpyで直接書き込んではいけない。戻り値はコピーできなかったバイト数で、0なら成功。
copy_to_user / copy_from_userこぴーとぅーゆーざーこぴーふろむゆーざー
ユーザ空間との間で複数バイトを安全にコピーする関数。
copy_to_user はカーネル→ユーザ、copy_from_user はユーザ→カーネル。戻り値はコピーできなかった残りバイト数で、0 なら全て成功。1バイトなら put_user / get_user を使う。
depmodでぷもど
モジュール間の依存関係を解析し、modules.depを作り直すコマンド。
modprobeはこの依存情報を頼りに、必要なモジュールを正しい順序で自動ロードする。自作モジュールを/lib/modules配下に置いたらdepmodを実行しないとmodprobeで見つからない、という手順の要になる。
dev_tでぶてぃー
デバイスのメジャー番号とマイナー番号を1つに詰め込んだデバイス番号の型。
メジャー番号がドライバの種類を、マイナー番号が個々のデバイスを表す。MAJOR/MINORマクロで取り出し、MKDEVで合成する。キャラクタデバイスの登録やdevice_createの引数として頻出する。
devm_kzallocでぶえむけーぜっとあろっく
デバイスに紐付けて、ゼロ初期化済みのメモリを確保するカーネル関数。
managed(devm)系APIの代表で、デバイスの切り離し時に自動で解放されるため、probe失敗時やremoveでのkfree忘れを防げる。kzallocはゼロクリア付きのkmallocに相当する。
dmesgでぃーめっせーじ
カーネルが出すメッセージ(カーネルリングバッファ)を表示するコマンド/仕組み。
起動ログ、機器の認識、ドライバのエラー、printk の出力などが時系列で並ぶ。ドライバ開発では状態把握と原因切り分けの第一手になる。
dmesgでぃーめっせーじ
カーネルが出力したメッセージ(カーネルログ)をまとめて表示するコマンド。
起動時のハードウェア検出の記録や、ドライバのprintk出力がここに溜まる。自作モジュールの動作確認は「insmodしてdmesgを見る」が基本の流れ。メッセージが多いときは dmesg | tail で末尾だけ確認すると効率がよい。
EXPORT_SYMBOLえくすぽーとしんぼる
モジュール内の関数や変数を、他のカーネルモジュールから使えるように公開するマクロ。
カーネル内の名前(シンボル)は既定では自分のモジュール内でしか使えず、これで公開して初めて他のモジュールが参照できる。GPLモジュール限定で公開するEXPORT_SYMBOL_GPLという変種もある。公開されたシンボルはカーネルのシンボルテーブルで管理される。
file_operationsふぁいるおぺれーしょんず
アプリの操作とドライバのハンドラ関数を対応づける構造体。
.open・.read・.write などのメンバに自作関数を割り当てる。cdev に紐づけて登録すると、アプリの open/read/write がここ経由でドライバに届く。
file_operationsふぁいるおぺれーしょんず
デバイスファイルへの操作と、ドライバ側の処理関数とを対応づけるための構造体。
open・read・write・releaseなどのメンバに自作関数のアドレスを設定して登録する。アプリがreadシステムコールを呼ぶと、対応するドライバの関数が呼び出される仕組み。キャラクタデバイスドライバ開発の中心になる構造体。
get_userげっとゆーざー
ユーザー空間の変数から値を1つ、安全にカーネル空間へ読み込むマクロ。
ユーザー空間のポインタは不正な場合があるため直接参照せず、アクセス検査付きのこのマクロを使う。整数など単純な値を1個取り出す用途で、まとまったデータの転送はcopy_from_userが担当する。
HZへるつ
1秒あたりのタイマ割込み回数を表すカーネルのコンパイル時定数。
組込みでは100や250、デスクトップでは1000などに設定される。jiffiesを秒に換算する係数であり、HZの値を決め打ちしたコードは設定の違うカーネルで時間がずれる。msecs_to_jiffies等の変換関数を使うと安全。
I2Cあいすくえあしー
クロックとデータの2本の信号線(SCL・SDA)で、複数のICをつなぐシリアル通信規格。
マスタ(SoC側)が通信を主導し、各スレーブはアドレスで区別されるため、少ない配線でセンサや液晶などを複数ぶら下げられる。信号線にはプルアップ抵抗が必要。似た用途のSPIより配線が少ない代わりに速度は控えめ、という対比で覚えるとよい。
insmodいんすもっど
カーネルモジュール(.koファイル)を1つ指定して、カーネルへ組み込むコマンド。
install moduleの略で、ファイルパスを直接指定して読み込む。依存する他のモジュールまでは自動で読み込まないため、依存解決までしてくれるmodprobeとの違いがよく問われる。自作ドライバの動作確認で最初に使う基本コマンド。
ioremapあいおーりまっぷ
デバイスのレジスタが並ぶ物理アドレス領域を、カーネルが使える仮想アドレスに対応づける関数。
MMUのあるシステムではカーネルも仮想アドレスで動くため、GPIOなどペリフェラルの物理アドレスをそのままは触れない。ioremapで得た仮想アドレス経由でレジスタを読み書きする。使い終えたらiounmapで対応づけを解除する。
iounmapあいおーあんまっぷ
ioremapで作ったレジスタ領域のマッピングを解除するカーネル関数。
ioremapは物理アドレス上のペリフェラルレジスタをカーネル仮想空間に貼り付ける関数で、iounmapはその後始末。ドライバのremove処理やエラーパスで必ず対にして呼ぶ。解除漏れはアドレス空間のリークになる。
jiffiesじふぃーず
起動してからのタイマ割り込みの回数を数え続ける、カーネル内のカウンタ変数。
タイマ割り込みは1秒間にHZ回(例えば100回)発生し、jiffiesはそのたびに1ずつ増える。「jiffies + HZ」で1秒後を表すなど、カーネル内の時間管理やタイマ処理の基準として使う。単位が秒ではなく「割り込みの回数」である点を混同しやすい。
kbuildけーびるど
カーネルに付属するモジュール用のビルドの仕組み。
動作中のカーネルと噛み合う形で .ko を作る。モジュール側の Makefile から make -C /lib/modules/$(uname -r)/build M=$(pwd) modules で呼び出して使う。
KERN_INFO / KERN_ERRかーねるいんふぉかーねるえらー
printk に渡す文字列の先頭に置くログレベルの印。
KERN_INFO は通常の情報、KERN_ERR はエラーを表す。printk(KERN_ERR "...") のように本文の直前に続けて書く。付けなければ既定のレベルになる。
libgpiodりぶじーぴーあいおーでぃー
キャラクタデバイス経由でGPIOを操作する現行標準のユーザー空間ライブラリ。
旧来の/sys/class/gpio(sysfs方式)が非推奨となり、/dev/gpiochipNを扱うこのライブラリと付属コマンド(gpioset・gpioget等)が後継になった。グローバルなGPIO番号ではなくチップとライン番号で指定するのが特徴。
lsmodえるえすもっど
現在カーネルに組み込まれているモジュールの一覧を表示するコマンド。
モジュール名・サイズ・参照カウント・依存しているモジュール名が一覧される。自作ドライバが正しく組み込まれたかの確認や、rmmodできない原因(どこから使われているか)の調査に使う。実体は/proc/modulesの内容を整形したもの。
mknodめいくのーど
種別とデバイス番号を指定して、デバイスファイルを手動で作成するコマンド。
「mknod /dev/mydev c 240 0」のように、種別(cはキャラクタ、bはブロック)とメジャー・マイナー番号を指定して作る。現在はudevが自動生成するのが普通だが、ドライバ学習では番号との対応関係を理解するために手動作成を体験する。
MMUえむえむゆー
仮想アドレスを物理アドレスに変換するCPU内のメモリ管理ユニット。
ページテーブルに従ってアドレス変換とアクセス保護を行い、プロセスごとに独立したメモリ空間を実現する。LinuxはMMUを前提とするOSで、MMUなしのマイコン向けには派生のuClinuxが使われてきた。
modinfoもどいんふぉ
カーネルモジュールの作者・ライセンス・パラメータ等の情報を表示するコマンド。
MODULE_LICENSEやMODULE_DESCRIPTION等のマクロで埋め込まれた情報と、module_paramの一覧、依存関係を.koファイルから読み出して表示する。ロード前にモジュールの素性を確認する道具。
modprobeもっどぷろーぶ
依存関係を自動で解決しながら、カーネルモジュールを組み込み・取り外しするコマンド。
モジュールAがBを必要とするなら、Bも自動で先に読み込んでくれる。依存情報はdepmodが作るデータベースを参照するため、/lib/modules配下に正しく配置されたモジュールが対象。ファイルパス指定で単発読み込みするinsmodとの違いが定番の混同点。
MODULE_LICENSEもじゅーるらいせんす
カーネルモジュールが従うライセンスを、カーネルに宣言するためのマクロ。
ソースコードに MODULE_LICENSE("GPL") のように書く。宣言がない、またはGPLと非互換だとカーネルが「汚染(taint)」扱いになり、GPL限定で公開されているカーネル内関数が使えなくなる。モジュール作成の雛形に必ず入る1行。
module_paramもじゅーるぱらむ
カーネルモジュールに外から値を渡せるパラメータを定義するマクロ。
変数名・型・sysfs上の権限を指定して宣言すると、「insmod mymod.ko value=10」のように組み込み時に値を渡せる。組み込み後も/sys/module配下のファイル経由で読み書きできる場合がある。ビルドし直さずに動作を調整したいときに便利。
obj-mおぶじぇくとえむ
Makefile でモジュールとしてビルドする対象を指定する記述。
obj-m := hello.o のように、ソース名の拡張子を .o にした形で書く。kbuild がこの .o をもとに最終的な .ko を生成する。
printkぷりんとけー
カーネル空間で使うログ出力関数。ユーザ空間の printf に相当。
出力先はカーネルリングバッファで、dmesg や journalctl で読む。KERN_INFO・KERN_ERR などのログレベルを先頭に付けて重要度を示せる。
printkぷりんとけー
カーネル内部からログメッセージを出す関数で、ユーザ空間のprintfに相当する。
カーネル空間では標準Cライブラリが使えないため、printfの代わりにこれを使う。KERN_INFOなどのログレベルを付けて重要度を区別でき、出力はdmesgで確認する。printfと違って画面に直接出ないことに戸惑うのが初学者の定番のつまずき。
probeぷろーぶ
対応するデバイスが見つかったときにカーネルから呼ばれるドライバの初期化関数。
ドライバ登録の瞬間ではなく「デバイスとドライバが結び付いた瞬間」に呼ばれるのが要点。ここでレジスタの初期化や資源の確保を行う。Device Treeのcompatible文字列との一致がマッチングの典型条件。
put_userぷっとゆーざー
カーネル空間の値を1つ、安全にユーザー空間の変数へ書き込むマクロ。
get_userの書き込み版で、アドレスが不正なら-EFAULTを返す。ioctlハンドラで結果の数値を1個だけ返す場面などで使う。まとまったサイズの転送はcopy_to_userが担当する。
request_mem_regionりくえすとめむりーじょん
物理メモリ領域(レジスタ範囲)の使用権を宣言して予約するカーネル関数。
同じレジスタ領域を複数のドライバが触る事故を防ぐための登録制度で、予約状況は/proc/iomemに載る。ioremapの前に呼び、解放はrelease_mem_region。ハード的な保護ではなく、あくまで登録による排他である。
rmmodあーるえむもっど
組み込み済みのカーネルモジュールを、カーネルから取り外すコマンド。
remove moduleの略で、取り外すときにモジュールの終了処理(exit関数)が呼ばれる。デバイスを開いているプロセスがいるなど使用中のモジュールは外せずエラーになる。insmodとセットで、自作ドライバを直しては入れ直す反復テストに使う。
SoCえすおーしー
CPUコアと周辺回路を1つのチップに集積したSystem on a Chipの略。
Raspberry PiのBCMシリーズのように、CPU・メモリコントローラ・GPIO・I2Cコントローラ等が1チップに収まる。同じARMコアでも周辺回路の構成はSoCごとに違うため、Device Treeで構成をカーネルへ伝える。
SPIえすぴーあい
クロック同期式でマスタとスレーブが全二重通信するシリアルバス規格。
SCLK・MOSI・MISO・CSの4線を使い、I2Cより高速な代わりに配線が多い。通信相手の選択はアドレスではなくCS線の電気的な選択で行う。Linuxではspidevや、spi_sync等のカーネルAPI経由で扱う。
sysfsしすえふえす
カーネル内部の情報や設定を、/sys以下のファイルとして見せる仮想ファイルシステム。
デバイスやドライバの状態がディレクトリ構造で整理され、catやechoで読み書きできる。ドライバに属性ファイルを追加すれば、専用ツールなしで動作パラメータを操作できる。実体はメモリ上にあり、ディスク上のファイルではない点に注意。
udevゆーでぶ
機器の接続・切断に応じて /dev のデバイスファイルを動的に管理する仕組み。
昔は /dev に全デバイスファイルを静的に並べていたが、今は udev が実際に存在する機器の分だけ作る。ルールで名前付けや権限を制御できる。
udevゆーでぶ
デバイスの接続・切断を検知し、/dev下のデバイスファイルを自動で作成・削除する仕組み。
ユーザ空間で動くデーモンで、カーネルからのイベント(uevent)を受けて動作する。ルールファイルを書けばデバイスファイルの名前や権限を自由に決められる。USB機器を挿すと/devにファイルが現れるのはこの働きで、mknodによる手動作成を置き換えた。
UIOゆーあいおー
デバイス制御の大部分をユーザー空間プログラムで行うための軽量ドライバ枠組み。
Userspace I/Oの略。カーネル側は割込みの通知とレジスタ領域のメモリマップ提供だけを担い、実際の制御はmmapしたユーザープログラムが行う。本格的なドライバを書くまでもない独自ハードの制御に向く。
カーネルシンボルかーねるしんぼる
カーネルやモジュールが外部のモジュールへ公開している関数・変数の名前。
EXPORT_SYMBOLで公開されたシンボルだけが他のモジュールから利用できる。EXPORT_SYMBOL_GPLはGPL互換ライセンスのモジュール限定になる。現在の一覧は/proc/kallsymsで確認できる。
カーネルスレッドかーねるすれっど
ユーザー空間を持たず、カーネル内部の処理だけを実行し続けるスレッド。
kthread_run等で生成し、ドライバのポーリング処理やワークキューの実行役として働く。psコマンドで[kworker]のように角括弧付きで表示されるのがこれ。通常のプロセスと違いユーザー空間のメモリを持たない。
カーネルモジュールかーねるもじゅーる
あとからカーネルに着脱できる拡張機能。多くのドライバはこの形。
拡張子は .ko。insmod / modprobe で組み込み、rmmod / modprobe -r で外す。カーネルを再ビルドせずに機能を追加でき、ドライバ開発の基本単位になる。
カーネルモジュールかーねるもじゅーる
動作中のカーネルに後から組み込んだり取り外したりできる、部品化されたプログラム。
デバイスドライバの多くはこの形式で作られ、insmodやmodprobeで動作中のカーネルへ組み込める。再起動やカーネル本体の作り直しなしに機能を追加できるのが利点。ただしカーネル空間で動くため、バグがあるとシステム全体を巻き込んで停止することがある。
カーネル空間かーねるくうかん
カーネルやドライバが動く特権領域。アプリのユーザ空間とは分離される。
ハードウェアへ直接アクセスできる強い権限を持つ反面、ここでの不具合はシステム全体を巻き込みやすい。モジュールはこのカーネル空間で実行される。
カーネル空間かーねるくうかん
カーネル本体とデバイスドライバが動作する、特権を持つメモリ領域と実行環境。
ハードウェアやメモリ全体へアクセスできる強い権限を持つ反面、バグがシステム全体の停止(カーネルパニック)に直結する。ユーザ空間とはメモリが分離されており、データの受け渡しにはcopy_to_userなどの専用関数を使う必要がある。
キャラクタデバイスきゃらくたでばいす
1バイトずつ順番にやり取りする機器。ls -l の先頭が c。
キーボード・シリアルポート・端末などが該当。バッファ単位ではなくストリーム的に読み書きする。自作ドライバの最初の題材として扱いやすい。
キャラクタデバイスきゃらくたでばいす
端末やセンサのように、データをバイト列の流れとして順に読み書きする種類のデバイス。
シリアルポートやキーボードなどが該当し、ls -lで見ると行の先頭が「c」と表示される。自作ドライバの入門はほぼキャラクタデバイスから始まる。ブロック単位でランダムアクセスするストレージ系のブロックデバイスとの対比で覚える。
ジフィーズじふぃーず
カーネルが起動からのタイマ割込み回数を数えているグローバルカウンタ。
グローバル変数jiffiesは1秒間にHZ回増える。「今から100ms後」はjiffies + HZ/10のように計算し、カーネルタイマやタイムアウト判定に使う。オーバーフロー対策としてtime_after等の比較マクロを使うのが作法。
チャタリングちゃたりんぐ
スイッチの接点が切り替わる瞬間に、ONとOFFが細かく繰り返される現象。
機械接点のバウンドが原因で、数ミリ秒の間に複数回のエッジが発生する。GPIO割込みでボタン押下を数えると1回の操作が多重カウントされる典型的な要因であり、デバウンス処理で取り除く。
デバイスツリーでばいすつりー
基板に載っているハードウェアの構成を、カーネルへ伝えるための木構造のデータ。
組込み機器ではPCと違いハードウェアを自動検出できないことが多く、どのアドレスに何がつながっているかを記述して起動時にカーネルへ渡す。ソース(.dts)をコンパイルしたバイナリ(.dtb)が使われる。Raspberry Piの周辺機器設定でも登場する。
デバイスファイルでばいすふぁいる
ハードウェアをファイルとして扱うための特殊ファイル。/dev にある。
「すべてはファイル」の思想に基づく入口。read / write するとドライバ経由で機器を操作できる。メジャー・マイナー番号で担当ドライバと結びつく。
デバイス番号でばいすばんごう
デバイスファイルと担当ドライバを結びつける番号で、メジャー番号とマイナー番号の組。
アプリが/dev/xxxを開くと、カーネルはこの番号を手がかりに担当ドライバの処理関数を呼び出す。ls -lでデバイスファイルを見ると、サイズの位置に2つの番号が表示される。プログラム上はdev_t型で表し、上位がメジャー・下位がマイナーに対応する。
デバウンスでばうんす
チャタリングによる誤検出を取り除き、1回の操作を1回と数えるための処理。
一定時間内の再変化を無視する、タイマで信号が安定してから再サンプルするなどの方式がある。ドライバではカーネルタイマやワークキューで実装するほか、GPIOサブシステムのデバウンス設定を使える場合もある。
ブロックデバイスぶろっくでばいす
決まった大きさの塊単位でランダムアクセスする機器。ls -l の先頭が b。
ディスクやSSDが代表。ブロック単位で読み書きし、キャッシュやスケジューラを介して効率化される。ファイルシステムはこの上に構築される。
ブロックデバイスぶろっくでばいす
HDDやSSDのように、一定サイズのブロック単位でデータを読み書きする種類のデバイス。
ストレージ類が該当し、好きな位置へのランダムアクセスとバッファリングを前提とする。ls -lで見ると行の先頭が「b」と表示される。1バイトずつ順番に流れるキャラクタデバイスとの区別は、デバイス分類の基本として頻出する。
ペリフェラルぺりふぇらる
CPUコアの周辺に置かれたGPIO・UART・タイマなどの機能回路の総称。
それぞれが物理アドレス上のレジスタ群として見え、レジスタへの読み書きで制御する。データシートのペリフェラル章とレジスタマップを読み解くことが、デバイスドライバ開発の出発点になる。
ポーリングぽーりんぐ
デバイスに変化がないかを、一定間隔で繰り返し問い合わせて確認する方式。
作りが単純で確実だが、変化がない間も確認し続けるためCPU時間を消費する。対になるのが、イベント発生時にだけ動く割り込み方式。変化が非常に頻繁な場合や割り込みが使えない場面ではポーリングが有利なこともあり、使い分けが設計の要点になる。
マイナー番号まいなーばんごう
デバイス番号のうち、同じドライバが扱う複数の装置を個別に区別する側の番号。
例えば同じ種類のシリアルポートが4つあれば、メジャー番号は共通でマイナー番号0〜3で区別する。ドライバはopen時に渡される情報からマイナー番号を取り出し、どの装置への操作なのかを判定して処理を切り替える。
メジャー番号めじゃーばんごう
デバイス番号のうち、どのドライバがそのデバイスを担当するかを決める側の番号。
1つのドライバが1つのメジャー番号を受け持つのが基本形。自作ドライバでは、alloc_chrdev_regionで空き番号を動的に確保する方法が推奨される。個々の装置を区別するのはマイナー番号の役目で、両者の分担を混同しやすい。
メジャー番号/マイナー番号めじゃーばんごうまいなーばんごう
デバイスを識別する2つの番号。メジャー=担当ドライバ、マイナー=何番目の機器か。
ls -l /dev でサイズの位置に「8, 0」のように表示される。同じドライバ配下の複数機器をマイナー番号で区別する。mknod で番号を指定してファイルを作ることもできる。
モジュールパラメータもじゅーるぱらめーた
insmod時やカーネル起動時に、外から値を渡せるモジュールの設定変数。
module_paramマクロで宣言すると「insmod mydrv.ko debug=1」のように指定でき、/sys/module/以下から実行中に参照できる。再コンパイルせずにドライバの動作を切り替える定番の手段。
モジュール依存関係もじゅーるいぞんかんけい
あるモジュールが別のモジュールの機能を必要とする関係。
modprobe はこの依存を depmod が作った一覧をもとに自動でたどり、必要なモジュールを先に読み込む。insmod は依存を解決しないため、単体で扱うとき以外は modprobe が安全。
ユーザ空間ゆーざくうかん
一般のアプリケーションが動作する、カーネルから隔離・保護された実行環境。
ハードウェアへの直接アクセスは許されず、必要ならシステムコールを通じてカーネルに依頼する。プログラムが暴走しても他のプロセスやカーネルに波及しにくい。ドライバ開発では「ユーザ空間のポインタはカーネルから直接触れない」点が重要になる。
ユーザ空間ポインタゆーざくうかんぽいんた
read/write ハンドラに渡る、アプリ側のアドレス。直接触れない。
カーネル空間で動くドライバがこのアドレスをそのまま読み書きすると事故につながる。put_user / get_user / copy_to_user / copy_from_user を介して安全にやり取りする。
ログレベルろぐれべる
printk のメッセージに付ける緊急度の印。8段階ある。
0=EMERG が最も深刻、7=DEBUG が最も軽い。数字が小さいほど緊急度が高い。/proc/sys/kernel/printk のしきい値で、どのレベルまでコンソールに出すかが決まる。
ログレベルろぐれべる
printkメッセージの重要度を示す8段階(KERN_EMERG〜KERN_DEBUG)の区分。
レベルによってコンソールへ即時表示されるかが決まり、dmesgでは全て確認できる。pr_infoやdev_errなどレベル込みのラッパーを使うのが現代の作法。表示の閾値は/proc/sys/kernel/printkで調整する。
ワークキューわーくきゅー
後回しにしたい処理をカーネルスレッドに実行させる遅延実行の仕組み。
割込みハンドラでは時間のかかる処理やスリープする処理ができないため、work_structを積んでおきカーネルスレッドの文脈で後から実行させる。スリープできる点がタスクレットやsoftirqとの大きな違い。
仮想アドレスかそうあどれす
MMUによるアドレス変換を前提とした、プログラムから見える論理的な番地。
各プロセスは同じ番地でも別々の物理メモリを指す独立した空間を持つ。ドライバでペリフェラルを触るときも物理アドレスを直接は使えず、ioremapで仮想アドレスへ変換してからアクセスする。
割り込みわりこみ
ハードウェアがCPUへ「今すぐ対応してほしい」と知らせ、処理を切り替えさせる仕組み。
ボタン押下やデータ到着の瞬間にだけ処理を走らせるため、常に監視し続けるポーリングよりCPUを無駄にしない。ドライバでは割り込みハンドラを登録して応答するが、ハンドラの中では長い処理や待ち(スリープ)が許されないという制約がある。
物理アドレスぶつりあどれす
メモリチップやペリフェラルが実際に配置されている、ハードウェア上の本当の番地。
SoCのデータシートに載っているレジスタアドレスはこの物理アドレス。MMUが有効なカーネルやアプリからは直接触れないため、ioremapやmmapで仮想アドレスへ対応付けてからアクセスする。

▶ 学習アプリで「引く」を使う