組み込みLinuxデバイスドライバー:それらの役割を理解する
編集者注:組み込みLinuxは、組み込みシステムの設計で使用されるトップオペレーティングシステムの中で一貫してランク付けされています。モノのインターネット(IoT)への関心が急速に高まっているため、組み込みLinuxが複数の役割を果たしていることは、IoTアプリケーション階層の各層に見られる多様なニーズをサポートする上で不可欠です。次に、組み込みLinuxシステムを習得するエンジニアの能力は、より洗練されたシステムの迅速で信頼性の高い開発を実現するために重要になります。 『Mastering Embedded Linux Programming – Second Edition』では、著者のChris Simmondsが読者を対象に、この重要なオペレーティングシステムの幅と深さを詳細に説明し、詳細な例を使用して各重要なポイントを説明します。
この本の第9章の抜粋では、著者はカーネルデバイスドライバーがシステムハードウェアとどのように相互作用するか、および開発者がデバイスドライバーを作成してアプリケーションで使用する方法について説明しています。次の記事では、組み込みLinuxデバイスドライバーに関するこの抜粋を示します。
•役割を理解する
•実行時にドライバーの状態を読み取る
•ユーザースペースのデバイスドライバー
•カーネルデバイスドライバーの作成
•ハードウェア構成の検出
から適応 埋め込みLinuxプログラミングの習得–第2版、ChrisSimmonds著。
第9章デバイスドライバーとのインターフェース
カーネルデバイスドライバーは、基盤となるハードウェアがシステムの残りの部分に公開されるメカニズムです。組み込みシステムの開発者は、これらのデバイスドライバーがアーキテクチャ全体にどのように適合するか、およびユーザースペースプログラムからそれらにアクセスする方法を知る必要があります。システムにはおそらくいくつかの新しいハードウェアがあり、それらにアクセスする方法を考え出す必要があります。多くの場合、デバイスドライバーが提供されており、カーネルコードを記述しなくても必要なすべてを実行できます。たとえば、sysfs内のファイルを使用してGPIOピンとLEDを操作できます。また、 SPI(シリアルペリフェラルインターフェイス)などのシリアルバスにアクセスするためのライブラリがあります。 および私 2 C(相互統合回路)。
デバイスドライバーの作成方法を見つける場所はたくさんありますが、その理由とその際の選択肢について説明する場所はほとんどありません。これが私がここでカバーしたいことです。ただし、これはカーネルデバイスドライバーの作成に特化した本ではなく、ここに記載されている情報は、地域をナビゲートするのに役立つものであり、必ずしもそこに家を建てるのに役立つものではないことを忘れないでください。デバイスドライバの作成に役立つ優れた本や記事がたくさんあります。そのうちのいくつかは、この章の最後にリストされています。
この章では、次のトピックについて説明します。
-
デバイスドライバーの役割
-
キャラクターデバイス
-
デバイスをブロックする
-
ネットワークデバイス
-
実行時のドライバーについて調べる
-
適切なデバイスドライバーを見つける
-
ユーザースペースのデバイスドライバー
-
カーネルデバイスドライバーの作成
-
ハードウェア構成の検出
デバイスドライバーの役割
第4章で述べたように、カーネルの構成と構築 、カーネルの機能の1つは、コンピュータシステムの多くのハードウェアインターフェイスをカプセル化し、それらを一貫した方法でユーザースペースプログラムに提示することです。カーネルには、デバイスドライバーを簡単に作成できるように設計されたフレームワークがあります。これは、上のカーネルと下のハードウェアの間を仲介するコードです。デバイスドライバーは、UARTやMMCコントローラーなどの物理デバイスを制御するために作成される場合もあれば、nullデバイス(/ dev / null)やramdiskなどの仮想デバイスを表す場合もあります。 1人のドライバーが同じ種類の複数のデバイスを制御できます。
カーネルデバイスドライバーコードは、カーネルの他の部分と同様に、高い特権レベルで実行されます。プロセッサのアドレス空間とハードウェアレジスタに完全にアクセスできます。割り込みとDMA転送を処理できます。同期とメモリ管理のために高度なカーネルインフラストラクチャを利用できます。ただし、これには欠点があることに注意する必要があります。バグのあるドライバーで問題が発生した場合、それは本当に問題になり、システムをダウンさせる可能性があります。したがって、実際の決定が行われるアプリケーションに情報を提供するだけで、デバイスドライバーを可能な限りシンプルにする必要があるという原則があります。これがカーネルにポリシーがないと表現されるのをよく耳にします。 。システムの全体的な動作を管理するポリシーを設定するのは、ユーザースペースの責任です。たとえば、新しいUSBデバイスの接続など、外部イベントに応答するカーネルモジュールのロードは、カーネルではなく、ユーザースペースプログラムudevの責任です。カーネルは、カーネルモジュールをロードする手段を提供するだけです。
Linuxには、主に3つのタイプのデバイスドライバーがあります。
-
文字 :これは、豊富な機能とアプリケーションコードとドライバーの間に薄いレイヤーを備えたバッファーなしI / O用です。これは、カスタムデバイスドライバーを実装する際の最初の選択肢です。
-
ブロック :これには、大容量記憶装置との間のブロックI / O用に調整されたインターフェースがあります。ディスクの読み取りと書き込みを可能な限り高速化するように設計されたバッファリングの厚い層があり、他の用途には適していません。
-
ネットワーク :これはブロックデバイスに似ていますが、ディスクブロックではなくネットワークパケットの送受信に使用されます。
疑似ファイルシステムの1つにあるファイルのグループとして表示される4番目のタイプもあります。たとえば、この章の後半で説明するように、/ sys / class / gpio内のファイルのグループを介してGPIOドライバーにアクセスできます。まず、3つの基本的なデバイスタイプについて詳しく見ていきましょう。
キャラクターデバイス
キャラクターデバイスは、デバイスノードと呼ばれる特別なファイルによってユーザースペースで識別されます 。このファイル名は、関連付けられているメジャー番号とマイナー番号を使用してデバイスドライバーにマップされます。大まかに言えば、主要な数 デバイスノードを特定のデバイスドライバーにマップし、マイナー番号 アクセスされているインターフェースをドライバーに通知します。たとえば、ARM VersatilePBの最初のシリアルポートのデバイスノードの名前は/ dev / ttyAMA0で、メジャー番号は204、マイナー番号は64です。2番目のシリアルポートのデバイスノードのメジャー番号は同じです。は同じデバイスドライバによって処理されますが、マイナー番号は65です。次のディレクトリリストから、4つのシリアルポートすべての番号を確認できます。
#ls -l / dev / ttyAMA * crw-rw ---- 1ルートルート204、64 Jan 1 1970 / dev / ttyAMA0crw-rw ---- 1ルートルート204、65 Jan 1 1970 / dev / ttyAMA1crw-rw ---- 1ルートルート204、66 Jan 1 1970 / dev / ttyAMA2crw-rw ---- 1ルートルート204、67 Jan 1 1970 / dev / ttyAMA3
標準のメジャー番号とマイナー番号のリストは、Documentation /devices.txtのカーネルドキュメントにあります。リストはあまり頻繁に更新されず、前の段落で説明したttyAMAデバイスは含まれていません。それでも、drivers / tty / serial / amba-pl011.cのカーネルソースコードを見ると、メジャー番号とマイナー番号が宣言されている場所がわかります。
#define SERIAL_AMBA_MAJOR 204 #define SERIAL_AMBA_MINOR 64
ttyAMAドライバーのように、デバイスのインスタンスが複数ある場合、デバイスノードの名前を形成するための規則は、ベース名ttyAMAを取り、この例では0から3までのインスタンス番号を追加することです。
第5章で述べたように、ルートファイルシステムの構築 、デバイスノードはいくつかの方法で作成できます:
-
devtmpfs:デバイスドライバーがドライバーによって提供されたベース名(ttyAMA)を使用して新しいデバイスインターフェイスを登録すると、デバイスノードが作成されます。インスタンス番号。
-
udevまたはmdev(devtmpfsなし):基本的にdevtmpfsと同じですが、ユーザースペースデーモンプログラムがデバイス名を抽出する必要がある点が異なります。 sysfsからノードを作成します。 sysfsについて話します
-
mknod:静的デバイスノードを使用している場合、それらはmknodを使用して手動で作成されます。
上記で使用した数値から、メジャー番号とマイナー番号の両方が0〜255の範囲の8ビット番号であるという印象を受けるかもしれません。実際、Linux 2.6以降、メジャー番号は12ビット長であり、有効な番号になります。 1から4,095まで、マイナー番号は0から1,048,575までの20ビットです。
埋め込み
- 自動車における組み込みシステムの役割
- IoTデバイスPCB製造におけるエポキシの多様な役割
- キーテクノロジーは、組み込みビジョンの成長する役割を強化します
- 組み込みLinuxのOTAアップデート、パート2 –既成のアップデートシステムの比較
- 組み込みLinuxのOTAアップデート、パート1 –基本と実装
- 組み込みLinuxデバイスドライバー:ハードウェア構成の検出
- オープンソースプラットフォームは、組み込みLinuxを備えたIoTをターゲットにしています
- ブログ:マイクロフルイディクス領域におけるPDMSの役割を理解する
- IoTから暗号ジャックへ:新しいモバイルデバイスの脅威を理解する
- IoTデバイス組み込みハードウェアハッキングの概要
- CAMのコンポーネントとCNC機械加工におけるそれらの役割