- 在上一次的Linux系統(tǒng)調(diào)用窺探介紹中配名,我選取了sys_getpid這個(gè)系統(tǒng)調(diào)用,這個(gè)系統(tǒng)調(diào)用比較簡(jiǎn)單婴程,調(diào)用號(hào)0X14廓奕,除此之外不需要額外的參數(shù)傳遞。
當(dāng)然档叔,如果確實(shí)對(duì)參數(shù)的傳遞桌粉,ebx、ecx衙四、edx铃肯、esi、edi传蹈、ebp這幾個(gè)寄存器究竟是從左到右還是從右到左地存儲(chǔ)我們傳遞的參數(shù)押逼,實(shí)際上是arg1對(duì)應(yīng)ebx,arg2對(duì)應(yīng)ecx惦界,以此類(lèi)推挑格。function(arg1, arg2, arg3, arg4, arg5, arg6);
- 由于Linux內(nèi)核中沒(méi)有調(diào)試器,理論上沾歪,如果真的想調(diào)試內(nèi)核的工作過(guò)程漂彤,需要用更加geek的方法。通過(guò)一些強(qiáng)大的第三方工具,如kdb显歧、kgdb對(duì)內(nèi)核打補(bǔ)丁仪或,將這些調(diào)試器附加到內(nèi)核上,就可以完成調(diào)試內(nèi)核的心愿士骤。
調(diào)試是軟件開(kāi)發(fā)過(guò)程中一個(gè)必不可少的環(huán)節(jié)范删,在 Linux 內(nèi)核開(kāi)發(fā)的過(guò)程中也不可避免地會(huì)面對(duì)如何調(diào)試內(nèi)核的問(wèn)題。但是拷肌,Linux 系統(tǒng)的開(kāi)發(fā)者出于保證內(nèi)核代碼正確性的考慮到旦,不愿意在 Linux 內(nèi)核源代碼樹(shù)中加入一個(gè)調(diào)試器。他們認(rèn)為內(nèi)核中的調(diào)試器會(huì)誤導(dǎo)開(kāi)發(fā)者巨缘,從而引入不良的修正[1]添忘。所以對(duì) Linux 內(nèi)核進(jìn)行調(diào)試一直是個(gè)令內(nèi)核程序員感到棘手的問(wèn)題,調(diào)試工作的艱苦性是內(nèi)核級(jí)的開(kāi)發(fā)區(qū)別于用戶(hù)級(jí)開(kāi)發(fā)的一個(gè)顯著特點(diǎn)若锁。
可以看到搁骑,我們?cè)趕ys_getpid處設(shè)置了斷點(diǎn)。
c運(yùn)行又固,由于我們正常的啟動(dòng)流程仲器,系統(tǒng)并不會(huì)觸發(fā)斷點(diǎn)。
執(zhí)行我們想要的程序仰冠,因?yàn)闋可娴较到y(tǒng)調(diào)用乏冀,故運(yùn)行到斷點(diǎn)處停下。
- 可以看到洋只,系統(tǒng)停在了SYSCALL_DEFINE0(getpid)處辆沦,此時(shí),我們不再用n识虚、s進(jìn)行源碼的運(yùn)行肢扯,而是用ni、si運(yùn)行匯編代碼舷礼。
si一步一步運(yùn)行鹃彻,可以發(fā)現(xiàn),運(yùn)行到了syscall_exit處:
syscall_exit:
LOCKDEP_SYS_EXIT
DISABLE_INTERRUPTS(CLBR_ANY) # make sure we don't miss an interrupt
# setting need_resched or sigpending
# between sampling and the iret
TRACE_IRQS_OFF
movl TI_flags(%ebp), %ecx
testl $_TIF_ALLWORK_MASK, %ecx # current->work
jne syscall_exit_work
接下來(lái)妻献,代碼的運(yùn)行過(guò)程蛛株,像是進(jìn)入了一個(gè)混沌世界。
通過(guò)跟蹤育拨,可以發(fā)現(xiàn)谨履,大概系統(tǒng)執(zhí)行了INTERRUPT_RETURN之后便返回了。
- 有個(gè)奇怪的問(wèn)題熬丧,發(fā)現(xiàn)我用C語(yǔ)言和用匯編語(yǔ)言寫(xiě)的兩份系統(tǒng)調(diào)用的特性不太一致笋粟,路徑不一樣。
- C語(yǔ)言寫(xiě)的話(huà),只能第一次在系統(tǒng)中斷處停下害捕,如果是匯編绿淋,則每次都能在中斷處停下。
- 這說(shuō)明什么呢尝盼,C語(yǔ)言的庫(kù)函數(shù)getpid()實(shí)現(xiàn)的邏輯我們未知吞滞,需要再次發(fā)掘。
至于調(diào)度點(diǎn)盾沫,暫時(shí)還未發(fā)現(xiàn)裁赠。