Course Code: ldd
Duration: 35 hours
Prerequisites:

  • GNU/Linux システムのエンドユーザーとしての基本的な利用経験
  • コマンドラインシェルの基本的な利用経験
  • ユーザー空間/アプリケーション開発に関する基礎知識
  • C言語の中級レベルのプログラミング知識
  • 事前に埋め込み GNU/Linux システムアーキテクチャの研修を受講していること(強く推奨)、またはそこで概説されるトピックを十分に理解していること

Overview:

概要

この5日間のトレーニングコースは、実践的な演習と講義を組み合わせて、GNU/Linux カーネルの内部構造とデバイスドライバ開発の概念を理解することを目的としています。短時間で習得できるよう設計されています。理論と現場での訓練を組み合わせることで、GNU/Linux デバイスドライバを作成するために必要なプロセス、概念、コマンドを解説します。

車輪の再発明をせず、経験豊富な講師から学び、ご自身の埋め込み開発プロジェクトで効果的に活用できる実践的な知識とスキルを取得しましょう。

対象者

GNU/Linux デバイスドライバの開発や評価に従事している、またはその関心のあるソフトウェアエンジニア、フィールドエンジニア、(プロジェクト)マネージャー、ハードウェアエンジニアなど。

Course Outline:

イントロダクション

  • GNU/Linux の歴史概要
  • ライセンス
  • カーネルのバージョン管理
  • リリースサイクル
  • カーネルツリー
  • メインライン
  • カーネル空間とユーザー空間
  • 仕組みとポリシー
  • カーネルドライバの代替手段
  • RTOS と Linux

メモリ管理

  • 仮想メモリと物理メモリ
  • カーネル内のメモリ割り当て
  • ページ
  • ゾーン
  • API
  • スlab (Slab)

カーネルパッチ

  • ライフサイクル
  • Git
  • カーネルソース
  • パッチの作成
  • パッチのチェック
  • パッチの修正
  • パッチの提出
  • 監査済みコード

カーネルモジュール

  • カーネルソースの取得
  • 設定/ビルド/インストール
  • デバイスドライバ(静的リンク、ランタイムロード)
  • init/exit
  • ライセンス
  • EXPORT_SYMBOL(GPL)
  • 外部ツリーの Makefile
  • module-init-tools
  • カーネルツリー内のモジュール
  • Kconfig
  • パラメータの受け渡し
  • Sparse

キャラクタデバイスドライバ

  • アーキテクチャ
  • ユーザー/カーネルインターフェース
  • I/O サブシステム
  • VFS (Virtual File System)
  • sysfs (デバイス、バス、ドライバ、クラス)、
  • kobject/ktype/kset
  • Linux カーネルドライバモデル
  • デバイスファイル
  • キャラクタドライバー

    • 初期化
    • 登録
    • open, release
    • cdev, cdev_add, cdev_del,...
    • メジャー番号/マイナー番号
    • udev, udevmonitor, udevadm

キャラクタデバイスドライバの応用操作

  • ioctl
  • unlocked ioctl
  • compat ioctl
  • ユーザー空間 API
  • カーネル空間 API
  • プロセスのライフサイクル
  • スリーピング/ブロック
  • スリーピングとウェイクアップ
  • ウェイトキュー
  • 轟音群問題 (Thundering herd)
  • poll/select

カーネルデバッグ

  • デバッグ
  • カーネルのデバッグ方法

    • Git を使った二分探索によるデバッグ
    • カーネルによるデバッグサポート
    • printk, syslogd, klogd, ロギングレベル, レートリミット, デバッグレベル, 選択的なサブシステムのデバッグ
    • debugfs からのクエリによるデバッグ
    • Oops のデバッグ、Oops の発生強制
    • Magic SysRq キー
    • kgdb/kdb
    • JTAG

トレース

  • gcov
  • lcov
  • oprofile
  • ftrace

    • nop tracer
    • function tracer
    • sched switch tracer
    • function graph tracer
    • dynamic tracer
  • trace-cmd/kernelshark
  • perf
  • LTTng

割り込み (Interrupts)

  • 割り込みとポーリング
  • 割り込み
  • プログラムのセクション
  • 再入可能性
  • イベント
  • 割り込みハンドラ
  • 共有割り込みハンドラ
  • 割り込みフロー
  • 割り込み制御

