[轉載] linux啓動流程分析(4)---彙編部分(1)

原文地址:http://www.eetop.cn/blog/html/45/11145-1367.ht

 

================================

Author: taoyuetao
Email:[email protected]
Blog:http://www.eetop.cn/blog/?11145

2007-02-08

================================

在網上參考很多高手的文章,又加入了自己的一點兒內容,整理了一下,裏面還有很多不明白的地方,而且也會有理解錯誤

的地方,望高手指點,自己也會不斷進行修改


當進入linux 內核後,arch/arm/kernel/head-armv.S是內核最先執行的一個文件,包括從內核入口ENTRY(stext)到
start_kernel之間的初始化代碼,下面以我所是用的平臺intel pxa270爲例,說明一下他的彙編代碼:

1    .section ".text.init",#alloc,#execinstr
2    .type   stext, #function
/* 內核入口點 */
3 ENTRY(stext)
4    mov r12, r0
/* 程序狀態,禁止FIQ、IRQ,設定SVC模式 */    
5     mov r0, #F_BIT | I_BIT | MODE_SVC   @ make sure svc mode
6    msr cpsr_c, r0          @ and all irqs disabled
/* 判斷CPU類型,查找運行的CPU ID值與Linux編譯支持的ID值是否支持 */
7    bl  __lookup_processor_type
/* 判斷如果r10的值爲0,則表示函數執行錯誤,跳轉到出錯處理,*/
/* 出錯處理函數__error的實現代碼定義在debug-armv.S中,這裏就不再作過多介紹了 */
8    teq r10, #0             @ invalid processor?
9    moveq   r0, #'p'            @ yes, error 'p'
10   beq __error
/* 判斷體系類型,查看R1寄存器的Architecture Type值是否支持 */
11   bl  __lookup_architecture_type
/* 判斷如果r7的值爲0,則表示函數執行錯誤,跳轉到出錯處理,*/
12   teq r7, #0              @ invalid architecture?
13   moveq   r0, #'a'            @ yes, error 'a'
14   beq __error
/* 創建核心頁表 */
15   bl  __create_page_tables
16   adr lr, __ret           @ return address
17   add pc, r10, #12            @ initialise processor
                              @ (return control reg)
                             
第5行,準備進入SVC工作模式,同時關閉中斷(I_BIT)和快速中斷(F_BIT)
第7行,查看處理器類型,主要是爲了得到處理器的ID以及頁表的flags。
第11行,查看一些體系結構的信息。
第15行,建立頁表。
第17行,跳轉到處理器的初始化函數,其函數地址是從__lookup_processor_type中得到的,
需要注意的是第16行,當處理器初始化完成後,會直接跳轉到__ret去執行,
這是由於初始化函數最後的語句是mov pc, lr。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章