Linux系統(tǒng)調(diào)用-詳細(xì)全過(guò)程.ppt_第1頁(yè)
Linux系統(tǒng)調(diào)用-詳細(xì)全過(guò)程.ppt_第2頁(yè)
Linux系統(tǒng)調(diào)用-詳細(xì)全過(guò)程.ppt_第3頁(yè)
Linux系統(tǒng)調(diào)用-詳細(xì)全過(guò)程.ppt_第4頁(yè)
Linux系統(tǒng)調(diào)用-詳細(xì)全過(guò)程.ppt_第5頁(yè)
已閱讀5頁(yè),還剩37頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、Linux系統(tǒng)調(diào)用_詳細(xì)全過(guò)程,系統(tǒng)調(diào)用功能概述系統(tǒng)調(diào)用的處理過(guò)程系統(tǒng)調(diào)用的實(shí)例分析如何添加系統(tǒng)調(diào)用,Linux系統(tǒng)調(diào)用_詳細(xì)全過(guò)程,系統(tǒng)調(diào)用(system call )操作系統(tǒng)內(nèi)核可以實(shí)現(xiàn)系統(tǒng)功能程序員利用系統(tǒng)調(diào)用向OS提出服務(wù)請(qǐng)求,由OS代理完成。 一般來(lái)說(shuō),進(jìn)程無(wú)法訪問(wèn)系統(tǒng)內(nèi)核。 不能訪問(wèn)內(nèi)核使用的內(nèi)存段,也不能調(diào)用內(nèi)核函數(shù)。 CPU的硬件配置可以保證這一點(diǎn)。 只有系統(tǒng)調(diào)用是例外。 Linux系統(tǒng)調(diào)用-功能,系統(tǒng)調(diào)用是用戶狀態(tài)進(jìn)入內(nèi)核狀態(tài)的唯一入口。 一夫斷,萬(wàn)夫不開(kāi)。 一般系統(tǒng)調(diào)用:控制write/read調(diào)用等硬件: 設(shè)置系統(tǒng)狀態(tài)或讀取內(nèi)核數(shù)據(jù)getpid ()、getpriorit

2、y ()、setpriority ()、sethostname ()進(jìn)程管理:(fork ()、clone ()等)的請(qǐng)求的準(zhǔn)確性,5.1 Linux系統(tǒng)調(diào)用了int $0 x80程序集命令。 該匯編指令由向量128發(fā)生編程異常,所述CPU切換到內(nèi)核狀態(tài)執(zhí)行內(nèi)核函數(shù),并且移動(dòng)到系統(tǒng)調(diào)用處理程序條目system_call ()。 int $0 x80命令將用戶狀態(tài)的運(yùn)行模式轉(zhuǎn)換為內(nèi)核狀態(tài),并將控制權(quán)傳遞給系統(tǒng)調(diào)用過(guò)程的啟動(dòng)system_call ()處理程序。 system_call ()函數(shù)和system_cal ()檢查指向內(nèi)核進(jìn)程所請(qǐng)求的服務(wù)的系統(tǒng)調(diào)用編號(hào)。 內(nèi)核進(jìn)程參照系統(tǒng)調(diào)用表(sys

3、_call_table )來(lái)找到調(diào)用的內(nèi)核函數(shù)的條目地址。 然后,調(diào)用相應(yīng)的函數(shù),在返回后進(jìn)行一些系統(tǒng)檢查,最后返回進(jìn)程。系統(tǒng)調(diào)用和常規(guī)函數(shù)調(diào)用。 API是用于特定目的的函數(shù),用于調(diào)用應(yīng)用程序,系統(tǒng)調(diào)用用于使應(yīng)用程序直接進(jìn)入系統(tǒng)內(nèi)核。 Linux內(nèi)核提供了用于包裝和擴(kuò)展系統(tǒng)調(diào)用的c語(yǔ)言函數(shù)庫(kù)。 這些函數(shù)也稱為系統(tǒng)調(diào)用,因?yàn)檫@些庫(kù)函數(shù)與系統(tǒng)調(diào)用關(guān)系非常密切。 有些API函數(shù)不需要使用系統(tǒng)調(diào)用,因?yàn)樗鼈兛梢栽谟脩艨臻g中完成任務(wù),如用于數(shù)學(xué)校正運(yùn)算的函數(shù)。 根據(jù)API函數(shù)的不同,可能會(huì)發(fā)生多次系統(tǒng)調(diào)用。 不同的API函數(shù)也可能有相同的系統(tǒng)調(diào)用。 malloc ()、calloc ()、free ()

