系統(tǒng)大全為您提供我們都知道系統(tǒng)功能調(diào)用是Unix/Linux操作系統(tǒng)向用戶程序提供支持的接口,通過這些接口應(yīng)用程序向操作系統(tǒng)請(qǐng)求服務(wù),控制轉(zhuǎn)向操作系統(tǒng),而操作系統(tǒng)在完成服務(wù)后,將控制和結(jié)果返回給用戶程序。系統(tǒng)調(diào)用的主要目的是使得用戶可以使用操作系統(tǒng)提供的有關(guān)設(shè)備管理、輸入/輸出系統(tǒng)、文件系統(tǒng)和進(jìn)程控制、通信以及存儲(chǔ)管理等方面的功能,而不必了解系統(tǒng)程序的內(nèi)部結(jié)構(gòu)和有關(guān)硬件細(xì)節(jié),從而起到減輕用戶負(fù)擔(dān)和保護(hù)系統(tǒng)以及提高資源利用率的作用。在進(jìn)行系統(tǒng)功能調(diào)用時(shí)會(huì)由用戶態(tài)(也稱目態(tài))轉(zhuǎn)到核態(tài)(也稱管態(tài))。昨天我的一信安的朋友還問過我管態(tài)和目態(tài)的區(qū)別,我想來想去也就是這里有大的區(qū)別了,在管態(tài)下能使用系統(tǒng)的所有資源,調(diào)用系統(tǒng)的特權(quán)函數(shù),而目態(tài)是不行的。在執(zhí)行系統(tǒng)功能調(diào)用時(shí)就必須是在管態(tài)下執(zhí)行。而如果我需要給我的linux系統(tǒng)增加一個(gè)系統(tǒng)功能調(diào)用的話,就必須弄清楚系統(tǒng)是如何調(diào)用那些功能函數(shù)的,又是如何由目態(tài)變?yōu)楣軕B(tài)的。在linux下可以通過中斷來進(jìn)入管態(tài),這類中斷稱為訪管中斷。內(nèi)核中系統(tǒng)調(diào)用的過程在Linux系統(tǒng)中,系統(tǒng)調(diào)用是作為一種異常類型實(shí)現(xiàn)的,它將執(zhí)行相應(yīng)的機(jī)器代碼指令來產(chǎn)生異常信號(hào)。產(chǎn)生中斷或異常的重要效果是系統(tǒng)自動(dòng)將用戶態(tài)切換為核心態(tài)來對(duì)它進(jìn)行處理。用戶態(tài)的程序只有通過門(gate)陷入(trap)到系統(tǒng)內(nèi)核中去(執(zhí)行int指令),才能執(zhí)行一些具有特權(quán)的內(nèi)核函數(shù)。系統(tǒng)調(diào)用完成后,系統(tǒng)執(zhí)行另一組特征指令(iret指令)將系統(tǒng)返回到用戶態(tài),控制權(quán)返回給進(jìn)程。Linux用來實(shí)現(xiàn)系統(tǒng)調(diào)用異常的實(shí)際指令是:int$0x80這一指令使用中斷/異常向量號(hào)128(即16進(jìn)制的80)將控制權(quán)轉(zhuǎn)移給內(nèi)核(進(jìn)行模式切換)。為達(dá)到在使用系統(tǒng)調(diào)用時(shí)不必用機(jī)器指令編程,在標(biāo)準(zhǔn)的C語言庫中為每一系統(tǒng)調(diào)用提供了一段短的子程序,完成機(jī)器代碼的編程工作。事實(shí)上,機(jī)器代碼段非常簡(jiǎn)短。它所要做的工作只是將送給系統(tǒng)調(diào)用的參數(shù)加載到cpu寄存器中,接著執(zhí)行int$0x80指令。然后運(yùn)行系統(tǒng)調(diào)用。系統(tǒng)調(diào)用的返回值將送入cpu的一個(gè)寄存器中,標(biāo)準(zhǔn)的庫子程序取得這一返回值,并將它送回用戶程序。下面以getuid()系統(tǒng)調(diào)用為例來看調(diào)用過程:我們可以看到其中有一些宏定義,我們可以看看這些宏的定義(arch/i386/kernel/entry.S).………#defineSAVE_ALLcld;pushl%es;pushl%ds;pushl%eax;pushl%ebp;pushl%edi;pushl%esi;pushl%edx;pushl%ecx;pushl%ebx;movl$(__USER_DS),%edx;movl%edx,%ds;movl%edx,%es;我們可以看到SAVE_ALL主要是保存寄存器信息,即現(xiàn)場(chǎng)保留。其中,movl$(__USER_DS),%edx;從這一句開始是重新填充DS,ES段。?#defineRESTORE_INT_REGSpopl%ebx;popl%ecx;popl%edx;popl%esi;popl%edi;popl%ebp;popl%eax#defineRESTORE_REGSRESTORE_INT_REGS;1:popl%ds;2:popl%es;.section.fixup,"ax";3:movl$0,(%esp);jmp1b;4:movl$0,(%esp);jmp2b;.prevIoUs;.section__ex_table,"a";.align4;.long1b,3b;.long2b,4b;.prevIoUs?ENTRY(ret_from_fork)pushl%eaxcallschedule_tailGET_THREAD_INFO(%ebp)popl%eaxjmpsyscall_exit這里主要完成現(xiàn)場(chǎng)恢復(fù)并返回。ENTRY(system_call)pushl%eax#saveorig_eaxSAVE_ALLGET_THREAD_INFO(%ebp)#systemcalltracinginoperation/*Note,_TIF_SECCOMPisbitnumber8,andsoitneedstestwandnottestb*/testw$(_TIF_SYSCALL_TRACE|_TIF_SYSCALL_AUDIT|_TIF_SECCOMP),TI_flags(%ebp)jnzsyscall_trace_entrycmpl$(nr_syscalls),%eaxjaesyscall_badsyssyscall_call:call*sys_call_table(,%eax,4)movl%eax,EAX(%esp)#storethereturnvaluesyscall_exit:cli#makesurewedon'tmissaninterrupt#settingneed_reschedorsigpending#betweensamplingandtheiretmovlTI_flags(%ebp),%ecxtestw$_TIF_ALLWORK_MASK,%cx#current->workjnesyscall_exit_workrestore_all:movlEFLAGS(%esp),%eax#mixEFLAGS,SSandCS#Warning:OLDSS(%esp)containsthewrong/randomvaluesifwe#arereturningtothekernel.#Seecommentsinprocess.c:copy_thread()fordetails.movbOLDSS(%esp),%ahmovbCS(%esp),%alandl$(VM_MASK|(4<<8)|3),%eaxcmpl$((4<<8)|3),%eaxjeldt_ss#returningtouser-spacewithLDTSSrestore_nocheck:RESTORE_REGSaddl$4,%esp1:iret這一段中,主要是完成調(diào)用。eax放置的是系統(tǒng)調(diào)用號(hào),因?yàn)閑ax有可能被使用,所以先保存其值。call*sys_call_table(,%eax,4)這一句是計(jì)算調(diào)用的入口。其中,sys_call_table是LINUX的系統(tǒng)調(diào)用表,它存在目錄arch/i386/kernel/sys_call_table.S下。.dataENTRY(sys_call_table).longsys_restart_syscall/*0-old"setup()"systemcall,usedforrestarting*/.longsys_exit.longsys_fork.longsys_read.longsys_write.longsys_open/*5*/………….longsys_mq_timedreceive/*280*/.longsys_mq_notify.longsys_mq_getsetattr.longsys_ni_syscall/*reservedforkexec*/.longsys_waitid.longsys_ni_syscall/*285*//*available*/???以上就是系統(tǒng)大全給大家介紹的如何使的方法都有一定的了解了吧,好了,如果大家還想了解更多的資訊,那就趕緊點(diǎn)擊系統(tǒng)大全官網(wǎng)吧。??本文來自系統(tǒng)大全http:///如需轉(zhuǎn)載請(qǐng)注明!推薦:win7純凈版