トレーニング > IoT&組み込み開発 >組み込みLinuxデバイスドライバーの開発(LFD435)
インストラクター主導のコース

Developing Embedded Linux Device Drivers (LFD435)

組み込み Linux システム用のデバイス ドライバーを開発します。RISC-V ベースのエミュレートされた開発ターゲットを使用したハンズオン ラボを通じて、Linux カーネルの基本的な知識を習得します。このコースでは、経験豊富なプログラマーが実践的な実地経験を積んでデバイス ドライバーを構築および改良できるようにします。

対象者

このコースは、組み込みLinuxシステム用のデバイスドライバーを開発する必要がある経験豊富な開発者を対象としています。
折りたたむ 続きを読む
学習内容

この資料を習得すると、Linuxで使用されるさまざまな種類のデバイスドライバーに慣れ、デバイスドライバーを作成するときに使用される適切なAPIの多くが紹介されます。これらの概念を説明するためのラボはすべて、ARMハードウェアで実行され、組み込みターゲット用のドライバーのクロスコンパイルと開発に慣れ親しむことができます。
折りたたむ 続きを読む
身につく知識

このコースでは、組み込みLinuxシステム用のデバイスドライバーを開発する準備を行います。
折りたたむ 続きを読む
おもなテーマ
すべて展開
すべて折りたたむ
はじめに
- 目的
- 対象受講者
- The Linux Foundation
-著作権および機密情報なし
- Linux Foundationトレーニング
- 認定プログラムおよびデジタルバッジ
- Linuxディストリビューション
- システムの準備
- Linuxにおける変化
- ドキュメントとリンク
準備
- プロシージャ
-カーネルバージョン
-カーネルソースとgitの使用
-ハードウェア
-ステージングツリー
- 演習
OSSプロジェクトでの作業方法**
- 適切に貢献するには
-コードがどこから来ているかを知る:DCOとCLA
- メインラインの近くでセキュリティと品質を保つ
- プロジェクトのDNAを研究して理解する
- スクラッチするべき部分を見つけ出す
- メンテナーおよび彼らのワークフローやメソッドを特定する
- 早い段階で意見を訊き、オープンに作業する
- 大きなコード ダンプではなく、差分のコードをコントリビュートする
- エゴを捨てよう。敏感にならないように。
- 忍耐強く、長期的な関係を築き、助けの手を差し伸べよう
クロス開発ツールチェーン
-コンパイラトリプレット
-組み込みのLinuxディストリビューションクロスコンパイラ
-リナロ
-CodeSourcery
--crosstool-ng
-ビルドルート
-OpenEmbedded
-Yocto Project
- 演習
QEMU
-QEMUとは何ですか?
-なぜQEMUを使用するのですか?
-エミュレートされたアーキテクチャ
-画像フォーマット
- 演習
uSDからのターゲット開発ボードの起動
-なぜuSDカードを使用するのですか?
-SWをuSDカードに取り込む
-フラッシュからの起動
-なぜuSDカードを使用するのは悪い考えですか?
- 演習
イーサネットを介したターゲット開発ボードの起動
-仮想ハードウェアの使用
-開発するためのより簡単な方法
-TFTPおよびNFSrootを使用したブートシーケンス
-ラボの目的
- 演習
カーネル構成、コンパイル、起動
-開発ボード用のカーネルの構成
- 演習
デバイスドライバー
-デバイスの種類
-メカニズムとポリシー
-バイナリブロブの回避
- パワー管理
-アプリケーションがデバイスドライバーを使用する方法
-デバイスにアクセスするシステムコールをウォークスルーする
-エラー番号
--printk()
-devres:管理対象デバイスリソース
- 演習
モジュールとデバイスドライバー
-モジュールdriver()マクロ
-モジュールとホットプラグ
- 演習
メモリ管理と割り当て
-仮想メモリと物理メモリ
-メモリゾーン
-ページテーブル
--kmalloc()
-無料のページを取得()
--vmalloc()
-スラブとキャッシュの割り当て
- 演習
キャラクターデバイス
-デバイス ノード
-メジャー番号とマイナー番号
-メジャー/マイナー番号の予約
-デバイスノードへのアクセス
-デバイスの登録
--udev
-dev printk()およびAssociates
-ファイル操作の構造
-ドライバーエントリポイント
-ファイルとiノードの構造
-その他のキャラクタードライバー
- 演習
カーネル機能
-カーネルのコンポーネント
-ユーザースペースとカーネルスペース
-システムコールとは何ですか?
-利用可能なシステムコール
-スケジューリングアルゴリズムとタスク構造
-プロセスコンテキスト
- 演習
ユーザー空間とカーネル空間の間の転送
-スペース間の転送
--put(get)user()およびcopy to(from)user()
-直接転送:カーネルI / Oとメモリマッピング
-カーネルI / O
-ユーザーページのマッピング
-メモリマッピング
--mmap()のユーザースペース関数
-mmap()のドライバーエントリポイント
-カーネルからファイルにアクセスする
- 演習
プラットフォームドライバー
-プラットフォームドライバーとは何ですか?
-主なデータ構造
-プラットフォームデバイスの登録
- 例
-ハードコードされたプラットフォームデータ
-新しい方法:デバイスツリー
- 演習
デバイスツリー
-デバイスツリーとは何ですか?
-デバイスツリーが実行することと実行しないこと
-デバイスツリーの構文
-デバイスツリーウォークスルー
-デバイスツリーバインディング
-ブートローダーでのデバイスツリーのサポート
-ドライバーでのデバイスツリーデータの使用
-古いドライバーの共存と変換
- 演習
割り込みと例外
-割り込みと例外とは何ですか?
-例外
-非同期割り込み
-MSI
-割り込みの有効化/無効化
-割り込み時にできないこと
-IRQデータ構造
-割り込みハンドラのインストール
- 演習
タイミング測定
-タイミング測定の種類
-ジフィー
-現在の時刻を取得する
-クロックソース
- リアルタイムクロック
-プログラム可能なインターバルタイマー
-タイムスタンプカウンター
-HPET
-ティックレスになる
カーネルタイマー
-遅延の挿入
-カーネルタイマーとは何ですか?
-低解像度タイマー機能
-低解像度タイマーの実装
-高解像度タイマー
-高解像度タイマーの使用
- 演習
ioctl
-ioctlとは何ですか?
-ioctlのドライバーエントリポイント
-ioctlの定義
- 演習
統合デバイスモデルとsysfs
-統合デバイスモデル
-基本構造
-実際のデバイス
-sysfs
-ksetとkobjectの例
- 演習
ファームウェア
-ファームウェアとは何ですか?
-ファームウェアのロード
- 演習
スリープおよび待機キュー
-待機キューとは何ですか?
-眠りにつくと目を覚ます
-スリープの詳細に移動
-排他的な睡眠
-ウェイクアップの詳細
-ポーリング
- 演習
割り込み処理:遅延可能関数とユーザードライバー
-上半分と下半分
-Softirqs
-タスクレット
-作業キュー
-新しいワークキューAPI
-カーネルスレッドの作成
-スレッド化された割り込みハンドラ
-ユーザースペースでの割り込み処理
- 演習
ハードウェアI / O
-メモリバリア
-I / Oメモリの割り当てとマッピング
-I / Oメモリへのアクセス
ダイレクトメモリアクセス(DMA)**
-DMAとは何ですか?
-DMAをユーザーに直接送信
-DMAと割り込み
-DMAメモリの制約
-DMAマスク
-DMA API
-DMAプール
-スキャッター/ギャザーマッピング
- 演習
メモリテクノロジーデバイス(フラッシュメモリファイルシステム)
-MTDデバイスとは何ですか?
-NAND vs. NOR vs. eMMC
-ドライバーおよびユーザーモジュール
-フラッシュファイルシステム
USBドライバー
-USBとは?
-USBトポロジ
- 用語解説
-エンドポイント
-記述子
-USBデバイスクラス
-LinuxでのUSBサポート
-USBデバイスドライバーの登録
-データの移動
-USBドライバーの例
- 演習
最後に
- 評価サーベイ
カーネルアーキテクチャI
-UNIXおよびLinux **
-モノリシックカーネルとマイクロカーネル
-オブジェクト指向メソッド
-メインカーネルコンポーネント
-ユーザースペースとカーネルスペース
カーネルプログラミングプレビュー
-タスク構造
-メモリ割り当て
-ユーザースペースとカーネルスペース間でのデータの転送
-オブジェクト指向の継承-一種の
-リンクリスト
-ジフィー
- 演習
モジュール
-モジュールとは何ですか?
-ささいな例
-モジュールのコンパイル
-モジュールと組み込み
-モジュール ユーティリティ
-自動モジュールロード
-モジュール使用回数
-モジュールライセンス
-シンボルのエクスポート
-シンボルの解決**
- 演習
カーネルアーキテクチャII
-プロセス、スレッド、およびタスク
-カーネルプリエンプション
-リアルタイムプリエンプションパッチ
- 演習
カーネルの構成とコンパイル
-カーネルソースのインストールとレイアウト
-カーネルブラウザ
-カーネル構成ファイル
-カーネル構築とMakefiles
--initrdおよびinitramfs
- 演習
カーネルスタイルと一般的な考慮事項
-コーディングスタイル
-一般的なカーネルルーチンとメソッドの使用
-カーネルパッチの作成
-まばら
-possible()とlikely()の使用
-ポータブルコードの記述、CPU、32/64ビット、エンディアン
-SMPの作成
-ハイメモリシステム向けの書き込み
- パワー管理
-セキュリティを念頭に置いて
- 演習
競合状態と同期方法
-並行性と同期の方法
-不可分操作
-ビット演算
-スピンロック
-Seqlocks
-プリエンプションの無効化
-ミューテックス
-セマフォ
-完了関数
-リードコピーアップデート(RCU)
-参照カウント
- 演習
メモリアドレッシング
-仮想メモリ管理
-MMUとTLBがあるシステムとないシステム
-メモリアドレス
-高メモリと低メモリ
-メモリゾーン
-特別なデバイスノード
-NUMA
-ページング
-ページテーブル
-ページ構造
- 演習
メモリ割り当て
-ページのリクエストとリリース
- バディシステム
-スラブとキャッシュの割り当て
-メモリプール
--kmalloc()
--vmalloc()
-早期割り当てとbootmem()
-メモリの最適化
- 演習