4、等函數(shù)以相同的方式分配和釋放內(nèi)存。 系統(tǒng)命令、內(nèi)核函數(shù)和系統(tǒng)調(diào)用的API位于系統(tǒng)命令系統(tǒng)命令的上位。 各系統(tǒng)指令是ls指令等執(zhí)行程序。 這些指令的實(shí)現(xiàn)調(diào)用了系統(tǒng)調(diào)用。 系統(tǒng)調(diào)用和內(nèi)核函數(shù)系統(tǒng)調(diào)用是用戶訪問(wèn)內(nèi)核的接口層,它本身不是內(nèi)核函數(shù),而是由內(nèi)核函數(shù)實(shí)現(xiàn)。 進(jìn)入內(nèi)核后,不同的系統(tǒng)調(diào)用分別找到對(duì)應(yīng)的內(nèi)核函數(shù)。 這些內(nèi)核函數(shù)被稱為系統(tǒng)調(diào)用的服務(wù)實(shí)例。 系統(tǒng)調(diào)用getpid實(shí)際調(diào)用的服務(wù)例程是sys_getpid (),或者系統(tǒng)調(diào)用getpid ()是服務(wù)例程sys_getpid ()的封裝例程。 在i386架構(gòu)中,該指令是int $0 x80 (包裝指令),因?yàn)榘b例程和平臺(tái)取決于操作系統(tǒng)實(shí)現(xiàn)的

