跳到主要內容

發表文章

目前顯示的是 3月, 2013的文章

書籍推薦:一步步寫嵌入式操作系統

市面上已經出現不少教導如何撰寫小型作業系統的書籍,相關線上課程也不少,藉由研讀與實作這些寶貴知識,可以讓我們面對複雜系統時,更得心應手。在我看過的資料裡, 一步步寫嵌入式操作系統 算是最淺顯易懂,並且說理清晰的一本。 以下是各章節的簡介: 第一章:搭建工作環境 作者針對 S3C2410 晶片進行開發,這是一顆 ARM920T 的 SoC ,線上資源豐富,複雜度也不高。以 Skyeye 作為模擬器,免去實際硬體燒錄的麻煩,不過要注意某些程式碼稍嫌簡化,若在實際硬體上需再加進一些初始化動作,但並不影響整體學習。toolchain 使用目前業界慣用的 GNU toolchain 。 第二章:基礎知識 如果在學習 OS 之前,欠缺基本的 linking, loading 的觀念,並且也對基本程式開發工具不熟悉,那麼這章可以好好看一下,作者提供剛剛好夠用的說明。若需要對 linker 與 loader 的完整觀念,可以閱讀 程式設計師的自我修養 。 第三章:操作系統的啟動 這章講解 ARM 的啟動流程,以及必需的初始化設定,讀者可以從這章了解 ARM 的基本架構,尤其是 MMU 的設定部份。由於是 ARMv4 的架構,所以相比於目前最新的 ARMv7, v8 要來的簡潔很多,但主要的功能卻又相當完備,非常適合學習。 第四章:打印函數 這章教導如何實作 printf ,主要說明了 C 語言中的 variadic funtion 底層原理,如果沒 玩弄過 stack 的朋友,可以好好玩一下。:-) 第五章:中斷處理 即使是撰寫過不少 Linux driver 的朋友,可能都不曾設定過 interrupt controller,透過這章的說明,可以嘗試一下如何將 interrupt 與特定 CPU 掛鉤,並思考不同 interrupt 策略的取捨。我個人認為這章稍嫌不足的部份是說明 interrupt source 的幾種關鍵屬性,尤其是 trigger type 的選擇。有機會整理好後再發一篇 blog 說明我的想法 。 第六章:動態內存管理 對 OS 而言,記憶體管理除了 MMU 以外,另一個重點就是如何 有效動態分配 。作者在這章實作了簡易版本的 buddy system 與 slab layer。無論實作與說明都非常精彩。

Memory Barrier in Lock API

由於現今 CPU 與編譯器俱備各種強大的最佳化機制( speculative execution , ALU/LSU pipelines, cache...),使得程式在執行時,並不像程式設計師在 source code level 看到那樣地循序執行。一般情況下,這不會有問題,因為 CPU 通常只會對"獨立的"指令進行重排,但是當我們是在 multi-core 的情況下,就不是這麼顯而易見了。 今天想談一個 memory barrier 的典型應用,當作是...嗯,為研讀 CPU spec 作點整理。 考慮一個情況,現在我們要設計一組 lock/unlock 的 sync API,作為 multithread 的資源同步機制。在沒有 pthread 或其他 OS system call 可用的情況下,我們要如何實現呢? 底下是一個簡單的作法: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 struct L { volatile atomic_t flag ; }; void lock_init ( struct * L ) { L -> flag = 0 ; } void lock ( struct * L ) { while ( 1 ) { // if L->flag == 1, atomic_test_and_set does nothing and return 0 // else set it to 1 and return 1 if ( atomic_test_and_set ( L -> flag , 1 )) { break ;