鄭卓彬 + 原創(chuàng)作品轉(zhuǎn)載請(qǐng)注明出處 + 《Linux內(nèi)核分析》MOOC課程http://mooc.study.163.com/course/USTC-1000029000
本次作業(yè),主要是理解libc庫(kù)和系統(tǒng)調(diào)用之間的聯(lián)系
本次實(shí)驗(yàn)步驟:
1.寫一個(gè)簡(jiǎn)單的c語(yǔ)言程序听怕,里面要求使用包含系統(tǒng)調(diào)用的api淆院。
2.寫一個(gè)和上述c語(yǔ)言程序同樣功能的c代碼浅役,只是里面的libc庫(kù)函數(shù)調(diào)用api要使用嵌入?yún)R編語(yǔ)言代碼代替鸥印。
閑話不多說(shuō)妄呕,上代碼:
解析:該程序調(diào)用了libc庫(kù)函數(shù)中的fork函數(shù)傀履。
效果(如圖二):
制造出一個(gè)子線程鸥鹉,如果是子線程 輸出“I'm your chile , id : 0”
如果說(shuō)父線程 輸出“I'm your father , id : ‘父線程號(hào)’ " ?
使用匯編的c程序:
解析:該程序的其余部分與原c程序中代碼相同,只是用嵌入?yún)R編代替了fork()函數(shù)余境。
讓我們一步步分析:
1.第一行:
"mov $0,%%ebx" ? : ? #將立即數(shù)0傳給%ebx寄存器
知識(shí)延伸:系統(tǒng)調(diào)用也需要參數(shù)驻呐,系統(tǒng)調(diào)用的參數(shù)使用的是寄存器傳值方法灌诅,可以通過(guò)向(%ebx,%ecx,%edx,%esi,%edi,%ebp)這六個(gè)寄存器傳值達(dá)到給系統(tǒng)調(diào)用傳參的效果。本程序中給%ebx傳0是代表傳入?yún)?shù)NULL含末。
2.第二行:
"mov $0x2,%%eax":#將立即數(shù)2傳給%eax寄存器
知識(shí)延伸:系統(tǒng)有許多種類的調(diào)用猜拾,如何讓系統(tǒng)知道調(diào)用哪個(gè)程序呢?這要靠傳入“調(diào)用號(hào)”來(lái)實(shí)現(xiàn),內(nèi)核通過(guò)%eax寄存器辨別中的值來(lái)判斷調(diào)用哪個(gè)系統(tǒng)調(diào)用佣盒,sys_fork系統(tǒng)調(diào)用的調(diào)用號(hào)是0x2挎袜,所以本程序傳入0x2給%eax寄存器。系統(tǒng)調(diào)用號(hào)對(duì)應(yīng)調(diào)用:http://codelab.shiyanlou.com/xref/linux-3.18.6/arch/x86/syscalls/syscall_32.tbl
3.第三行:
"int ?$0x80" : #進(jìn)入系統(tǒng)調(diào)用
4.第四行:
"mov %%eax,%0" :#將返回值傳給變量pid
知識(shí)延伸:系統(tǒng)調(diào)用的返回值存儲(chǔ)在寄存器%eax中
總結(jié):
本次實(shí)驗(yàn)學(xué)習(xí)到了如何在c語(yǔ)言中嵌入?yún)R編代碼以及如何使用匯編代碼調(diào)度系統(tǒng)調(diào)用肥惭。