5、平臺(tái),所以在用戶進(jìn)行編程時(shí)這是因?yàn)橛脩舫绦虻囊浦沧兊美щy。 在標(biāo)準(zhǔn)c庫(kù)函數(shù)中,每個(gè)系統(tǒng)調(diào)用都有一個(gè)封裝例程,當(dāng)用戶程序執(zhí)行系統(tǒng)調(diào)用時(shí),將調(diào)用c庫(kù)中的相應(yīng)封裝例程。系統(tǒng)調(diào)用過(guò)程、系統(tǒng)調(diào)用過(guò)程、system_call ()片段、pushl /*系統(tǒng)調(diào)用號(hào)碼壓縮棧*/save _ all.cmpl $ (NR _ syscalls ) 24 (% esp )/*棧中的EAP 作為門值Jmp ret_from_sys_call、system_call片段(續(xù))、nobadds使用。 4)#系統(tǒng)調(diào)用表內(nèi)的調(diào)用編號(hào)eax的系統(tǒng)調(diào)用例程movl EAX(%esp) #堆棧內(nèi)的Jmp ret_from_sys

6、_call, 檢查從用戶狀態(tài)過(guò)程傳遞來(lái)的系統(tǒng)調(diào)用號(hào)的有效性(如果eax是系統(tǒng)調(diào)用號(hào),且必須小于NR_syscalls ),則將門值存儲(chǔ)在system_call ()函數(shù)中(參見(jiàn)),以便進(jìn)一步檢查系統(tǒng)調(diào)用號(hào)的有效性根據(jù)eax的系統(tǒng)調(diào)用號(hào)調(diào)用相應(yīng)的服務(wù)實(shí)例。 服務(wù)例程結(jié)束后,從eax寄存器取得該門限值,將該門限值保存到堆棧,使其成為用戶狀態(tài)eax寄存器保存的位置。 然后,跳至ret_from_sys_call (),結(jié)束系統(tǒng)調(diào)用程序的執(zhí)行。 保存所有宏定義,#定義保存所有CLD; 推銷% es; 推銷% ds; pushlpushlpushl % ESI; pushlpushlpushlmovl

7、$ (_ _ kernel _ ds )、 movl %ds。 動(dòng)態(tài)% es; 然后將發(fā)射器的殘奧儀表壓入核心堆棧(這樣內(nèi)核就可以使用用戶傳遞的殘奧儀表)。 如果控制不同權(quán)限級(jí)別之間的轉(zhuǎn)換,則外部堆棧的殘奧儀表不會(huì)自動(dòng)復(fù)制到內(nèi)部堆棧,因?yàn)镮NT命令與CALL命令不同。 因此,調(diào)用系統(tǒng)調(diào)用時(shí),必須在各寄存器中指定殘奧儀表。 圖10.2執(zhí)行流程圖、系統(tǒng)調(diào)用顯示、以及系統(tǒng)調(diào)用處理程序,其中,圖10.2調(diào)用總控制程序(system_call )在執(zhí)行一旦系統(tǒng)調(diào)用處理程序時(shí),從eax中得到系統(tǒng)調(diào)用號(hào)由于該寄存器的設(shè)置是通過(guò)libc庫(kù)中的封裝例程來(lái)進(jìn)行的,因此,用戶一般不在意系統(tǒng)調(diào)用編號(hào)、系統(tǒng)調(diào)用表和調(diào)用

8、編號(hào),而是在核心中為每個(gè)系統(tǒng)調(diào)用定義了唯一的編號(hào),該編號(hào)的定義是Linux/include /。 第n個(gè)表?xiàng)l目unistd.h (最大nr_std.h )包含系統(tǒng)調(diào)用號(hào)為n的服務(wù)實(shí)例的地址。 在系統(tǒng)調(diào)用掉進(jìn)內(nèi)核之前,必須將系統(tǒng)調(diào)用編號(hào)傳遞給內(nèi)核。 該標(biāo)號(hào)實(shí)際上標(biāo)有系統(tǒng)調(diào)用表(sys_call_table )的后綴i386,這種傳送動(dòng)作是通過(guò)在執(zhí)行int $0 x80之前將調(diào)用號(hào)碼加載到eax寄存器中來(lái)實(shí)現(xiàn)的。 這樣,在執(zhí)行系統(tǒng)調(diào)用處理程序時(shí),就可以從eax中獲取系統(tǒng)調(diào)用號(hào)碼,并在系統(tǒng)調(diào)用表中找到相應(yīng)的服務(wù)實(shí)例。 系統(tǒng)呼叫編號(hào)define _ _ NR _ exit1#定義_ _ NR _ fo

9、r k2#定義_ _ NR _讀取3 #定義_ _ NR。 定義8號(hào)定義9號(hào)定義10號(hào)定義10號(hào)定義10號(hào)定義10號(hào)定義10號(hào)定義10號(hào)定義10號(hào)定義10號(hào)定義10號(hào)定義10號(hào)定義10號(hào)定義10號(hào)定義10號(hào)定義10號(hào)定義。 系統(tǒng)調(diào)用表(arch/i386/kernel/entry.s )、數(shù)據(jù)條目(sys _ call _ table ) .長(zhǎng)系統(tǒng)名稱(sys _ ni _ syscall ) .長(zhǎng)系統(tǒng)名稱() 如果將. long symbol _ name (sys _ link ).long symbol _ name (sys _ unlink ).long symbol _ name

10、(sys )系統(tǒng)調(diào)用號(hào)碼設(shè)為偏移量,則看與該表對(duì)應(yīng)的處理函數(shù)地址在linux/include/linux/sys.h中定義的NR_syscalls表示可以存儲(chǔ)在此表中的系統(tǒng)調(diào)用的最大數(shù)量,例如NR_syscalls=256。在例程終止、系統(tǒng)調(diào)用表(sys_call_table )、系統(tǒng)調(diào)用的應(yīng)答、服務(wù)例程后,system_call ()從eax取得系統(tǒng)調(diào)用的應(yīng)答值,將該應(yīng)答值保存在用戶狀態(tài)eax寄存器堆棧單元恢復(fù)在進(jìn)程執(zhí)行用戶狀態(tài)之前在用戶進(jìn)入內(nèi)核之前保留在堆棧中的寄存器值。 其中eax是系統(tǒng)調(diào)用的返回代碼(負(fù)數(shù)表示調(diào)用錯(cuò)誤,0或正數(shù)表示成功完成),ret_from_sys_call,cli

11、#是cmpl $0,need_resched(jeed_resched 如果有中斷的sigpending( jne signal_return #未處理的信號(hào),則處理restore_all: RESTORE_ALL #堆棧,返回用戶狀態(tài)、系統(tǒng)調(diào)用的上限值、所有系統(tǒng)調(diào)用系統(tǒng)調(diào)用成功結(jié)束的負(fù)數(shù)表示錯(cuò)誤條件將源文件名設(shè)置為geg,表示此處的門限值與封裝例程中的門限值不同,或者系統(tǒng)調(diào)用在使用errno變量封裝例程獲取門限值之后進(jìn)行了設(shè)置ID=getpid (); 打印(getpid ()=% ldn,id ); 返回(0);調(diào)用系統(tǒng)調(diào)用-封裝例程getpid ()的實(shí)例分析。 該封裝例程將系統(tǒng)調(diào)用號(hào)_

12、 NR _ getpid (第20個(gè))推入EAX寄存器CPU,在int $0 x80處進(jìn)入內(nèi)核,找到system_call ()并對(duì)其進(jìn)行調(diào)用(以下稱為進(jìn)入內(nèi)核狀態(tài))3.卡5執(zhí)行完成后,轉(zhuǎn)移到ret_from_sys_call ()例程,系統(tǒng)調(diào)用返回用戶狀態(tài)。5.4系統(tǒng)調(diào)用的殘奧儀表傳遞、很多系統(tǒng)調(diào)用需要多個(gè)殘奧儀表的普通c函數(shù)的殘奧儀表傳遞是通過(guò)將殘奧儀表值寫入堆棧(用戶狀態(tài)堆?;騼?nèi)核狀態(tài)堆棧)來(lái)實(shí)現(xiàn)的。 但是,由于系統(tǒng)調(diào)用是從用戶狀態(tài)進(jìn)入內(nèi)核狀態(tài)的特殊函數(shù),所以不能使用用戶狀態(tài)的棧和直接內(nèi)核狀態(tài)的棧,也不能使用用戶狀態(tài)的棧和用戶狀態(tài)的c函數(shù)、內(nèi)核狀態(tài)的c函數(shù),以及內(nèi)核狀態(tài)調(diào)用系統(tǒng)畢竟,由于

13、服務(wù)例程是c函數(shù),因此也將在堆棧中查找殘奧儀表,用戶狀態(tài)堆棧、用戶狀態(tài)c函數(shù)、內(nèi)核狀態(tài)堆棧、內(nèi)核狀態(tài)c函數(shù)、寄存器、系統(tǒng)調(diào)用的殘奧儀表傳遞,系統(tǒng)調(diào)用使用寄存器傳遞系統(tǒng)調(diào)用編號(hào)用于傳遞系統(tǒng)調(diào)用所需的殘奧儀表殘奧儀表的寄存器如下: eax :在用于存儲(chǔ)系統(tǒng)調(diào)用編號(hào)和系統(tǒng)調(diào)用門限值的系統(tǒng)調(diào)用殘奧儀表處于ebx、ecx、edx、esi和edi內(nèi)核狀態(tài)后,進(jìn)行system使用寄存器傳遞殘奧儀表,必須滿足兩個(gè)條件。 每個(gè)殘奧儀表的長(zhǎng)度不能超過(guò)寄存器的長(zhǎng)度殘奧儀表的數(shù)目(包括通過(guò)eax傳遞的系統(tǒng)調(diào)用編號(hào))。 否則,進(jìn)程地址空間中這些殘奧元值所在的內(nèi)存區(qū)域必須指向不同的寄存器。 門值必須寫入eax寄存器。 傳遞系統(tǒng)調(diào)用的殘奧儀表、傳遞殘奧儀表的示例。 處理write系統(tǒng)調(diào)用的sys_write服務(wù)例程聲明如下,這些關(guān)殘奧元的值分別填充到ebx、ecx和edx寄存器中,如果填充到system_call中,則SAVE_A

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論