作業のDeferred (Deferring Work)

  • トップハーフ/ボトムハーフ
  • ソフトウェア割り込み (Softirqs)
  • タスクレット (Tasklets)
  • ワークキュー (Work queues)
  • スレッド化された割り込み

並行処理

  • クリティカルリージョン/セクション
  • アトミック演算
  • レースコンディション
  • 同期
  • ロッキング
  • ロッキングの解決策
  • デッドロック
  • コンテンション
  • 何をロックすべきか?
  • 何を利用できるか?

    • アトミック操作
    • スピンロック
    • リーダーライタースピンロック
    • セマフォ
    • バイナリセマフォ
    • ミューテックス
    • リーダーライターセマフォ
    • 完了変数 (Completion variables)
    • シーケンシャルロック
    • プリエンプションの無効化
    • 順序保証とバリアー

時間

  • HZ
  • ジフリーズ (Jiffies)
  • 長時間/短時間のディレイ
  • カーネルタイマー

ハードウェア I/O

  • I/O ポート
  • I/O メモリ
  • レジスタへのアクセス時の副作用への対応方法

ユーザーとカーネル間の通信

  • put/get_user()
  • copy_to_user()/copy_from_user()
  • カーネル I/O
  • メモリマップ
  • procfs
  • sysfs
  • debugfs
  • relayfs
  • Netlink
  • ioctl

ポータビリティ

  • ワードサイズ
  • オpaqueな型
  • 符号付き/符号なし文字
  • データのアラインメント
  • 整数拡張
  • コードの再利用
  • エンディアン
  • システムティック
  • ページサイズ
  • 命令の順序付け
  • SMP/プリエンプション/ハイメモリ

特に注釈がない限り、本コンテンツおよびコースアウトラインはCreative Commons Attribution-NonCommercial-ShareAlike 4.0 International (CC BY-NC-SA 4.0)の下でライセンスされています。

Sites Published:

United Arab Emirates - Embedded GNU/Linux Kernel Internals and Device Drivers

Qatar - Embedded GNU/Linux Kernel Internals and Device Drivers

Egypt - Embedded GNU/Linux Kernel Internals and Device Drivers

Saudi Arabia - Embedded GNU/Linux Kernel Internals and Device Drivers

South Africa - Embedded GNU/Linux Kernel Internals and Device Drivers

Brasil - Integridade do Kernel GNU/Linux Embarcado e Drivers de Dispositivo

Canada - Embedded GNU/Linux Kernel Internals and Device Drivers

中国 - 嵌入式GNU/Linux内核与设备驱动

香港 - Embedded GNU/Linux Kernel Internals and Device Drivers

澳門 - Embedded GNU/Linux Kernel Internals and Device Drivers

台灣 - Embedded GNU/Linux Kernel Internals and Device Drivers

USA - Embedded GNU/Linux Kernel Internals and Device Drivers

Österreich - Interne Struktur des GNU/Linux-Kernels und Gerätetreiber

Schweiz - Interne Struktur des GNU/Linux-Kernels und Gerätetreiber

Deutschland - Interne Struktur des GNU/Linux-Kernels und Gerätetreiber

Czech Republic - Interní struktura jádra GNU/Linuxu a ovladače zařízení

Denmark - Embedded GNU/Linux Kernel Internals and Device Drivers

Estonia - Embedded GNU/Linux Kernel Internals and Device Drivers

Finland - Embedded GNU/Linux Kernel Internals and Device Drivers

Greece - Εσώτερο Λειτουργικό των Πυρήνων GNU/Linux και Οδηγοί Συσκευών

Magyarország - Beágyazott GNU/Linux Kernel Belső Működése és Eszközmeghajtók

Ireland - Embedded GNU/Linux Kernel Internals and Device Drivers

Luxembourg - Embedded GNU/Linux Kernel Internals and Device Drivers

Latvia - Embedded GNU/Linux Kernel Internals and Device Drivers

España - Integridades internas del kernel y controladores de dispositivos GNU/Linux integrados

Italia - Interni del kernel GNU/Linux e driver di dispositivo

Lithuania - Embedded GNU/Linux Kernel Internals and Device Drivers

Nederland - Inwendige werking van de GNU/Linux-kernel en apparaatstuurprogramma's

Norway - Inne i Linux-kjernen for innbygde systemer og enhetsdrivere

Portugal - Integridade do Kernel GNU/Linux Embarcado e Drivers de Dispositivo

