Linux 驅動程式完整訓練:Jollen 的 10 堂課(進階)-第 34 期

本課程內容累積超過 10 年的公開課程經驗,內容精實且設計完整,並堅持小班教學,讓大家都可以得到最佳的上課品質。Linux 驅動程式是一門進入門檻較高的學科,在講師過去的授課經驗中發現,其自學難度高的主要原因之一是缺乏有 效的學習方法,Jollen 依據自己多年的教學經驗,設計了一套有效率的學習方法,能協助工程師快速掌握 Linux 驅動程式的核心觀念。

學習 Linux Device Driver 的最大瓶頸是什麼?Kernel synchrinization 一直是 Linux 驅動程式工程師的痛點。在入門課程裡,講師將透過一系列的 Exercise 協助學員建立「Kernel 同步」的概念。在進階課程裡,Jollen 老師將使用 1.5 天的課程時間,徹底分析 Linux 核心的同步機制,以及 Linux 驅動程式的同步實作。—Moko365 Team

課程方向

Jollen 老師說:「如何分析程式碼,並分別找出在單處理器與多處理器環境下的同步問題,是學習 Kernel Synchronization 的基本功。」進階課將引導學員,建立 Kernel Synchrinization 的分析能力,並學習單處理器與多處理器的同步分析技巧。受訓後的學員,都能輕鬆駕馭 Mutex、Spinlock、IRQ disabling 等同步技術。

品質特色

台灣首屈一指的 Linux 驅動程式課程,企業內訓指名講師。本課程內容累積超過 10 年的公開課程經驗,內容精實且設計完整。Linux 驅動程式是一門進入門檻較高的學科,在講師過去的授課經驗中發現,其自學難度高的主要原因之一是缺乏有效的學習方法,Jollen 依據自己多年的教學經驗,設計了一套有效率的學習方法,能協助工程師快速掌握 Linux 驅動程式的核心觀念。

除了驅動程式的設計與實作,會因為要與 Android 整合而有所不同,Jollen 老師特別整理過去的研發經驗,為同學說明這個部份的技術。本課程將繼續堅持小班教學,讓大家都可以得到最佳的上課品質。

更新通知

課程已針對 Kernel 4.x 進行更新

課程代號

SP002

課程簡介

Linux 驅動程式是一門進入門檻較高的學科,在 Jollen 過去的授課經驗中發現,其自學難度高的主要原因之一是缺乏有效的學習方法;主題本身雖然也有難度,但卻未必是學不通的主因。

技術性課程的教育訓練,是否能帶給同學優質的學習,教材內容是否包含一般化的材料(不能只是 Case Study),也是重點。

目前雖然有O’reilly的 Linux Device Drivers,3e 聖經本,但對初學者而言,若沒有一個有效的學習方法,想要有效率地學會驅動程式,仍然是比較有難度的。Jollen 依據自己多年的教學經驗,設計了一套有效率的學習課程,Jollen 課程的目的是為了協助工程師快速掌握 Linux 驅動程式的核心觀念。本文的目的則是說明研讀 Linux 驅動程式的正確方法。

學好驅動程式

Linux 驅動程式的重點在於「觀念」而非程式碼的語法,Linux 驅動程式觀念的核心精神為如何設計機制良好的 Kernel 程式。善用 Linux 的 APIs 來設計機制(Mechanism)與行為(Behavior)良好的驅動程式,是學習 Linux 驅動程式的重點。

對 Device Driver 設計師而言,我們所要做的工作可分成 2 個層面來討論:Virtual Device Driver 與 Physical Device Driver。

  1. Virtual Device Driver:往上層支援 Linux Kernel 所提供的 Virtual File System 層,並藉此實作 System Calls。使用者可透過 System Call Interface 與 Device Driver 溝通。

  2. Physical Device Driver:往下層使用 Linux Kernel 所提供的 Device Interface 來存取並控制實體硬體裝置。 Virtual Device Driver 的主題重要性大於 Physical Device Driver,如何善用 Linux 所提供的介面(Interface)來設計驅動程式,並配合 User Application 來設計應用程式是這個主題的重點。

與 User Application 如何互動,是撰寫驅動程式時所要考慮的重要一環,只考量驅動程式本身的設計,而忽略或輕忽 User Application 的設計,是錯誤的觀念。 Jollen 的 10 堂課,獨家並且觀念正確的帶領您了解 User-space 與 Kernel-space 的關係。

Virtual Device Driver 的目的在於善用 Linux 的 APIs 來設計機制(Mechanism)與行為(Behavior)良好的驅動程式,因此「觀念」的重要性遠大於「語法」的討論。

