Linux 驅動程式完整訓練:Jollen 的 10 堂課(入門)-第 34 期
本課程內容累積超過 10 年以上的公開課程經驗,內容精實且設計完整,並堅持小班教學,讓大家都可以得到最佳的上課品質。Linux 驅動程式是一門進入門檻較高的學科,在講師過去的授課經驗中發現,其自學難度高的主要原因之一是缺乏有效的學習方法,Jollen 依據自己多年的教學經驗,設計了一套有效率的學習方法,能協助工程師快速掌握 Linux 驅動程式的核心觀念。
如何學好 Linux 驅動程式?Linux Device Driver 的學習方式,首重「完整的觀念體系」,面對現有的 Driver 程式碼時,才能輕鬆應對。本課程帶領同學「從無到有撰寫架構良好的驅動程式」,並「對作業系統原理進行分析」,透過一個完整驅動程式的分析與研發過程,讓同學親身體驗一個高品質驅動程式形成的每個細節,真正學會 Linux Device Driver。—Moko365 Team
課程方向
本課程帶領同學「從無到有撰寫架構良好的驅動程式」,並「對作業系統原理進行分析」,透過一個完整驅動程式的分析與研發過程,讓同學親身體驗一個高品質驅動程式形成的每個細節,真正學會 Linux Device Driver。「Linux 驅動程式完整訓練:Jollen 的 10 堂課」內容相當廣泛。進入 Embedded Linux System 領域,並打造厚實基礎能力,最重要的軟體課程,就是 Linux 驅動程式。
品質特色
Linux 驅動程式是一門進入門檻較高的學科,在講師過去的授課經驗中發現,其自學難度高的主要原因之一是缺乏有效的學習方法,講師依據自己多年的教學經驗,設計了一套有效率的學習方法,能協助工程師快速掌握 Linux 驅動程式的核心觀念。
台灣首屈一指的 Linux 驅動程式課程,超過 10 年的公開課紀錄,企業內訓指名講師。除了驅動程式的設計與實作,會因為要與 Android 整合而有所不同,Jollen 老師特別整理過去的研發經驗,為同學說明這個部份的技術。Jollen 老師過去為多家科技大廠提供顧問服務,所累積的心得,也整合至課程內容。本課程將繼續堅持小班教學,讓大家都可以得到最佳的上課品質。
更新通知
課程已針對 Kernel 4.x 進行更新
課程代號
SP001
課程簡介
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。
Virtual Device Driver:
往上層支援 Linux Kernel 所提供的 Virtual File System 層,並藉此實作 System Calls。使用者可透過 System Call Interface 與 Device Driver 溝通。
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 |
第 01 堂課:Linux 驅動程式架構(包含 Kernel 4.x) | Jollen |
| 第二天 09:30 am-04:30 pm |
第 02 堂課:Linux 驅動程式設計流程 | Jollen |
| 第三天 09:30 am-04:30 pm |
第 03 堂課:I/O 存取觀念與 read/write 第 04 堂課:Blocking I/O 與 Wait Queue |
Jollen |
| 第四天 09:30 am-04:30 pm |
第 05 堂課:Kernel Timer 與 Work Queue 第 06 堂課:中斷處理(Interrupt Handling)與 Bottom Half |
Jollen |
Subsystem 分層架構
Linux 驅動程式採用分層架構的觀念設計,透過「註冊」與「回呼」的機制(Registration and Callback)來清楚地區分每一層的關係。初學者若無法掌握 Linux 驅動程式分層設計的關念,甚致無法接受層架構的觀念的話,當然也就無法有效學會 Linux 驅動程式。
Linux Kernel 這種分層架構的實作,必須利用以下 2 個步驟方能實現:
- 下層呼叫上層所提供的註冊函數,將自己註冊到上層。
- 上層驅動程式 Callback 下層。
分層架構的實作必須在下層將自己註冊給上層,上層再回呼下層;上層的驅動程式必須提供註冊函數供下層呼叫,下層驅動程式所使用的註冊函數也將決定自己的上層架構。
最上層的驅動呼叫的註冊函數是由 Linux Kernel 所提供的基本註冊函數,因此最上層的驅動程式是將自己註冊到 Linux Kernel 裡,即 Virtual Filesystem 層。下層註冊到上層的實作只需要使用上層所提供的註冊函數即可,上層的驅動程式必須能處理下層的註冊動作。
研讀 Linux 驅動程式時,必須先將驅動程式的分層關係畫清楚,才能有效率地閱讀原始程式碼。Jollen 的 10 堂課,將有精采的分層架構觀念解析,並帶領同學親自動手,設計一個分層架構完整的嚴謹 Driver。
Embedded Linux Device Driver
您學的是真正的「Embeded Linux Device Driver」?
LLinux 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 天)
優惠方案
本課正提供預約報名優惠。預約報名課程,直接享有 82 折(NT$ 20,900)的最棒折扣:我要預約報名(請等候繳費通知、暫無須繳費)
預約報名優惠已為最低優惠,無法再合併其他優惠(VIP與折價券)
開課時間
- 日期:2016 年 未定,仕橙版第 35 期
- 時間:09:30~12:00,13:00~16:30(09:00 AM 開始報到)
上課地點
台北市博愛路(詳細教室資訊另行公佈)