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 ...