Physical Device Driver 則是討論「如何透過 I/O memory」來控制裝置,也就是與晶片組的溝通。 Linux Device Driver 的撰寫必須多了解一些更低階或低層的硬體知識,才能融會貫通。站在軟體與韌體的角度而言,我們不必要太深入硬體的實作細節,但了解其原理對增進功力是絕對有幫助的。

自我評量:您學到是真正的驅動程式開發?

若您已是 Linux 驅動程式初學者,或是參加過其它 Linux 驅動程式課程,可藉由以下問題,衡量您是否真正了解 Linux 驅動程式的設計。

考量以下 5 種作業系統狀態(Status):

  • (1) Driver Code Reentrancy
  • (2) Thread Concurrent Access
  • (3) SMP
  • (4) Interrupt-Mode
  • (5) Task in Process Context

問題一:哪些會造成 Driver 出現同步問題?

問題二:經驗上,single process 存取 Driver 時,會出現哪些同步問題?

問題三:經驗上,multi-thread 存取 Driver 時,會出現哪些同步問題?

問題四:分析與思考 Framebuffer 驅動程式的設計,哪些現象會影響效能?

問題五:如上,如何改進?

Jollen 的 10 堂課帶您寫出好程式。課程範例經過嚴謹的設計,課程不使用「實驗用」的程式碼(Simple Code)做為範例;在專業的研發工作上,這類型的程式碼又稱為玩具碼(Disty Code),雖然透過 Simple Code 是一種很好的學習方式,但專業性不足,面臨真正研發工作時,仍不知所措。請選擇真正有正確教學內容的 Linux 驅動程式課程!

課程大綱

上課時數:24 小時,共計 4 天。

