Android、HTML5、Node.js 與 IoT 高品質訓練課程供應者

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

仕橙版第 36 期

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

講師 Jollen

Moko365 技術總監暨講師、Mokoversity 開放創新學院創辦人、WoT.City 技術長。曾為 Motorola、HTC、LG、OPPO、騰迅、廣達電腦等知名企業,提供 Android、Linux 與 HTML5 專業訓練,並擔任顧問。長期從事 Embedded Linux、Android Framework、HTML5 與 Linux Device Drivers 研究與開發。Jollen 近期投入 Web of Things 的雲端架構設計,並且成立 WoT.City 開源計畫。Jollen’s Blog

學習 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 進行更新

改版通知:

課程新增加 LinkIt Smart 7688 驅動程式實作練習 2016.11.03 New!

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

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

Linux Kernel 這種分層架構的實作,必須利用以下 2 個步 驟方能實現:1. 下層呼叫上層所提供的註冊函數,將自己註冊到上層。 2. 上層驅動程式 Callback 下層。

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

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

研讀 Linux 驅動程式時,必須先將驅動程式的分層關係畫清楚,才能有效率地閱讀原始程式碼。Jollen 的 10 堂課,將有精采的分層架構觀念解析,並帶領同學親自動手,設計一個分層架構完整的嚴謹 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 與 LinkIt Smart 7688 New!
  • 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 與 LinkIt Smart 7688 開發板上進行實作練習 New!

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

●  懂 C 語言

●  Linux 終端機環境操作

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

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

●本課正提供預約報名優惠。預約報名課程,直接享有 82 折(NT$ 20,900)的最棒折扣:我要預約報名(請等候繳費通知、暫無須繳費)

● 預約報名優惠已為最低優惠,無法再合併其他優惠(VIP與折價券)

● 日期:2017 年日期未定,仕橙版第 36 期

● 時間:09:30~12:00,13:00~16:30(09:00 AM 開始報到)

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

下載報名表(.doc)

下載報名表(.pdf)

● 本課正提供預約報名優惠。預約報名課程,直接享有 82 折(NT$ 20,900)的最棒折扣:我要預約報名(請等候繳費通知、暫無須繳費)

● 『預約報名』說明:

  1. 凡想參加課程者皆可事先預約
  2. 僅預約,不需繳交任何費用
  3. 待上課日期公布後,評估是否可以參加該期課程,如可以再進行課程繳費(預約優惠價)
  4. 如無法參加該期課程,亦不需繳交任何費用
  5. 預約人數超過六位以上,即公布上課日期
  6. 上課日期公佈後,即無法享有預約優惠價格
  7. 預約報名優惠已為最低優惠,無法再合併其他優惠(VIP與折價券)
* 為必須填寫欄位

仕橙3G教室

本課程由仕橙3G教室 (Moko365 Inc) 開發與製作,內容由仕橙研策科技有限公司版權所有,並保留所有權利。未經書面授權同意,請勿轉載、引用或複製內文。本公司業聘請承展智權暨商務法律事務所陳丁章律師、李子聿律師等,擔任本公司電子商務及智權法務諮詢顧問,並此籲請各界尊重本公司之智慧財產權。

Moko365 (仕橙3G教室) 為兩岸領先的科技顧問培訓機構,主要業務包含三項:1.Android底層軟體開發;2.協助客戶進行Code Review以及平台的移植;3.Android企業內訓,協助企業進行人才養成。客戶包含LG、宏達電、廣達會等國內外五十家企業、政府法人,累積訓練研發人員近五千人次。成立於2009年台北,在北京、上海、深圳均可提供服務。 目前是台灣開課規模最大、課程體系最完整的Android教育訓練中心。挾著深厚的技術實力與顧問諮詢經驗,2012成立Lightning Startup,協助客戶將行動通訊領域的好點子、好創意轉化成商品。更多有關資訊,請瀏覽 http://www.moko365.com/