**
これらのセクションは、部分的にまたは全体を
オプションとして考えることができます。これらのセクションには、
背景となる参考資料、専門的なトピック、または高度なテーマが含まれています。
講師は、教室での経験や時間の制約に応じて、
これらをカバーするかしないかを選択することができます。
前提条件
このコースを最大限に活用するには、次のものが必要です。

モジュールの作成、コンパイル、ロード、アンロード、同期プリミティブの使用方法、LFD420(Kernel Internals and Development)が提供するメモリの割り当てと管理の基本など、基本的なカーネルインターフェイスとメソッドの知識。クラスの前に、クラス前の準備資料が提供されます。

レビュー
2024年9月
このコースに含まれる知識の幅広さが気に入りました。
2024年9月
私が最も興味を持ったのは、モジュールの構築、ロード、アンロード、デバイス ツリー、およびユーザー空間 IO です。
2024年9月
教えられた内容に基づいてコードを記述し、ソフトウェアを実行できること。
2024年9月
デバイスツリーと割り込みに関するトピックは興味深いものでした。
2024年9月
私は、Leo が提供する実践的でインタラクティブな体験が気に入っています。
2024年9月
私の質問には非常に満足のいく回答が得られました。
2024年8月
私は実験がとても気に入りました。6 時間の講義とその後の実験ではなく、実験が毎日分散して行われました。
2024年8月
Linux の概念についてのわかりやすい説明。
2024年8月
全体的にコースをとても楽しみました。講師はとても感じがよく、丁寧でした。楽しい雰囲気と質問に喜んで答えてくれたことに感謝しています。講師は教材をよく理解しており、知識を伝えることができました。
2024年8月
すべてが細分化されている点が気に入りました。背景情報についてさらに詳しく説明する必要がある場合は、付録を参照してください。
2024年8月
私たちは細かいところまで掘り下げ、彼は物事がどのように機能するかを説明しました。私は、抽象化に任せて、物事がただ機能するのを信頼するのではなく、デバイス ドライバーの「方法」、「内容」、「理由」を理解して立ち去ります。また、自宅の Linux マシン用に、いじくり回すために独自のモジュール/ドライバーを作成することも検討しています。
2024年8月
実践的なラボが好きです
2024年8月
インストラクターはフレンドリーで親切でした。実験を行うのに十分な時間が与えられました。
2024年8月
このクラスでは、Linux カーネル ドライバーをゼロから作成するために必要な多くの資料が取り上げられました。さらに、特に Linux の観点から、他の多くのソフトウェア エンジニアの知識も取り上げられました。知識の量と深さはどちらも適切でした。
2024年8月
講師は、私が理解できるペースで話し、質問に答え、私が愚かだと思った質問をしても恥ずかしくないほどフレンドリーでした。
2024年8月
今まで知らなかった新しい概念をたくさん学ぶことができてよかったです。説明はとても明確で、カーネルに組み込まれたドライバーがカーネル モジュールを単純に構築するよりも有利または不利になる場合など、機能やアプローチが使用される場合の例を示してくれました。インストラクターが実際のアプリケーションや経験を取り入れてくれるこのようなことは、素晴らしいリソースです。
2024年8月
テストしたときにラボが機能しているのが見れてよかったです。自分でもぜひ試してみたいと思います。
2024年8月
総合的なアプローチ。一般的に、Linux と C プログラミングに精通している人なら誰でもこのコースを受講でき、そのほとんどを理解できます。
2024年8月
カーネルレベルのプログラミングについて多くを学び、興味をそそられたトピックについて講師にさらに情報を自由に質問することができました。
2024年8月
インストラクターがドライバー開発とカーネルプログラミングの実務経験を持っていることはありがたいです。こうした経験について聞くのは役に立ちます。また、トレーニングマニュアルを補足するためにインストラクターが作成したオンザフライの図も気に入りました。
2024年8月
このコースで QEMU が使用されたのは良かったです。QEMU を使用してハードウェアをエミュレートする方法を知ることができました。
2024年6月
講師は主題に十分精通しており、快適なペースでコースを実施しました。
2024年6月
提供されたソリューションはよく考えられており、このコースを再受講するときに非常に役立ちます。
2024年6月
John は、組み込みシステム向け Linux ドライバー開発に関する素晴らしいクラスを提供しました。彼は 1 週間を通してすべての質問に答え、ユーモアとプロ意識を持ってクラスを進めました。私は迷わず彼をトレーナーとして推薦します。
2024年6月
このコースでは重要なトピック領域がすべて網羅されているだけでなく、各領域が十分に深く掘り下げられている点が気に入っています。
2024年6月
概念と原則を教え、その後に実験を行うという形式。実験のソリューションは素晴らしく、不可欠であると私は信じており、私の経験からすると効果的です。