總結(jié)一句話:系統(tǒng)調(diào)用的本質(zhì),通過sc指令觸發(fā)異常,完成用戶態(tài)到內(nèi)核的轉(zhuǎn)換。
展開一些:應(yīng)用程序調(diào)用fork(),fork()是一個(gè)glibc函數(shù),該函數(shù)的最底層調(diào)用sc指令,觸發(fā)cpu異常,從而完成從用戶態(tài)到內(nèi)核態(tài)的切換,
內(nèi)核:在異常處理中完成fork()的內(nèi)核態(tài)處理,然后通過rfi指令返回到用戶態(tài)。
1、fork()定義:
文件:fork.c (sysdeps ptl)
可見,fork 是一個(gè)別名,其函數(shù)原本是__libc_fork(),看這個(gè)函數(shù)的定義,
2、__libc_fork()定義:
文件:同上
。。。。。。 (函數(shù)較長)
經(jīng)過分析,不同cpu進(jìn)入內(nèi)核態(tài)的軟中斷指令是不一樣的,所以,一定會有和cpu有關(guān)的定義。果然,如下,
從源碼上可以看出,如果沒定義ARCH_FORK宏,系統(tǒng)會報(bào)錯(cuò)的。
3、powerpc的ARCH_FORK()宏定義
文件:arch-fork.h (sysdepsunixsysvlinuxpowerpc)
此文件中就只有一行代碼。竟然是包含x86的源碼文件。
x86的源碼如下:
文件:arch-fork.h (sysdepsunixsysvlinuxi386)
4、INLINE_SYSCALL的定義:
文件:sysdep.h (sysdepsunixsysvlinuxpowerpcpowerpc32)
5、INTERNAL_SYSCALL的定義:
文件:同上
__NR_##name 是一種編程技巧,兩個(gè)#表示把前后粘貼在一起,其實(shí)這個(gè)宏就是 __NR_clone
6、__NR_clone宏定義
文件:clone.S (sysdepsunixsysvlinuxi386)
7、INTERNAL_SYSCALL_NCS 宏定義
文件:sysdep.h (sysdepsunixsysvlinuxpowerpcpowerpc32)
8、準(zhǔn)備參數(shù) LOADARGS_5
文件:sysdep.h (sysdepsunixsysvlinuxpowerpcpowerpc32)
從這個(gè)代碼看,核心思想是,將120這個(gè)數(shù)字填入r0,這個(gè)是系統(tǒng)調(diào)用號,后面的r3,r4,r5,r6,r7就是參數(shù)
9、軟中斷匯編指令sc,觸發(fā)系統(tǒng)異常
芯片資料上的描述如下:
1、ppc_clone()異常處理入口:
文件:entry_32.S (archpowerpckernel)
內(nèi)容:
2、sys_clone的定義:
文件:process.c (archpowerpckernel)
內(nèi)容:
3、do_fork()函數(shù)實(shí)現(xiàn):
文件:fork.c (kernel)
內(nèi)容:
。。。。。。(內(nèi)容較長)
4、從異常處理中返回 RFI
文件:ppc_asm.h (archpowerpcincludeasm)
內(nèi)容: