1. 程式人生 > >Linux核心初始化過程的原始碼分析疑點記錄+好書推薦(附下載)

Linux核心初始化過程的原始碼分析疑點記錄+好書推薦(附下載)

    這個對基於PowerPC的Linux核心原始碼剖析的文章已經寫了三篇了(見前三篇博文),由於可以找到的關於PowerPC E300處理器的Linux文章基本沒有,這些都是一點點摸索的,可能存在不少的錯誤,特別是第3篇,自我感覺很差,開始計劃寫這個系列的時候,自以為已經很瞭解PowerPC的內部體系了,現在回首,還是有很大的提升空間啊。這個系列到這裡也算是一箇中節點了,我打算先放一放,處理好工作上的瑣事,然後再細細看一下E300核心的機制,再來開篇續集。

    這裡分享下一本很好的對PowerPC Linux做介紹的書---《Linux PowerPC詳解-核心篇》,機械工業出版社,王齊編著。本書基於E500處理器,介紹了Linux PowerPC的組成;PowerPC的指令集、暫存器、記憶體體系結構等;還講述了程序排程、中斷處理、記憶體管理MMU等知識。對於想入手Linux+PowerPC的童鞋,是不可多得的好資料。希望大家共同學習,共同進步。詳細見我的上傳資源:

http://download.csdn.net/detail/JuanA1/3752721

    再總結一下在分析程式碼時碰到的疑問,算是備案,也算是求助,只要解決了,我都會留言說明的,如下:

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初始化那麼複雜,花了很久都沒能理清,是以後摸索的重點。

歡迎高手解答!!