linux啟動流程分析 4

2021-05-24 23:44:04 字數 4056 閱讀 1940

author: taoyuetao

email: [email protected]

blog:

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。

__lookup_processor_type

函式__lookup_processor_type介紹:

核心中使用了乙個結構struct proc_info_list,用來記錄處理器相關的資訊,該結構定義在

kernel/include/asm-arm/procinfo.h標頭檔案中。

/* 

* note!  struct processor is always defined if we're

* using multi_cpu, otherwise this entry is unused,

* but still exists.

** note! the following structure is defined by assembly

* language, not c code.  for more information, check:

*  arch/arm/mm/proc-*.s and arch/arm/kernel/head-armv.s

*/    

struct proc_info_list ; 

在arch/arm/mm/proc-xscale.s檔案中定義了所有和xscale有關的proc_info_list,我們使用的pxa270定義如下:

.section ".proc.info", #alloc, #execinstr

.type   __bva0_proc_info,#object

__bva0_proc_info:

.long   0x69054110          @ bulverde a0: 0x69054110, a1 : 0x69054111.

.long   0xfffffff0          @ and this is the cpu id mask.

#if cache_write_through

.long   0x00000c0a

#else

.long   0x00000c0e

#endif

b   __xscale_setup

.long   cpu_arch_name

.long   cpu_elf_name

.long   hwcap_swp|hwcap_half|hwcap_thumb|hwcap_fast_mult|hwcap_edsp|hwcap_xscale

.long   cpu_bva0_info

.long   xscale_processor_functions

.size   __bva0_proc_info, . - __bva0_proc_info

由於.section指示符,上面定義的__bva0_proc_info資訊在編譯的時候被放到了.proc.info段中,這是由linux的

鏈結指令碼檔案vmlinux.lds指定的,參考如下:

sections

4    sub r5, r5, r10         @ convert addresses

5    add r7, r7, r5          @ to our address space

6    add r10, r9, r5

7    mrc p15, 0, r9, c0, c0      @ get processor id

8 1:   ldmia   r10,        @ value, mask, mmuflags

9    and r6, r6, r9          @ mask wanted bits

10   teq r5, r6

11   moveq   pc, lr

12   add r10, r10, #36           @ sizeof(proc_info_list)

13   cmp r10, r7

14   blt 1b

15   mov r10, #0             @ unknown processor

16   mov pc, lr

/*     

* look in include/asm-arm/procinfo.h and arch/arm/kernel/arch.[ch] for

* more information about the __proc_info and __arch_info structures.

*/    

17 2:     .long   __proc_info_end

18        .long   __proc_info_begin

19        .long   2b

20        .long   __arch_info_begin

21        .long   __arch_info_end

Linux啟動流程分析

linux系統從啟動到提供服務的過程是這樣,先是機器加電,然後通過mbr或者uefi載入grub,再啟動核心,核心啟動服務,然後開始對外服務。載入bios的硬體資訊與進行自我測試,並依據設定取得第乙個可啟動的裝置 比如硬碟 讀取並執行第乙個開機裝置內mbr 的boot loader 即grub2,s...

Linux啟動流程分析

1.獲取資訊 當按下電源鍵後,系統首先就會去載入bios basic input output system 並通過bios程式去載入cmos的資訊,並且藉由cmos內的設定取得主機的各項硬體配置。例如cpu與介面裝置的溝通頻率 啟動裝置的查詢順序 硬碟的大小與型別 系統時間 各周邊匯流排是否啟動p...

4 oracle 啟動流程分析

1.with grant option 表示得到許可權的使用者可以把許可權繼續分派 with admin option 把系統許可權繼續分配 2.使用profile管理使用者口令 create profile 檔名 limit failed login attempts 嘗試次數 password ...