跳到主要內容

發表文章

目前顯示的是有「arm」標籤的文章

淺讀CuRT:task, context switch與scheduling

上一篇 整理了CuRT從硬體上電後到跳入C function前所作的事情,本篇文章則會紀錄CuRT如何準備multitasking環境,以及CuRT於執行期的行為分析。 在app/shell/main.c中,我們可以看到main()的開頭為: int main() {         SerialInit();         init_interrupt_control();         init_curt(); ... SerialInit()只是把UART port初始化,方便printf()可以正常運作。init_interrupt_control()則設定pxa255的interrupt controller可以接收外部的interrupt sources,稍後啟動的timer就會發出定期的interrupt驅動scheduling。init_curt()作的事情就比較多了點,讓我們進去瞧一瞧: void init_curt() {         int i;         for (i = 0; i < MAX_PRIO; i++) {                 prio_exist_flag[i] = false;                 init_list(&ready_list[i]);         }         init_list(&delayed_list);         init_list(&blocked_list);         init_list(&termination_wai...

淺讀CuRT:啟動流程

Jserv 所寫的 CuRT 是一個非常輕量級的kernel,運行於ARMv5( PXA255 )。很適合拿來作為熟習ARM基本架構與實驗作業系統的各項技術。今天下載後,發現在我的環境(ubuntu12.04)需要作點修改才能通過編譯並正常執行,改完索性clone了一份上 github ,以利之後實驗修改。這篇文章則是為研讀此kernel所作的一系列紀錄的開頭。 千頭萬緒,從何開始呢?ARM規範其CPU reset後從0x0的位址開始執行,從PXA255的 手冊 上可知,初始的0x0落於boot ROM的範圍: 但是觀察編譯出來的curt_image.elf可以發現,其link address都以0xa0000000為base,這段位址落於SDRAM的範圍: 由於SDRAM必須要有controller控制時序,所以應該會先由boot ROM將其設定好後再搬過去執行。以上幾件事要能夠運行成功,那麼就勢必在初始時要有一段PIC的程式作relocation(或以某種方式remap address range),等等我們便可發現確實存在這樣的一段代碼。 觀察curt_image.elf的disassembly可知道,_start是.text的起頭,此符號定義於arch/arm/mach-pxa/start.S,所以我們就從這個檔案開始看起吧。:-) .text /* exception handler vector table */ _start: b reset_handler b und_handler b swi_handler b abt_pref_handler b abt_data_handler b not_used b irq_handler b fiq_handler 這邊是典型的reset vector的部份,由於除了reset_handler以外的其他mode我目前還不感興趣,所以就直接跳到reset_handler繼續看: reset_handler:  b set_misc set_misc: ... mask_off_int_reg: /* Mask off all IRQs and FIQs */ ... init_clock_reg: /* PXA250...

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

市面上已經出現不少教導如何撰寫小型作業系統的書籍,相關線上課程也不少,藉由研讀與實作這些寶貴知識,可以讓我們面對複雜系統時,更得心應手。在我看過的資料裡, 一步步寫嵌入式操作系統 算是最淺顯易懂,並且說理清晰的一本。 以下是各章節的簡介: 第一章:搭建工作環境 作者針對 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。無論實作與說明都非常精彩。 ...