România - Internele Nucleului GNU/Linux și Driverele de Dispozitive

Sverige - Inbyggd GNU/Linux-kärninterna funktioner och enhetsdrivrutiner

Türkiye - Gömülü GNU/Linux Çekirdek İç Yapıları ve Cihaz Sürücüleri

Malta - Embedded GNU/Linux Kernel Internals and Device Drivers

Belgique - Internalités du noyau GNU/Linux et pilotes de périphériques intégrés

France - Internalités du noyau GNU/Linux et pilotes de périphériques intégrés

日本 - 埋め込み GNU/Linux カーネルの内部構造とデバイスドライバ

Australia - Embedded GNU/Linux Kernel Internals and Device Drivers

Malaysia - Embedded GNU/Linux Kernel Internals and Device Drivers

New Zealand - Embedded GNU/Linux Kernel Internals and Device Drivers

Philippines - Embedded GNU/Linux Kernel Internals and Device Drivers

Singapore - Embedded GNU/Linux Kernel Internals and Device Drivers

Thailand - Embedded GNU/Linux Kernel Internals and Device Drivers

Vietnam - Kiến trúc Nhân GNU/Linux Nhúng và Trình điều khiển Thiết bị

India - Embedded GNU/Linux Kernel Internals and Device Drivers

Argentina - Integridades internas del kernel y controladores de dispositivos GNU/Linux integrados

Chile - Integridades internas del kernel y controladores de dispositivos GNU/Linux integrados

Costa Rica - Integridades internas del kernel y controladores de dispositivos GNU/Linux integrados

Ecuador - Integridades internas del kernel y controladores de dispositivos GNU/Linux integrados

Guatemala - Integridades internas del kernel y controladores de dispositivos GNU/Linux integrados

Colombia - Integridades internas del kernel y controladores de dispositivos GNU/Linux integrados

México - Integridades internas del kernel y controladores de dispositivos GNU/Linux integrados

Panama - Integridades internas del kernel y controladores de dispositivos GNU/Linux integrados

Peru - Integridades internas del kernel y controladores de dispositivos GNU/Linux integrados

Uruguay - Integridades internas del kernel y controladores de dispositivos GNU/Linux integrados

Venezuela - Integridades internas del kernel y controladores de dispositivos GNU/Linux integrados

Polska - Wewnętrzne mechanizmy jądra GNU/Linux i sterowniki urządzeń

United Kingdom - Embedded GNU/Linux Kernel Internals and Device Drivers

South Korea - 임베디드 GNU/리눅스 커널 내부 구조 및 장치 드라이버

Pakistan - Embedded GNU/Linux Kernel Internals and Device Drivers

Sri Lanka - Embedded GNU/Linux Kernel Internals and Device Drivers

Bulgaria - Вградени вътрешни принципи на ядрото GNU/Linux и драйвери на устройства

Bolivia - Integridades internas del kernel y controladores de dispositivos GNU/Linux integrados

Indonesia - Embedded GNU/Linux Kernel Internals and Device Drivers

Kazakhstan - Embedded GNU/Linux Kernel Internals and Device Drivers

Moldova - Internele Nucleului GNU/Linux și Driverele de Dispozitive

Morocco - Embedded GNU/Linux Kernel Internals and Device Drivers

Tunisia - Embedded GNU/Linux Kernel Internals and Device Drivers

Kuwait - Embedded GNU/Linux Kernel Internals and Device Drivers

Oman - Embedded GNU/Linux Kernel Internals and Device Drivers

Slovakia - Embedded GNU/Linux Kernel Internals and Device Drivers

Kenya - Embedded GNU/Linux Kernel Internals and Device Drivers

Nigeria - Embedded GNU/Linux Kernel Internals and Device Drivers

Botswana - Embedded GNU/Linux Kernel Internals and Device Drivers

Slovenia - Embedded GNU/Linux Kernel Internals and Device Drivers

Croatia - Embedded GNU/Linux Kernel Internals and Device Drivers

Serbia - Embedded GNU/Linux Kernel Internals and Device Drivers

Bhutan - Embedded GNU/Linux Kernel Internals and Device Drivers

Nepal - Embedded GNU/Linux Kernel Internals and Device Drivers

Uzbekistan - Embedded GNU/Linux Kernel Internals and Device Drivers

US Government - Embedded GNU/Linux Kernel Internals and Device Drivers