5 x) r* j3 A& G Q; Yline 84, movs的意思是說,做mov的動作,並且將指令的S bit設起來,最後的結果也會update CPSR。這個指令執行的過程當中,會根據你要搬動的值去把N and Z flag設好。這個是有助於下個指令做check的動作。# z/ B" y9 c& s( A, {- L) q1 P' s
line 85, 就是r5 = 0的話,就跳到__error_p去執行。& h3 I2 }( D) L) W. u& L) g
line 86, 跳到__lookup_machine_type。原理跟剛剛找proc的資料一樣。
83 bl __lookup_processor_type @ r5=procinfo r9=cpuid 9 W7 g4 @0 V. l$ W
84 movs r10, r5 @ invalid processor (r5=0)?- e' N& m# \3 K
85 beq __error_p @ yes, error 'p' 1 J. h9 y, u! |. V. X% O
86 bl __lookup_machine_type @ r5=machinfo
複製代碼
看得出來跟proc很像,有個兩個小地方是4 J/ @; E) U$ A6 f7 Q6 N) I/ j1 b" e
1 `2 j9 z! a2 I* t# U# `/ t
1. line 207,用ldmia不是用ldmda。原因就在於存放arch 和 proc info 的位址剛好相反。一個在lable3的上面。一個在的下方。設計上應該是可以做修改的。8 V9 o! O6 w9 W
$ f( J5 |# S+ W0 `, ^
2. arch定義的方式是透過macro,可以先看 ./include/asm-arm/mach/arch.h。裡頭有個 MACHINE_START ,這邊會設好macro,到時候直接使用就可以把arch的info宣告好。 例如 ./arch/arm/mach-omap1/board-generic.c
/* macro */ 4 l9 Z- _0 K% o2 h6 ~+ z
50 #define MACHINE_START(_type,_name) \ ) C& u: p- r1 M
line 231, 將位址等於 r10+PROCINFO_MM_MMUFLAGS 裡頭的值放到r7。r10是proc_info的位址。proc的info data structure被定義在『./include/asm-arm/procinfo.h』,offset取得的方式用compiler的功能,以便以後新增structure的欄位的時候不需要更動程式碼。這邊的動作合起來就是讀預設要設給mmu flags的值。
line 170~174,設置好domain access。(domain access可以先當成設置access的權限,或許以後可以寫詳細的文章說明)) h5 T9 A+ A' Y& x( t9 l) t
line 175~176,將create好的page table開頭丟給mmu。跳到turn_mmu_on