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...

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