這個對基於PowerPC的Linux內核源碼剖析的文章已經寫了三篇了(見前三篇http://www.linuxidc.com/Linux/2011-11/46582.htm 與 http://www.linuxidc.com/Linux/2011-11/46581.htm 還有 http://www.linuxidc.com/Linux/2011-11/46583.htm),由於可以找到的關於PowerPC E300處理器的Linux文章基本沒有,這些都是一點點摸索的,可能存在不少的錯誤,特別是第3篇,自我感覺很差,開始計劃寫這個系列的時候,自以為已經很了解PowerPC的內部體系了,現在回首,還是有很大的提升空間啊。這個系列到這裡也算是一個中節點了,我打算先放一放,處理好工作上的瑣事,然後再細細看一下E300內核的機制,再來開篇續集。
這裡分享下一本很好的對PowerPC Linux做介紹的書---《Linux PowerPC詳解-核心篇》,機械工業出版社,王齊編著。本書基於E500處理器,介紹了Linux PowerPC的組成;PowerPC的指令集、寄存器、內存體系結構等;還講述了進程調度、中斷處理、內存管理MMU等知識。對於想入手Linux+PowerPC的童鞋,是不可多得的好資料。希望大家共同學習,共同進步。詳細見:http://www.linuxidc.com/Linux/2011-11/46578.htm
再總結一下在分析代碼時碰到的疑問,算是備案,也算是求助,只要解決了,我都會留言說明的,如下:
1、head.s開始時,首先根據PowerPC ABI規范,保存r3、r4、r5、r6和r7,然後調用early_init,現在只知道r3保存函數返回值,其余未知。__start一開始就cmpwi 0,r5,0,是判斷什麼?
2、在early_init階段,內核會為CPU特性做fixup處理,調用的幾個do_feature_fixup函數,雖然勉強知道是用於代碼復用的處理器特性處理,但具體機制不清楚,輸入參數__start___ftr_fixup、__stop___ftr_fixup都不清楚含義。
3、在__init_fpu_registers中,有一個REST_32FPRS(0,r9),r9為空數組,宏定義如下:
#define REST_FPR(n, base) lfd n,THREAD_FPR0+8*TS_FPRWIDTH*(n)(base) /*THREAD_FPR0為double fpr[32][TS_FPRWIDTH]在結構體thread_struct中的偏移*/
這句也一直不清楚,是不是清FPR的操作?
4、Linux有一個Oops機制,用於處理內核的異常,處理Oops異常的入口位於head_32.S中的trun_on_mmu函數後面的一大段代碼,其中還和arch/powerpc/kvm文件夾下的程序有關。(Sailor的CSDN博客有相關介紹)
5、接上面,Linux中的異常處理,在head_32.S中有一大段的代碼,一直沒敢去碰它,初始化時碰到的DSI異常和PTE中的IMISS和DMISS也都是一筆帶過,要找時間和資料細細分析下。
6、函數lockdep_init是什麼意思? 雖然知道是用於啟動Lock Dependency Validator(內核依賴的關系表),本質上就是建立兩個散列表calsshash_table和chainhash_table,並初始化全局變量lockdep_initialized,標志已初始化完成。但還是不清楚,有沒有更直白點的解釋?
7、Linux內核在啟動早期就會在屏幕打印輸出(BTEXT),以及後來的machin_init中的調試使能函數,對於PowerPC就是NS16550的串口,具體的初始化方法和機制都不是很清楚。
8、MMU硬件初始化的流程,可能是心裡太亂了,又正好E300的MMU初始化那麼復雜,花了很久都沒能理清,是以後摸索的重點。