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

Developing Embedded Linux Device Drivers (LFD435)

このインストラクター主導のコースは、経験豊富なプログラマーに組み込みLinuxシステム用のデバイスドライバーを開発する方法を示し、Linuxカーネルの基本的な理解と知識を与えることを目的としています。 RISC-Vベースのエミュレートされた開発ターゲットを備えたハンズオンラボにより、学生はクラスで学んだことを実践できます。

対象者

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

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

このコースでは、組み込みLinuxシステム用のデバイスドライバーを開発する準備を行います。
少なく読む 続きを読む
おもなテーマ
すべて展開
すべて折りたたむ
前書き
目的
あなたは誰ですか
The Linux Foundation
Linux Foundationのトレーニング
認定プログラムとデジタルバッジ
Linuxディストリビューション
システムの準備
Linuxで物事が変わる
ドキュメントとリンク
予選
手続き
カーネルバージョン
カーネルソースとgitの使用
ハードウェア
OSSプロジェクトでの作業方法**
適切に貢献する方法の概要
セキュリティと品質のためにメインラインの近くにとどまる
プロジェクトDNAの研究と理解
スクラッチしたいものを把握する
メンテナーとそのワークフローと方法を特定する
初期の入力を取得し、オープンで作業する
大きなコードダンプではなく、増分ビットを提供する
ドアにあなたのエゴを残してください:薄皮にしないでください
忍耐強く、長期的な関係を築き、助けになる
クロス開発ツールチェーン
コンパイラートリプレット
組み込みのLinuxディストリビューションクロスコンパイラ
リナロ
CodeSourcery
クロスツール-ng
ビルドルート
OpenEmbedded
ヨクトプロジェクト
ラボ
QEMU
QEMUとは何ですか?
エミュレートされたアーキテクチャ
画像フォーマット
QEMUを使用する理由
ラボ
uSDからのターゲット開発ボードの起動
なぜuSDカードを使用するのですか?
uSDカードへのSWの取得
なぜuSDカードを使用するのは悪い考えですか?
ラボ
イーサネットを介したターゲット開発ボードの起動
仮想ハードウェアの使用
より簡単な開発方法
ラボの目的
ラボ
カーネル構成、コンパイル、起動
開発ボード用のカーネルの構成
ラボ
デバイスドライバ
デバイスの種類
メカニズムとポリシー
バイナリブロブの回避
パワー管理
アプリケーションがデバイスドライバーを使用する方法
デバイスにアクセスするシステムコールを歩く
エラー番号
printk()
devres:管理対象デバイスリソース
ラボ
モジュールとデバイスドライバー
module_driver()マクロ
モジュールとホットプラグ
ラボ
メモリ管理と割り当て
仮想メモリと物理メモリ
メモリゾーン
ページテーブル
kmalloc()
__get_free_pages()
vmalloc()
スラブとキャッシュの割り当て
ラボ
キャラクターデバイス
デバイスノード
メジャー番号とマイナー番号
メジャー/マイナー番号の予約
デバイスノードへのアクセス
デバイスの登録
udev
dev_printk()およびAssociates
file_operations構造体
ドライバーエントリポイント
ファイルと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ドライバーの例
ラボ
Closing and Evaluation Survey
評価調査
付録
uSDからのターゲット開発ボードの起動
ラボの目的
ラボ
カーネルアーキテクチャI
UNIXおよびLinux **
モノリシックカーネルとマイクロカーネル
オブジェクト指向メソッド
メインカーネルタスク
ユーザースペースとカーネルスペース
カーネルプログラミングプレビュー
タスク構造
メモリ割り当て
ユーザー空間とカーネル空間の間でデータを転送する
リンクリスト
ジフィー
ラボ
モジュール
モジュールとは何ですか?
些細な例
モジュールのコンパイル
モジュールと組み込み
モジュールユーティリティ
モジュールの自動ロード/アンロード
モジュール使用数
モジュールのライセンス
シンボルのエクスポート
シンボルの解決**
ラボ
カーネルアーキテクチャII
プロセス、スレッド、およびタスク
カーネルプリエンプション
リアルタイムプリエンプションパッチ
ラボ
カーネルの構成とコンパイル
カーネルソースのインストールとレイアウト
カーネルブラウザ
カーネル構成ファイル
カーネルの構築とメイクファイル
initrdおよびinitramfs
ラボ
カーネルスタイルと一般的な考慮事項
コーディングスタイル
汎用カーネルルーチンとメソッドの使用
カーネルパッチの作成
まばらな
Like()およびLikely()の使用
ポータブルコード、CPU、32/64ビット、エンディアンネスの記述
SMPの作成
ハイメモリシステム用の書き込み
パワー管理
セキュリティを念頭に置く
ラボ
競合状態と同期方法
並行性と同期の方法
原子操作
ビット操作
スピンロック
シークロックス
プリエンプションを無効にする
ミューテックス
セマフォ
完了関数
読み取りコピー更新(RCU)
参照カウント
ラボ
メモリアドレッシング
仮想メモリ管理
MMUおよびTLBを使用するシステムと使用しないシステム
メモリアドレス
ハイメモリとローメモリ
メモリゾーン
特別なデバイスノード
NUMA
ページング
ページテーブル
ページ構造
ラボ
メモリ割り当て
ページのリクエストとリリース
バディシステム
スラブとキャッシュの割り当て
メモリプール
kmalloc()
vmalloc()
早期割り当てとbootmem()
メモリの最適化
ラボ

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

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

レビュー
2021年11月
あらゆる種類のドライバーと内部の良好なカバレッジ。
2021年11月
トムの説明に感謝します。トピックについて読むことは1つのことですが、それを説明し、重要なことやそれほど多くないことを指摘できる経験のある人がそこにいることは間違いなく価値があります。
2021年11月
インストラクターは非常に魅力的で、問題のあるラボでは非常に役に立ちました。彼は彼自身の経験からの資料に追加しました。それは、実際のことと、演習の目的で考案された例とを話しているので、私は個人的に高く評価しています。
2021年11月
ラボのリソースとソリューション(ラボ)の実装方法。環境のセットアップとmakeファイルの作成に費やされる時間の多くが節約され、ドライバーの学習と開発に集中することができました。
2021年11月
素晴らしいクラス!
2021年11月
トレーナーの知識とコミュニケーションのスタイル。
2021年11月
ツールを使用してインストラクターを観察します。
2021年11月
練習と素材の構造、そしてもちろんベハンは素晴らしいインストラクターです。
2021年11月
インストラクターの詳細と専門知識。
2021年4月
インストラクターは明らかにプロであり、彼は私たちのすべての質問に完全に答える方法を知っていました。さらに、qemuエミュレーションは素晴らしく、非常に役立ちました。
2021年4月
インストラクターは素晴らしかったです!ラボもとても良く、コースブックもよく書かれています。
2021年3月
インストラクターは素晴らしかった。 Linuxでの資料に含まれていない例を示すことで、さらに上を行きました。
2021年3月
十分な深さ;非常に多くのラボで講義を分割できてうれしいです。