Linux系統(tǒng)調(diào)用-詳細全過程.ppt_第1頁
Linux系統(tǒng)調(diào)用-詳細全過程.ppt_第2頁
Linux系統(tǒng)調(diào)用-詳細全過程.ppt_第3頁
Linux系統(tǒng)調(diào)用-詳細全過程.ppt_第4頁
Linux系統(tǒng)調(diào)用-詳細全過程.ppt_第5頁
免費預覽已結(jié)束,剩余37頁可下載查看

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領

文檔簡介

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

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

3、_call_table )來找到調(diào)用的內(nèi)核函數(shù)的條目地址。 然后,調(diào)用相應的函數(shù),在返回后進行一些系統(tǒng)檢查,最后返回進程。系統(tǒng)調(diào)用和常規(guī)函數(shù)調(diào)用。 API是用于特定目的的函數(shù),用于調(diào)用應用程序,系統(tǒng)調(diào)用用于使應用程序直接進入系統(tǒng)內(nèi)核。 Linux內(nèi)核提供了用于包裝和擴展系統(tǒng)調(diào)用的c語言函數(shù)庫。 這些函數(shù)也稱為系統(tǒng)調(diào)用,因為這些庫函數(shù)與系統(tǒng)調(diào)用關系非常密切。 有些API函數(shù)不需要使用系統(tǒng)調(diào)用,因為它們可以在用戶空間中完成任務,如用于數(shù)學校正運算的函數(shù)。 根據(jù)API函數(shù)的不同,可能會發(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í)行程序。 這些指令的實現(xiàn)調(diào)用了系統(tǒng)調(diào)用。 系統(tǒng)調(diào)用和內(nèi)核函數(shù)系統(tǒng)調(diào)用是用戶訪問內(nèi)核的接口層,它本身不是內(nèi)核函數(shù),而是由內(nèi)核函數(shù)實現(xiàn)。 進入內(nèi)核后,不同的系統(tǒng)調(diào)用分別找到對應的內(nèi)核函數(shù)。 這些內(nèi)核函數(shù)被稱為系統(tǒng)調(diào)用的服務實例。 系統(tǒng)調(diào)用getpid實際調(diào)用的服務例程是sys_getpid (),或者系統(tǒng)調(diào)用getpid ()是服務例程sys_getpid ()的封裝例程。 在i386架構(gòu)中,該指令是int $0 x80 (包裝指令),因為包裝例程和平臺取決于操作系統(tǒng)實現(xiàn)的

5、平臺,所以在用戶進行編程時這是因為用戶程序的移植變得困難。 在標準c庫函數(shù)中,每個系統(tǒng)調(diào)用都有一個封裝例程,當用戶程序執(zhí)行系統(tǒng)調(diào)用時,將調(diào)用c庫中的相應封裝例程。系統(tǒng)調(diào)用過程、系統(tǒng)調(diào)用過程、system_call ()片段、pushl /*系統(tǒng)調(dià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)用編號eax的系統(tǒng)調(diào)用例程movl EAX(%esp) #堆棧內(nèi)的Jmp ret_from_sys

6、_call, 檢查從用戶狀態(tài)過程傳遞來的系統(tǒng)調(diào)用號的有效性(如果eax是系統(tǒng)調(diào)用號,且必須小于NR_syscalls ),則將門值存儲在system_call ()函數(shù)中(參見),以便進一步檢查系統(tǒng)調(diào)用號的有效性根據(jù)eax的系統(tǒng)調(diào)用號調(diào)用相應的服務實例。 服務例程結(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。 動態(tài)% es; 然后將發(fā)射器的殘奧儀表壓入核心堆棧(這樣內(nèi)核就可以使用用戶傳遞的殘奧儀表)。 如果控制不同權(quán)限級別之間的轉(zhuǎn)換,則外部堆棧的殘奧儀表不會自動復制到內(nèi)部堆棧,因為INT命令與CALL命令不同。 因此,調(diào)用系統(tǒng)調(diào)用時,必須在各寄存器中指定殘奧儀表。 圖10.2執(zhí)行流程圖、系統(tǒng)調(diào)用顯示、以及系統(tǒng)調(diào)用處理程序,其中,圖10.2調(diào)用總控制程序(system_call )在執(zhí)行一旦系統(tǒng)調(diào)用處理程序時,從eax中得到系統(tǒng)調(diào)用號由于該寄存器的設置是通過libc庫中的封裝例程來進行的,因此,用戶一般不在意系統(tǒng)調(diào)用編號、系統(tǒng)調(diào)用表和調(diào)用

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

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

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

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

12、 NR _ getpid (第20個)推入EAX寄存器CPU,在int $0 x80處進入內(nèi)核,找到system_call ()并對其進行調(diào)用(以下稱為進入內(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)用需要多個殘奧儀表的普通c函數(shù)的殘奧儀表傳遞是通過將殘奧儀表值寫入堆棧(用戶狀態(tài)堆棧或內(nèi)核狀態(tài)堆棧)來實現(xiàn)的。 但是,由于系統(tǒng)調(diào)用是從用戶狀態(tài)進入內(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、服務例程是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)用編號用于傳遞系統(tǒng)調(diào)用所需的殘奧儀表殘奧儀表的寄存器如下: eax :在用于存儲系統(tǒng)調(diào)用編號和系統(tǒng)調(diào)用門限值的系統(tǒng)調(diào)用殘奧儀表處于ebx、ecx、edx、esi和edi內(nèi)核狀態(tài)后,進行system使用寄存器傳遞殘奧儀表,必須滿足兩個條件。 每個殘奧儀表的長度不能超過寄存器的長度殘奧儀表的數(shù)目(包括通過eax傳遞的系統(tǒng)調(diào)用編號)。 否則,進程地址空間中這些殘奧元值所在的內(nèi)存區(qū)域必須指向不同的寄存器。 門值必須寫入eax寄存器。 傳遞系統(tǒng)調(diào)用的殘奧儀表、傳遞殘奧儀表的示例。 處理write系統(tǒng)調(diào)用的sys_write服務例程聲明如下,這些關殘奧元的值分別填充到ebx、ecx和edx寄存器中,如果填充到system_call中,則SAVE_A

溫馨提示

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

評論

0/150

提交評論