進(jìn)程(Process)是具有一定獨(dú)立功能的程序關(guān)于某個(gè)數(shù)據(jù)集合上的一次運(yùn)行活動(dòng),是系統(tǒng)進(jìn)行資源分配和調(diào)度的一個(gè)獨(dú)立單位。程序只是一組指令的有序集合,它本身沒(méi)有任何運(yùn)行的含義,只是一個(gè)靜態(tài)實(shí)體。而進(jìn)程則不同,它是程序在某個(gè)數(shù)據(jù)集上的執(zhí)行,是一個(gè)動(dòng)態(tài)實(shí)體。它因創(chuàng)建而產(chǎn)生,因調(diào)度而運(yùn)行,因等待資源或事件而被處于等待狀態(tài),因完成任務(wù)而被撤消,反映了一個(gè)程序在一定的數(shù)據(jù)集上運(yùn)行的全部動(dòng)態(tài)過(guò)程。線程(Thread)是進(jìn)程的一個(gè)實(shí)體,是CPU調(diào)度和分派的基本單位。線程不能夠獨(dú)立執(zhí)行,必須依存在進(jìn)程中,由進(jìn)程提供多個(gè)線程執(zhí)行控制。從內(nèi)核角度講線程是活動(dòng)體對(duì)象,而進(jìn)程只是一組靜態(tài)的對(duì)象集,進(jìn)程必須至少擁有一個(gè)活動(dòng)線程才能維持運(yùn)轉(zhuǎn)。當(dāng)某個(gè)應(yīng)用程序調(diào)用一個(gè)創(chuàng)建進(jìn)程的函數(shù)比如CreateProcess或者用戶執(zhí)行某一個(gè)程序(其實(shí)windows下用戶執(zhí)行一般普通程序是由explorer.exe調(diào)用CreateProcess來(lái)完成),操作系統(tǒng)把這個(gè)過(guò)程分成以下步驟來(lái)完成:1.打開(kāi)將要在該進(jìn)程中執(zhí)行的映像文件。2.創(chuàng)建Windows執(zhí)行體進(jìn)程對(duì)象。3.創(chuàng)建初始線程(棧、堆執(zhí)行環(huán)境初始化及執(zhí)行線程體對(duì)象)。4.通知Windows子系統(tǒng)新進(jìn)程創(chuàng)建了(子系統(tǒng)是操作系統(tǒng)的一部分它是一個(gè)協(xié)助操作系統(tǒng)內(nèi)核管理用戶態(tài)/客戶方的一個(gè)子系統(tǒng)具體的進(jìn)程為Csrss.exe)。5.開(kāi)始執(zhí)行初始線程(如果創(chuàng)建時(shí)候指定了線程的CREATE_SUSPENDED狀態(tài)則線程暫時(shí)掛起不執(zhí)行)。6.在新進(jìn)程和線程環(huán)境中完成地址空間的初始化(比如加載必須的DLL和庫(kù)),然后開(kāi)始到進(jìn)程入口執(zhí)行。到這里操作系統(tǒng)完成一個(gè)新進(jìn)程的創(chuàng)建過(guò)程。下面來(lái)看下具體每一步操作系統(tǒng)所做的工作:1.打開(kāi)將要在該進(jìn)程中執(zhí)行的映像文件。首先操作系統(tǒng)找到執(zhí)行的Windows映像然后創(chuàng)建一個(gè)內(nèi)存區(qū)對(duì)象,以便后面將它映射到新的進(jìn)程地址空間中。2.創(chuàng)建Windows執(zhí)行體進(jìn)程對(duì)象。接下來(lái)操作系統(tǒng)調(diào)用內(nèi)部的系統(tǒng)函數(shù)NtCreateProcess來(lái)創(chuàng)建一個(gè)Windwos執(zhí)行體進(jìn)程對(duì)象。具體步驟是:(1)建立EPROCESS*分配并初始化EPROCESS結(jié)構(gòu)塊*從父進(jìn)程處繼承得到進(jìn)程的親和性掩碼*分配進(jìn)程的最大最小工作集尺(由兩個(gè)參數(shù)決定PsMinimumWorkingSet PsMaximumWorkingSet)*降新進(jìn)程的配額塊設(shè)置為父進(jìn)程配額塊地址,并遞增父進(jìn)程配額塊的引用計(jì)數(shù)*繼承Windows的設(shè)備名字空間*將父進(jìn)程進(jìn)程ID保存在新進(jìn)程對(duì)象的InheritedFormUniqueProcessId中*創(chuàng)建該進(jìn)程的主訪問(wèn)令牌*初始化進(jìn)程句柄表*將新進(jìn)程的退出狀態(tài)設(shè)置為STATUS_PENDING(2)創(chuàng)建初始的進(jìn)程地址空間*在適當(dāng)?shù)捻?yè)表中創(chuàng)建頁(yè)表項(xiàng),以映射初始頁(yè)面*從MmresidentAvailablePage算出進(jìn)程工作集大小*系統(tǒng)空間的非換頁(yè)部分和系統(tǒng)緩存的頁(yè)表被映射到進(jìn)程(3)初始化內(nèi)核進(jìn)程塊KPROCESS(4)結(jié)束進(jìn)程地址空間的創(chuàng)建過(guò)程(5)建立PEB(6)完成執(zhí)行體進(jìn)程對(duì)象的創(chuàng)建過(guò)程3.創(chuàng)建初始線程(棧、堆執(zhí)行環(huán)境初始化及執(zhí)行線程體對(duì)象)。這時(shí)候Windows執(zhí)行體進(jìn)程對(duì)象已經(jīng)完全建立完成,但它還沒(méi)有線程所以無(wú)法執(zhí)行,接下來(lái)系統(tǒng)調(diào)用NtCreateThread來(lái)創(chuàng)建一個(gè)掛起的新線程它就是進(jìn)程的主線程體。4.通知Windows子系統(tǒng)新進(jìn)程創(chuàng)建了(子系統(tǒng)是操作系統(tǒng)的一部分它是一個(gè)協(xié)助操作系統(tǒng)內(nèi)核管理用戶態(tài)/客戶方的一個(gè)子系統(tǒng)具體的進(jìn)程為Csrss.exe)。接下來(lái)操作系統(tǒng)通過(guò)客戶態(tài)(Kernel32.dll)給Windows子系統(tǒng)(Csrss)發(fā)送一個(gè)新進(jìn)程線程創(chuàng)建的數(shù)據(jù)消息,讓子系統(tǒng)建立自己的進(jìn)程線程管理塊。當(dāng)Csrss接收到該消息時(shí)候執(zhí)行下面的處理:*復(fù)制一份該進(jìn)程和線程句柄*設(shè)置進(jìn)程優(yōu)先級(jí)*分配Csrss進(jìn)程塊*把新進(jìn)程的異常處理端口綁定到Csrss中,這樣當(dāng)該進(jìn)程發(fā)生異常時(shí),Csrss將會(huì)接收到異常消息*分配和初始化Csrss線程塊*把線程插入到進(jìn)程的線程列表中*把進(jìn)程插入到Csrss的線程列表中*顯示進(jìn)程啟動(dòng)光標(biāo)5.開(kāi)始執(zhí)行初始線程(如果創(chuàng)建時(shí)候指定了線程的CREATE_SUSPENDED狀態(tài)則線程暫時(shí)掛起不執(zhí)行)。到這里進(jìn)程環(huán)境已經(jīng)建立完畢進(jìn)程中開(kāi)始創(chuàng)建的主線程到這里獲得執(zhí)行權(quán)開(kāi)始執(zhí)行線程。6.在新進(jìn)程和線程環(huán)境中完成地址空間的初始化(比如加載必須的DLL和庫(kù)),然后開(kāi)始到進(jìn)程入口執(zhí)行。到這步實(shí)質(zhì)是調(diào)用ldrInitializeThunk來(lái)初始化加載器,堆管理器NLS表TLS數(shù)組以及臨界區(qū)結(jié)構(gòu),并且加載任何必須要的DLL并且用DLL_PROCESS_ATTACH功能代碼來(lái)調(diào)用各DLL入口點(diǎn),最后當(dāng)加載器初始化例程返回到用戶模式APC分發(fā)器時(shí)進(jìn)程映像開(kāi)始在用戶模式下執(zhí)行,然后它調(diào)用線程啟動(dòng)函數(shù)開(kāi)始執(zhí)行。到這里操作系統(tǒng)完成了所有的創(chuàng)建工作,我們寫的程序就這樣被操作系統(tǒng)調(diào)用運(yùn)行起來(lái)了。
成都創(chuàng)新互聯(lián)公司自2013年創(chuàng)立以來(lái),先為博白等服務(wù)建站,博白等地企業(yè),進(jìn)行企業(yè)商務(wù)咨詢服務(wù)。為博白企業(yè)網(wǎng)站制作PC+手機(jī)+微官網(wǎng)三網(wǎng)同步一站式服務(wù)解決您的所有建站問(wèn)題。
所謂系統(tǒng)調(diào)用,就是內(nèi)核提供的、功能十分強(qiáng)大的一系列的函數(shù)。這些系統(tǒng)調(diào)用是在內(nèi)核中實(shí)現(xiàn)的,再通過(guò)一定的方式把系統(tǒng)調(diào)用給用戶,一般都通過(guò)門(gate)陷入(trap)實(shí)現(xiàn)。系統(tǒng)調(diào)用是用戶程序和內(nèi)核交互的接口。
整個(gè)系統(tǒng)調(diào)用的過(guò)程可以總結(jié)如下:
1. 執(zhí)行用戶程序(如:fork)
2. 根據(jù)glibc中的函數(shù)實(shí)現(xiàn),取得系統(tǒng)調(diào)用號(hào)并執(zhí)行int $0x80產(chǎn)生中斷。
3. 進(jìn)行地址空間的轉(zhuǎn)換和堆棧的切換,執(zhí)行SAVE_ALL。(進(jìn)行內(nèi)核模式)
4. 進(jìn)行中斷處理,根據(jù)系統(tǒng)調(diào)用表調(diào)用內(nèi)核函數(shù)。
5. 執(zhí)行內(nèi)核函數(shù)。
6. 執(zhí)行RESTORE_ALL并返回用戶模式
下庫(kù)函數(shù)和系統(tǒng)調(diào)用的區(qū)別:
人們?cè)陂L(zhǎng)期編程中發(fā)現(xiàn)使用系統(tǒng)調(diào)用有個(gè)重大的缺點(diǎn),那就程序的移植性,比如說(shuō):linux系統(tǒng)提供的系統(tǒng)調(diào)用的函數(shù)和windows就不一樣,2者不單單是實(shí)現(xiàn)的方式不同,提供給用戶的函數(shù)名,參數(shù)都不同,這個(gè)可以理解。因此一個(gè)實(shí)現(xiàn)好的程序,利用了linux的系統(tǒng)調(diào)用譬如說(shuō)wait4函數(shù),那么他在windows上編譯是通不過(guò)的。于是人們想了個(gè)辦法,就是封裝了windows和linux系統(tǒng)調(diào)用,給大家一個(gè)統(tǒng)一的函數(shù)(我習(xí)慣叫它接口),那么這樣程序的移植性問(wèn)題就解決了。
所以可以這么認(rèn)為庫(kù)函數(shù)是對(duì)系統(tǒng)調(diào)用的封裝(不是所有的庫(kù)函數(shù)都是),為的是解決一些公共的問(wèn)題和提供統(tǒng)一的系統(tǒng)調(diào)用的接口,他和系統(tǒng)調(diào)用的優(yōu)缺點(diǎn)就是:系統(tǒng)調(diào)用速度是明顯要快于庫(kù)函數(shù)(并不一定全部是,但絕大部分是),但系統(tǒng)調(diào)用缺乏移植性。庫(kù)函數(shù)速度要慢,但解決了移植問(wèn)題。這些在開(kāi)發(fā)過(guò)程中要根據(jù)自己的實(shí)際情況來(lái)決定使用那一個(gè)
兼容內(nèi)核
有兩套
系統(tǒng)調(diào)用
(syscalls)及其相應(yīng)的系統(tǒng)調(diào)用表(syscall
table):一套為Windows系統(tǒng)調(diào)用,另一套為L(zhǎng)inux系統(tǒng)調(diào)用。Windows應(yīng)用程序通過(guò)軟中斷“int
0x2e”訪問(wèn)系統(tǒng)調(diào)用表進(jìn)行Windows系統(tǒng)調(diào)用。
新聞名稱:windows系統(tǒng)調(diào)用表的簡(jiǎn)單介紹
網(wǎng)站URL:http://www.rwnh.cn/article36/dsighpg.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供建站公司、網(wǎng)站設(shè)計(jì)、品牌網(wǎng)站設(shè)計(jì)、企業(yè)網(wǎng)站制作、靜態(tài)網(wǎng)站、響應(yīng)式網(wǎng)站
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)