more: Jollen 的 Embedded Linux 教育訓練

Jollen's Blog「教育訓練紀錄」裡的所有文章!

  

[教育訓練紀錄] Mmap and remap_page_range(), in the nutshell.

jollen 發表於 April 22, 2007 10:34 AM

繼 Linux programming 課程紀錄「小談 mmap() 與 VMA」後,今天在 Linux device driver 課程再聊到有關 VMA 與 mmap driver function 的重要觀念;重點紀錄如下。 當 user-space 呼叫 mmap() system call wrapper function 後,kernel 會在 process address space 裡建立新的 VMA,並在 callback mmap driver function 時將「該」VMA 傳遞給我們的驅動程式。 因此,在驅動程式裡,只需要利用 remap_page_range()...

[教育訓練紀錄] Spinlock in Process-Context Code

jollen 發表於 April 22, 2007 2:21 PM

紀錄 Linux device driver 課程,關於「spinlock」的討論。 Kernel synchronization 的機制中,semaphore 有二種版本可供使用: - Semaphore: down(), up() - Spinlock 二種不同的 semaphore 實作的差異在於「P operation」的實作: - down/up, 採取 sleeping 方式 - spinlock, 採取 busy loop 方式 在 interrupt handler 的實作上,由於 kernel 並非與 process context 做切換(kernel 執行的是...

[教育訓練紀錄] nonblocking wait: try lock

jollen 發表於 March 15, 2008 6:13 PM

今天在進行 GNU Toolchains 與 Embedded Linux Programming 教育訓練課程時,提及以 shared memory 實作 IPC 時的同步問題。針對 unrelated process 的同步存取控制,一種古老的做法「locking」能簡單地應用在此同步問題上。 當寫入端做出 locking(如:lock file)時,讀取端便要等待 locking 被解除,因此這是一個 blocking wait 的架構。不過,若將「wait for unlucking」改成「try lock」,便能在中間的空閒時間「做點事情」,程式也不會晾著沒事做。 一種簡單的程式架構,以「try lock」來做同步控制,讓程式閒著也要想辦法幹點活兒。另一個類似的觀念為 pthread semaphore 的 sem_trywait()。 延伸閱讀 2007.01.16: Shared Memory 的 Race Condition...

[教育訓練紀錄] 交叉編譯(cross compile)thttpd

jollen 發表於 March 30, 2008 10:54 AM

本週進行 root filesystem 相關的教育訓練,今天給的課堂練習是 thttpd 的交叉編譯(cross compile)。thttpd 採用標準的 GNU autoconf 來產生 Makefile,因此,交叉編譯 thttpd 的方式是蠻簡單的。配合課堂提供的 cross toolchain(gcc 3.4.1),我們先定義以下有關 cross toolchain 路徑檔檔名的 Makefile 變數: TOOL_TOP = /opt/crosstool/gcc-3.4.1-glibc-2.3.3/arm-9tdmi-linux-gnu CC = $(TOOL_TOP)/bin/arm-9tdmi-linux-gnu-gcc AR = $(TOOL_TOP)/bin/arm-9tdmi-linux-gnu-ar LD = $(TOOL_TOP)/bin/arm-9tdmi-linux-gnu-ld AS = $(TOOL_TOP)/bin/arm-9tdmi-linux-gnu-as STRIP = $(TOOL_TOP)/bin/arm-9tdmi-linux-gnu-strip...

[教育訓練紀錄] 關於驅動程式的 private data 與可重覆進入函數

jollen 發表於 April 20, 2008 5:09 PM

今天進行 Linux 驅動程式的教育訓練課程,課堂中提到「多個 process (/dev/debug[0..n]) 同時 invoke 同一個驅動程式 (fops) 的架構觀念與程式設計」,我們也做了一個課堂練習。這是 Linux 驅動程式架構上,很重要的一個觀念。 如圖,當 P 與 Q 二個 process 同時在系統裡執行時,因為開啟的裝置檔不同,因此 kernel(VFS switch)會分別為二個裝置檔建立一個 struct file 的資料結構空間。因為二個裝置檔的 major number 相同,因此如果 P/Q 同時(或非同時)執行 write system call 時,都會引用(invoke)到同一份程式碼(即圖上的 xxx_write)。 VFS Switch 在 callback xxx_write 時,便會將「正確的」struct...

[教育訓練紀錄] 呼叫 kmalloc(GFP_KERNEL) 的函數要可以重覆進入

jollen 發表於 June 22, 2008 10:10 AM

使用 kmalloc() 時,要特別注重的是「可重覆進入」的觀念。kmalloc() 的第二個參數稱為 allocation flag,用來控制 kmalloc() 的行為,當此參數有指定 GFP_KERNEL 旗標時,kmalloc() 就是一個 blocking function。 使用 GFP_KERNEL 旗標來配置記憶體時,為什麼會有可重覆進入的議題呢?主要的關鍵在於,當 kmalloc(..., GFP_KERNEL) 無法配置記憶體時,便會做「等待」的動作,這個等待的動作是對「current process」做重排程,並等候記憶體空間。 以 open driver function 來看,通常我們會在 open driver function 裡做記憶體的配置,當記憶體目前無法取得時,open driver function 便會停止(等待),因此不會完成這一次的函數呼叫(沒有 return),此時,同一個 open driver function 會不會再被「重覆」呼叫執行呢?當然會。因為,可能會有另一個 process 去開啟 major...

[教育訓練紀錄] 從 kernel-space 讀取 user-space 的字串

jollen 發表於 June 22, 2008 11:47 AM

User application 使用 write() 函數將字串寫到裝置檔,所以在 driver 裡頭,就要實作 write system call。當字串的傳遞是透過 write system call 寫至 kernel-space 時,driver 就要使用 copy_from_user() 來讀取 user-space 的字串。以下是一個簡單的 write driver function 實作參考,此實作提供由 kernel-space 讀取 kernel-space 字串的方法,當然這裡頭包含諸多隱含在程式裡的重要關念,例如: 1. user-space page 是 valid 或 invalid。 2. 讓不同 device file...

[教育訓練紀錄] 入門 ARM9 平臺 Linux 驅動程式的基本功

jollen 發表於 July 13, 2008 2:27 PM

本週進行「Linux Device Drivers」訓練課程,開始帶領學員在 JK2410 開發板上實際撰寫硬體控制的程式碼。前一階段課程費了許多功夫解釋整個架構和觀念,這部份是與硬體無關的主題,主要針對 Linux 作業系統本身的實作與機制做觀念解說,例如:scheduling(為什麼要使用 wait queue 做 I/O 排程、以及使用時機)、critical section 等等。 我們花了一點時間幫同學建立基本概念,主要都是基本功的訓練,整理如下: 1. JK2410 開發板的操作:如何下載 kernel 與 rootfs 到開發板。 2. Kernel 編譯與設定:toolchain 的取得與安裝、Linux kernel 原始碼的取得、如何設定 kernel、如何包裝成 u-boot 格式。 3. 如何將 cdata 移植到 kernel source tree:透過 Config.in(2.4 kernel)與...

[教育訓練紀錄] Symbol Table、objdump 與 ELF 綜合小考

jollen 發表於 August 23, 2008 10:47 AM

上週進行「GNU Toolchains & Embedded Linux Programming」課程時,最後出了一道考題給同學。題目如下。 請說明上述程式執行後,為什麼會出現以下結果。請將原理描述清楚。 $ gcc -o helo helo.c $ ./helo 0x80495c0 now x = 10 now x = 100 這是一道綜合性的考題,考了很多東西。完全沒有 toolchains 觀念前,同學是一頭霧水,也沒有什麼方向。但是在二天的課程後,從同學繳回的測試卷來看,大家的觀念都已經很健全了。在這裡將題目也提供給大家思考。這是一道不算難的考題,主要考的是「觀念」,並透過「工具的操作」來驗證這些觀念。 觀念的建立絕對是教育訓練最重要的一個環節,也是講師的主要任務,而透過工具的交互操作,來強化課堂觀念,是一個不錯的方法,可以幫助同學記憶。...

[教育訓練紀錄] fork 多個小孩

jollen 發表於 August 23, 2008 3:48 PM

今天進行「GNU Toolchains & Embedded Linux Programming」課程,在講解 fork 時,有同學問到「能不能 fork 多個 child process」,當然是可以的。後續又有同學問到,「能不能 fork 孫子」,當然也是可以的,只不過,在 child process 裡再 fork child process 並不是很主要的做法,只在一些特殊情況,例如要避免 zombie process 產生時,才會用上。 所以,我們只講解如何 fork 多個 child process 的做法。我們舉了一段 code 當做範例,這段 code 寫得很單純,可以說明 fork 的一些觀念。在這裡,大家必須了解的是「fork 之後」的行為是什麼: 1. parent process...

Jollen 的 Android Framework in a Nutshell:台北場演講順利舉辦

jollen 發表於 March 24, 2010 11:49 AM

幾個月前的一則日記,紀錄了「堅果殼精神」的起源,經過數個月的籌劃,第一場「Jollen 的 Android Framework in a Nutshell」演講終於順利結束。距離 [Android Framework in A Nutshell 講題規劃完畢],到第一場演講正式舉辦,間隔近一個半月的時間,感謝協助本活動的幾位幕後人員,才能使這個活動順利進行。 這次的演講,除了以提及的「堅果殼」精神分享技術研究心得外,也在實現另外一個自已的理念:以半課程形式呈現演講。 半課程形式的意思是,以演講的舉辦形式,加上課程形式的內容,融合演出。演講活動,是啟發思考不可或缺的活動,一場好的演講,有時扣人心弦、有時發人省思,講者也能儘情演出、暢談自已的理念;課程或教育訓練,則是在傳遞知識,設法以授課技巧或教育方法,達到潛移默化的效果,這是授業者的工作。形式與目的大有不同。 如果「演講」又要能達到一部份「課程」的效果,就必須專注在內容本身,也就是著重於技術本身的說明;同時,事前的妥善規劃也很重要。主題的規劃必須客觀大於主觀,才能有課程的感覺。再者,這種形式,讓講者能以更輕鬆的方式進行,就像演講般,帶入一些個人想法,或是加入一些經驗談。 當天也向與會朋友預告了「Dalvik VM in A Nutshell」,希望工作之餘,繼續經營這顆堅果殼。 延伸閱讀 * 2010.1.3: 「Jollen 的 Android Framework in a Nutshell」演講 * 2010.1.26: 「Jollen 的 Android Framework in a Nutshell...

Android Telephony & RIL: 通訊系統架構與實作,課後小記

jollen 發表於 September 13, 2010 12:32 AM

Android Telephony 以及 RIL 是一個重要的議題,內容主要在談論 Android 的電話系統框架,以及 RIL (Radio Interface Layer) 的實作。由於 Android 提供的 RIL 幾乎沒有實作 Modem 端的功能,也缺乏像是 Data Multiplexer 的實作,因此,研究 Telephony 以及實作 RIL 成為了 Android 手機開發的關鍵技術。 在經過一段相當長時間的規劃與調整後,終於在日前成功開設「Android Telephony & RIL: 通訊系統架構與實作」課程,本程也在9月12日順利結訓。這是截至目前為止,在參與過的課程規劃案中,技術複雜度較高的題目。 課程內容除了採集過去開發 Android 手機的經驗外,也將 Telephony & RIL 做了很完整的研究,目標是以深入淺出方式,介紹這個有意思的主題。希望這門課程,能協助學員開發 Android...

[教育訓練紀錄] Android 的 JNI 開發,排名第一名的誤用是?

jollen 發表於 September 27, 2011 12:21 AM

Java 與 native code 的溝通介面稱為 JNI,這是 Android 底層開發的基本技術。不過,有許多 C 語言遺留下來的壤習慣,讓很多系統程式的開發者,一不小心就把 JNI 的程式碼寫錯。本週將會在一場論壇上說明幾個「誤用 C 語言」的例子,希望對 Android 底層開發的初學者有幫助。 近期在協助一家企業進行 Android 內訓,也遇到工程師問起「Java 如何與 C 傳遞資料」的問題,以傳遞陣列來說,其程式碼的寫法,跟傳統的 C 語言寫法有點不同。 從過去的教育訓練經驗裡也能歸納發現,排行榜第一名的誤用莫過於「陣列傳遞」,當 Java 透過 JNI 傳遞 Array 給 native code 時,native code 必須使用 JNI 的 GetIntArrayRegion() method...

[教育訓練紀錄] Android HAL & Framework 課程範例移植至 Android 4.0

jollen 發表於 November 18, 2011 3:18 PM

本課程範例目前已順利移植至 Android 4.0.1 版本。「Android HAL & Framework: 軟硬整合實作訓練」課程,從2009年開辦至今,已經將有二年半的時間了,在這二年多的時間裡,歷經了 Android 1.6/2.1/2.2/2.3 共四個版本,今天也正式踏入了 Android 4.0 版本。 還記得「Android HAL & Framework: 軟硬整合實作訓練」第一次開課是在2009年7月份,在北京紫竹橋附近的訓練教室,大約有50位同學參加。當時,大家是在「不太了解」什麼是 HAL 與 Framework 的情況下來上課,所以似乎是 Android 的超高人氣幫了最大的忙。 這次將課程範例移植至 Android 4.0,其實是一個「無痛」的過程,程式碼實作本身並沒有什麼修改,只須對 Android.mk 做微幅調整,再重新編譯即可。學員若有意將課堂範例移植到 Android 4.0,可參考仕橙3G教室發佈的修改方法,再重新編譯即可。 課程範例的主要訴求是「依循標準架構」來設計,設計如果能符合標準架構,並依循物件導向的觀念,便能得到相當容易維護並移植的程式碼實作。當然這就是這門課程的主軸,「了解 HAL 與 Framework 的架構、設計與原理」。Android 的開發有許多觀念必須事先建立,例如:範例儘可能不去更動 Android 框架的原始碼。由於沒有對...

[教育訓練紀錄] Android 4.0 移植與框架課程:會後小記與學習建議

jollen 發表於 January 17, 2012 2:03 PM

上週三 (1/11) 舉辦的「Ice Cream Sandwich (Android 4.0) 移植與框架」課程,參與情況相當踴躍,覺得非常的感動。所以當然也要使出渾身解數,回報大家的支持。這次的課程有一個比較特別的地方,就是在一些移植工作上,筆者特別將 Android 4.0 的移植工作與 Android 2.3 做比較。 由於 Android 4.0 移植,可以基於 Android 2.3 甚致 Android 3.0 來進行,所以並不需要「從零開始」。基於過去的 Android 移植經驗,可以完成大約 80% 左右的 Android 4.0 移植工作。從學習的角度來看,因為 2.3 與 4.0 的移植技術很許多相同的地方,例如:Product tree 的製作完全相同,因此實際了解 2.3 與 4.0...

[教育訓練紀錄] 如何成功 Android 4.0 移植, #1: 三個常見的kernel configs問題

jollen 發表於 January 31, 2012 11:39 AM

延續「Ice Cream Sandwich (Android 4.0) 移植與框架」課後紀錄,與大家分享一些Android 4.0的移植經驗。移植Android 4.0的第一個階段稱為Bring-up,簡單說,就是要想辦法將Android放到硬體上,並且要能成功開機。 影響是否能Bring-up的關鍵之一,就是kernel的設定。因為驅動程式的關係, 一般認為,使用Linux 3.0系列是比較好的做法。不過,2.6.3x或3.x的版本,都能支援Android 4.0。在這次的課程裡,筆者使用了三個平臺。第一個是MagicLEGO計畫所開發的MagicLEGO開發板,MagicLEGO使用三星的Exynos 4210雙核心處理器。第二個是長高科技開發的DMA-210L開發板,最後一個是devkit8000,這是一個BeagleBoard的複製品。 以上三個平臺,就kernel configs層面來說,需要打開的項目,大約有80%左右的共通性。以下,整理針對執行Android 4.0必要的kernel configs,相信對仍在進行移植工作的朋友,會有一些幫助。 首先,先介紹三個Android 4.0的特性: ● Android 4.0使用Early Suspend ● Android 4.0不支援Virtual Framebuffer ● Android 4.0使用Quota v2 Android 4.0的Surfaceflinger使用到early suspend功能,因此必須將kernel的Early suspend能打開。接著,在Bring-up階段,我們採取穩健做法,先使用Software rendering的方式,讓Android能成功開機,後續再考慮硬體加速的部份。 在Kernel支援Virtual framebuffer的環境下,Software rendering並不能完全正常運作,因此,必須將kernel的Virtual framebuffer功能關閉。另外,Software...

[教育訓練紀錄] 如何成功 Android 4.0 移植, #2: Early suspend 設定

jollen 發表於 February 2, 2012 1:55 PM

本文使用的Linux內核版本是2.6.35.7,若使用其它版本,設定選項的位置可能會有所不同。根據先前的說明,我們將分別設定Early suspend、Quota v2與Framebuffer功能。 關於 Early suspend 的設定,請打開以下功能: ● Power management options -> Wake lock (圖1) ● Power management options -> Wake lock -> Early suspend (圖1) 圖1: Wake lock 與 Early suspend 設定 接著,底下有一個項目: ● User-space screen access (圖2) 圖2:...

[教育訓練紀錄] HTML5+JavaScript 設計模式:jQuery pattern

jollen 發表於 June 18, 2012 12:23 PM

上週在北京舉辦「課程名稱HTML5 & 雲端整合: 深入MOBILE & CLOUD 設計模式」課程。這門課是從 HTML5 觀念到實作的第一門課(The 1st lesson from concepts to practice),這門課的重點在於「設計模式」(Design pattern)。 當天介紹了「jQuery pattern」。jQuery pattern就是開發jQuery插件(Plugin)的方式,所以技術上倒也沒有什麼學問。不過,jQuery pattern有很高深的哲學道理,意思是說,在軟體工程領域裡,它創造了一個獨特的觀念。這個觀念就是jQuery知名的”$”(Dollar sign),也就是「Selector」。 以下的例子,就是jQuery pattern: $(“div#news”).html(“<h2>News Today</h2>”); 從jQuery設計模式的角度思考,如果今天我們想要透過WebSocket與伺服器溝通,並且在一個”div”裡來顯示結果,應該怎麼設計呢?想法如下: 1. 將WebSocket的功能寫成一個function 2. 將JavaScript function封裝成module 3. 在jQuery裡擴充新的函數,簡單說,就是製作一個jQuery插件(Plugin) 以下是一段程式碼樣板: (function($) { $.fn.createWebSocket = function ()...

[教育訓練紀錄] jQuery 模式的優點:提升 JavaScript 程式碼效率

jollen 發表於 June 27, 2012 5:28 PM

在教育訓練課程「HTML5 軟件開發: Mobile, Web & Cloud 設計模式」裡提到「使用 JavaScript 選擇器」可提升程式碼效能的原則。這個觀念,可延續前一篇日記的內容繼續探討。 在實作Web Socket連線生成時,筆者選擇使用了jQuery pattern的觀念來實作。jQuery pattern 本質上是一種選擇器模式。 為什麼要使用選擇器模式,除了程式碼的組織較好外,另一個原因就是效能:使用選擇器方式可以讓JavaScript程式碼效能更好。 根據不同瀏覽器的實作,選擇器模式可以達到超過十倍以上的效能。典型的選擇器模式,是直接呼叫DOM的API: document.querySelector(“#header”); 使用jQuery的選擇器「$」是目前的主流做法。再回顧上一篇日記的寫去: <div id="message"></div> <script type="text/javascript"> $("#message").createWebSocket(); </script> 總計利用了三個模式: 以Closure模式將類別封閉,這與Static class有關係,在這裡先不做討論 使用選擇器模式,範例採用目前最流行的jQuery selector ”$” Read/Write Div Pattern 選擇器模式的效率取決於瀏覽器本身的實作,不過,以選擇器模式來代替直接存取DOM,一般相信是最好的做法。...

即將開始提供的內訓課程:Android 電源管理、硬體加速與 Multi-Core HAL

jollen 發表於 September 11, 2012 11:28 PM

這二個月的時間,有一半都投資在 Multi-Core 的技術工作上,開發之餘,順勢整理了 8 門課程給一些客戶。日前也開始進入教材編輯階段了,本週完成 3 門課程,在此簡單做個紀錄。 Android 電源管理: PowerManagerService, Power Hint 與 Power HAL Jelly Bean 強化了 Power HAL 的功能,並且透過 Power Hint 的方式增強 Power Saving。這個主題會著重在 Power HAL 的實作,以及 Wakelock 的原理。如何將 Control Group、CPU Governors 與 PowerManagerService 放在一起使用 (Put all together):能達到什麼目標,解決哪些過去的問題?都是這門課程的重點。...

[教育訓練紀錄] 讓 Android WebView 支援 WebSocket Client

jollen 發表於 October 19, 2012 11:48 AM

Android 內建瀏覽器不支援 WebSocket Client 端,導致使用 HTML5 開發的 Apps 無法使用 WebSocket 與 Server 建立連線。主要的問題在於 WebView 元件沒有實作 WebSocket 協定。Android SDK + PhoneGap 所製作 HTML5 Apps 是將 WebView 封裝至 APK 裡,所以 WebSocket 無法正常工作是正常的。 不過這個問題也沒有那麼難解決,在等待 WebView 加入 WebSocket 以及更多 HTML5 功能前,我們只能暫時自行實作。還好,現在有很多 Open source 的...

[教育訓練紀錄] 關於 SurfaceFlinger::createSurface() 的 DisplayID

jollen 發表於 February 4, 2013 8:53 PM

近期為幾家科技廠進行 Android 的企業內訓,課程主題著重於 Framework 層。最近的內訓主題是 Android Graphics 系統。今天 (2/4) 在講解 SurfaceFlinger Server 建立 Surface 時,提到這個方法: 1287 sp<ISurface> SurfaceFlinger::createSurface( 1288 ISurfaceComposerClient::surface_data_t* params, 1289 const String8& name, 1290 const sp<Client>& client, 1291 DisplayID d, uint32_t w, uint32_t h, PixelFormat format, 1292 uint32_t...

Top | 授權條款 | Jollen's Forum: Blog 評論、討論與搜尋
Copyright(c) 2006 www.jollen.org