時程 上課大綱 講師
第一天
09:30 am-04:30 pm
第 07 堂課:Kernel Synchronization (1/2)
  • 基本 Kernel Synchronization
  • Race Condition 與分析技巧練習
  • Reentrancy 與 Mutex
  • Spinlock
  • Jollen
    第二天
    09:30 am-04:30 pm
    第 07 堂課:Kernel Synchronization (2/2)
  • 單處理器 vs 多處理器
  • IRQ Disabling
  • Interrupt Context 與 Process Contenxt 同步控制
  • 進階 Kernel Lock APIs
  • Jollen
    第三天
    09:30 am-04:30 pm
    第 08 堂課:Memory Mapped I/O 與 User-space driver

    第09堂課:周邊驅動程式與 Sysfs
  • USB Subsystem
  • Input Device
  • Hardware Monitoring
  • I2C Subsystem
  • Jollen
    第四天
    09:30 am-04:30 pm
    第 09 堂課:周邊驅動程式與 Sysfs
  • Subsystem (分層架構) 觀念解析與實務
  • Sysfs 架構與實作
  • Sysfs Class Driver
  • Process model、架構設計與穩定性

    第 10 堂課:Android & Linux Device Driver
  • Android 與 Linux 驅動程式整合: HAL 架構介紹
  • 解析 Android 系統下的驅動程式實作差異
  • Jollen

    Subsystem 分層架構

    Linux 驅動程式採用分層架構的觀念設計,透過「註冊」與「回呼」的機制(Registration and Callback)來清楚地區分每一層的關係。初學者若無法掌握 Linux 驅動程式分層設計的關念,甚至無法接受層架構的觀念的話,當然也就無法有效學會 Linux 驅動程式。

    Linux Kernel 這種分層架構的實作,必須利用以下 2 個步 驟方能實現:

    1. 下層呼叫上層所提供的註冊函數,將自己註冊到上層。
    2. 上層驅動程式 Callback 下層。

    分層架構的實作必須在下層將自己註冊給上層,上層再回呼下層;上層的驅動程式必須提供註冊函數供下層呼叫,下層驅動程式所使用的註冊函數也將決定自己的上層架構。

    最上層的驅動呼叫的註冊函數是由 Linux Kernel 所提供的基本註冊函數,因此最上層的驅動程式是將自己註冊到 Linux Kernel 裡,即 Virtual Filesystem 層。下層註冊到上層的實作只需要使用上層所提供的註冊函數即可,上層的驅動程式必須能處理下層的註冊動作。

    研讀 Linux 驅動程式時,必須先將驅動程式的分層關係劃清楚,才能有效率地閱讀原始程式碼。Jollen 的 10 堂課,將有精采的分層架構觀念解析,並帶領同學親自動手,設計一個分層架構完整的嚴謹 Driver。

    Embedded Linux Device Driver

    您學的是真正的「Embeded Linux Device Driver」?

    Linux Kernel 現存的驅動程式,都可以經由簡單修改與 Cross Compile 移植到嵌入式裝置,或是開發板上,而這些驅動程式,原本就能在 PC 以及其它硬體上執行;因此,修改 I/O memory 的存取方式,並進行 Cross Compile 後安裝至開發板,並不是真正的「Embedded 」驅動程式

    正確的 Embedeed 驅動程式,需要考量「目標裝置的特性」與「硬體規格」,接著再進行驅動程式的調整,以符合裝罝特性。例如:針對記憶體很小的硬體裝置,加入 Linux 2.6 的新機制「Compcache」,或是針對手持裝置,加入「Software Suspend」的功能

    針對 Embedded 的應用,Jollen 的 10 堂課特別加入「Embedded Linux Device Driver」的新課程內容,教您撰寫正確的嵌入式驅動程式!

    實作練習:

    第一階段

    共 15 道精心設計題目,教同學從無到有寫一個完整的驅動程式,每個練習皆提供參考解答:

    • Exercise 01:ioctl driver function
    • Exercise 02:multi-threaded
    • Exercise 03:private data
    • Exercise 04:reentrant code
    • Exercise 05:sleeping in kernel space
    • Exercise 06:scheduling
    • Exercise 07:wait queue
    • Exercise 08:semaphore
    • Exercise 09:critical section
    • Exercise 10:將練習作業整合到 Linux kernel
    • Exercise 11:將 Linux kernel 移植到開發板(ARM9)
    • Exercise 12:實作 Memory-Mapped I/O
    • Exercise 13:實作 Sysfs
    • Exercise 14:開發 Android HAL
    • Exercise 15:整合至 Android

    先訓練同學實作架構完整與行為良好的驅動程式框架,再教授如何將自已寫的程式整合到 Linux Kernel,並移植到開發板。

    第二階段

    教同學使用 Source-level Debug 來偵錯,並了解同步存取如何影響 Kernel 穩定性:

    • Exercise 01:使用 GDB 練習除錯
    • Exercise 02:分析 Kernel Panic(使用 Framebuufer 範例)
    • Exercise 03:加入 Semaphore 解決 Kernel Panic 錯誤

    第三階段

    教同學使用 Source-level Debug 方式,了解 Linux 的 Memory Model。課堂使用講師自行製作的迷小核心(20k 左右的Linux Kernel)來進行 Kernel 原始碼研究:

    • Exercise 01:小型 Linux Kernel 介紹
    • Exercise 02:kmalloc() 原理解析
    • Exercise 03:Linux Memory Model 探索

    第四階段

    演練 Android 與 Linux 驅動程式整合專題,了解 Linux 驅動程式如何與 Android 整合:

    • Exercise 01:重構原有的 Linux 驅動程式
    • Exercise 02:如何重新實作舊有驅動程式,才能完善地整合至 Android?

    課程目標

    • 學會 Linux 驅動程式架構與基本的 Linux 驅動程式觀念

    • Linux 驅動程式的入門關鍵點為「觀念的解析」,有了觀念後,便能快速看懂 Linux 的驅動程式,這也是許多 Linux 驅動程式初學者的障礙

    • 本課程為觀念導向並實作一個整體性的範例,並實際撰寫程式以了解 User-space 與 Kernel-space 的關係,絕對是獨家的課程內容

    • 在 ARM 開發板上進行實作練習

    • 了解 Linux 驅動程式與 Android 的整合實作

    先備知識

    • 懂 C 語言

    • Linux 終端機環境操作

    • 具備基本的作業系統觀念(未具備者請課前預習)

    報名費用

    NT$ 25,500(上課時數 24 小時,共計 4 天)

    優惠方案

    • 開課前一週,天天早安鳥;開課前一週完成繳費享有「早安鳥」優惠價:NT$ 23,200,我要早安鳥報名
    • 持 VIP Code 或仕橙會員卡,再折 NT$ 1,000
    • 持仕橙折價卷:依面額折抵,一門課程限用一張,可搭配 VIP Code 或仕橙會員卡使用
    • 持仕橙折價卷的學員,請於填寫報名表時勾選,並於開課當日繳交,如無法繳交折價卷者,須補繳課程費用

    開課時間

    • 日期:日期:2016 年 06 月 25、26 日、07 月 02、03 日,仕橙版第 34 期
    • 時間:09:30~12:00,13:00~16:30(09:00 AM 開始報到)

    上課地點

    台北市博愛路(詳細教室資訊另行公佈)

    我要報名

    results matching ""

      No results matching ""