MINIX中的進(jìn)程創(chuàng)建v2.doc_第1頁
MINIX中的進(jìn)程創(chuàng)建v2.doc_第2頁
MINIX中的進(jìn)程創(chuàng)建v2.doc_第3頁
MINIX中的進(jìn)程創(chuàng)建v2.doc_第4頁
MINIX中的進(jìn)程創(chuàng)建v2.doc_第5頁
已閱讀5頁,還剩2頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

965MINIX中的進(jìn)程創(chuàng)建MINIX的系統(tǒng)中是由PM管理進(jìn)程創(chuàng)建,但是具體創(chuàng)建操作由PM、內(nèi)核、FS三部分完成。創(chuàng)建首先是用戶調(diào)用 lib/posix/_fork.c中的fork()要求創(chuàng)建進(jìn)程,這條調(diào)用最終轉(zhuǎn)化成調(diào)用src/kernel/proc.c中的sys_call(),并構(gòu)建一條消息message,其中寫明m-m_source為當(dāng)前調(diào)用者進(jìn)程號(hào),消息類型m-m_type為FORK。消息(即圖中的m)的地址這時(shí)已經(jīng)作為參數(shù)被傳遞進(jìn)來,sys_call()可以據(jù)此得知m的內(nèi)容,并在適當(dāng)?shù)臅r(shí)候?qū)?nèi)容傳遞給PM(即圖中MM)。PM的工作就是不斷地獲取并處理消息,所以它能夠得到用戶進(jìn)程發(fā)送的m,并將其存放在m_in中。當(dāng)PM分析m_in-m_type為FORK,得知了消息的內(nèi)容是要進(jìn)行fork操作,它就進(jìn)一步調(diào)用其do_fork()完成整個(gè)過程。PM進(jìn)行FORK操作后,以發(fā)消息的形式通知內(nèi)核中的系統(tǒng)任務(wù)SYSTEM和文件系統(tǒng)FS進(jìn)行各自的Fork操作,最后由PM設(shè)置消息m_out向調(diào)用者進(jìn)程進(jìn)行回復(fù)和提供返回值。下圖1說明了用戶要求進(jìn)程創(chuàng)建時(shí),消息的傳遞過程。圖中使用了三種箭頭,實(shí)線表示消息的發(fā)送過程,點(diǎn)線表示消息的獲取過程,虛線表示發(fā)送和接收消息都會(huì)經(jīng)歷的過程。圖1 Minix的fork調(diào)用消息傳遞過程1 FORK所操作的數(shù)據(jù)對(duì)象1.1 PM對(duì)數(shù)據(jù)對(duì)象的操作1.1.1 PM為子進(jìn)程分配內(nèi)存空間在執(zhí)行fork調(diào)用時(shí),如果中途停止,是很困難的事情。所以PM擔(dān)心兩件事情會(huì)導(dǎo)致進(jìn)程創(chuàng)建失敗,一是沒有空閑的進(jìn)程表項(xiàng),二是當(dāng)前內(nèi)存不足,不能為子進(jìn)程分配足夠內(nèi)存。為此,首先PM維護(hù)一個(gè)計(jì)數(shù)器procs_in_use,記錄當(dāng)前的進(jìn)程個(gè)數(shù),以方便知道是否有空閑進(jìn)程表項(xiàng)。其次,PM調(diào)用alloc_mem(total_size)嘗試為子進(jìn)程分配內(nèi)存,如果返回值為NO_MEM則直接退出并反饋內(nèi)存不足,如果分配內(nèi)存成功,那么這次fork就一定能成功。PM查看父進(jìn)程的內(nèi)存映射表mp_seg,計(jì)算其數(shù)據(jù)段長(zhǎng)度、棧段長(zhǎng)度和兩段的間隔gap的大小,以確定應(yīng)該為子進(jìn)程申請(qǐng)的內(nèi)存大小,隨后為子進(jìn)程申請(qǐng)內(nèi)存空間。成功申請(qǐng)之后將父進(jìn)程的內(nèi)存數(shù)據(jù)段、棧段和兩段的中間間隔gap(也就是堆)完整的復(fù)制到子進(jìn)程剛申請(qǐng)的內(nèi)存頁面中。PM復(fù)制的內(nèi)存是從數(shù)據(jù)段的開始一直到棧段的棧底部,至于代碼段有兩種情況,一是檢查父進(jìn)程rmp-mp_flags & SEPARATE是否成立(附錄中有所有狀態(tài)定義),成立說明父進(jìn)程是分離的I&D空間,那么父子進(jìn)程可以共享代碼段,代碼段就不用復(fù)制,并且內(nèi)存映射表mp_seg中代碼段映射mp_segT不用修改,二是父進(jìn)程是不分離的I&D空間,就是代碼段和數(shù)據(jù)段是在一起的,即代碼在數(shù)據(jù)段中,那么上述內(nèi)存拷貝從數(shù)據(jù)段的開始一直到棧段的棧底部,代碼段也就一同被拷貝到子進(jìn)程內(nèi)存空間中了。1.1.2 PM創(chuàng)建子進(jìn)程的進(jìn)程控制塊PM根據(jù)procs_in_use確定有空閑表項(xiàng)后。以遍歷的方式檢查每個(gè)表項(xiàng)的mp_flags,直到找到一個(gè)mp_flags的IN_USE位沒被置位的表項(xiàng)。通過復(fù)制的形式,將父進(jìn)程進(jìn)程控制塊復(fù)制到這個(gè)進(jìn)程控制塊表項(xiàng)中,因?yàn)樽舆M(jìn)程內(nèi)存的物理地址改變了,所以要修改子進(jìn)程控制塊中的內(nèi)存映射表mp_seg,將其代碼段、數(shù)據(jù)段和棧段的物理地址mem_phys進(jìn)行更新,其次PM為子進(jìn)程控制塊(記做rmc)做其他修改:1、修改其父進(jìn)程rmc-parent為當(dāng)前執(zhí)行fork調(diào)用的進(jìn)程,2、修改子進(jìn)程的進(jìn)程狀態(tài)mp_flag、退出狀態(tài)mp_exitstatus、信號(hào)狀態(tài)mp_sigstatus和子進(jìn)程運(yùn)行時(shí)間mp_child_utime為默認(rèn),3、分配給子進(jìn)程一個(gè)pid號(hào)。PM進(jìn)程控制塊定義可見附錄中mproc。1.2 內(nèi)核對(duì)數(shù)據(jù)對(duì)象的操作內(nèi)核負(fù)責(zé)在為子進(jìn)程創(chuàng)建內(nèi)核中的進(jìn)程控制塊,在復(fù)制控制塊前,內(nèi)核先保存子進(jìn)程控制塊中的LDT表選擇子p_ldt_sel。在復(fù)制了父進(jìn)程控制塊后將子進(jìn)程的LDT表選擇子重設(shè)為它原來的選擇子,這個(gè)選擇子內(nèi)有LDT表描述符的索引并指示要從GDT表查找這個(gè)描述符,這樣GDT表和每個(gè)進(jìn)程控制塊中LDT表的關(guān)聯(lián)關(guān)系始終被保持。內(nèi)核為子進(jìn)程復(fù)制進(jìn)程控制塊,為子進(jìn)程和父進(jìn)程平分時(shí)間片,并將子進(jìn)程的進(jìn)程狀態(tài)進(jìn)行修改以抑制它運(yùn)行(它目前還不能運(yùn)行),在收到PM發(fā)來的更新內(nèi)存映射消息Sys_newmap后,內(nèi)核了解了子進(jìn)程的內(nèi)存映射mp_seg,并以此設(shè)置進(jìn)程的代碼段、數(shù)據(jù)段的段描述符segdesc_s,這兩個(gè)段描述符組成進(jìn)程的局部描述符表p_ldt2,這個(gè)LDT表就在內(nèi)核進(jìn)程控制塊中,通過選擇子p_ldt_sel,最終可以找到它。具體由定位到對(duì)應(yīng)段線性地址的說明見附錄示意圖。最后,凡是fork創(chuàng)建的進(jìn)程都是普通用戶進(jìn)程,不是特權(quán)進(jìn)程,所以如果是特權(quán)進(jìn)程(priv(rpp)-s_flag=SYS_PROC)執(zhí)行fork,那么內(nèi)核將子進(jìn)程控制塊中的特權(quán)結(jié)構(gòu)體指針*priv指向用戶特權(quán)級(jí)結(jié)構(gòu)體,即地址priv_addr(USER_PRIV_ID),這個(gè)特權(quán)級(jí)結(jié)構(gòu)對(duì)象用于該進(jìn)程的訪問控制(控制它對(duì)數(shù)據(jù)的訪問和說明它被允許的系統(tǒng)調(diào)用范圍,具體說明見priv)。1.3 FS對(duì)數(shù)據(jù)對(duì)象的操作FS在收到tell_fs調(diào)用消息后,根據(jù)消息m_in.child和m_in.parent找到子進(jìn)程表項(xiàng)位置,為其復(fù)制進(jìn)程控制塊,將與子進(jìn)程相關(guān)的根文件目錄inode *fp_rootdir和工作目錄inode *fp_workdir加1,即該節(jié)點(diǎn)引用次數(shù)加1。1.4 PM設(shè)置回復(fù)消息并進(jìn)而使子進(jìn)程轉(zhuǎn)為就緒態(tài)在內(nèi)核和FS處理完其工作后會(huì)返回PM,PM會(huì)向父進(jìn)程和子進(jìn)程發(fā)送回復(fù)消息,在內(nèi)核負(fù)責(zé)轉(zhuǎn)發(fā)這兩條消息時(shí),子進(jìn)程就被重新設(shè)置為就緒態(tài),不再別抑制運(yùn)行了。附錄:1、Minix中消息Message的定義如下:typedef struct int m_source;/* who sent the message */ int m_type;/* what kind of message is it */ union mess_1 m_m1;mess_2 m_m2;mess_3 m_m3;mess_4 m_m4;mess_5 m_m5;mess_7 m_m7;mess_8 m_m8;mess_9 m_m9;/*added by lcm*/ m_u; message;2、PM維護(hù)有4個(gè)全局變量用于輔助完成服務(wù),它們是:message m_in;/* the input message itself */message m_out;/* the output message used for reply */int who;/* callers proc number */int callnr;/* system call number */3、PM不僅負(fù)責(zé)進(jìn)程管理,還直接負(fù)責(zé)內(nèi)存分配,所以它直接調(diào)用alloc_mem(total_size)函數(shù)嘗試分配內(nèi)存。alloc_mem()函數(shù)功能是檢查PM維護(hù)的空閑鏈表hole,其鏈上的塊內(nèi)存有沒有大小大于total_size的塊,有的話就切去這一塊內(nèi)存分配給進(jìn)程,同時(shí)修改這個(gè)空閑塊的大小和起始地址。hole鏈表中元素hole定義如下,它代表一塊空閑內(nèi)存:struct hole struct hole *h_next; /* pointer to next entry on the list */ phys_clicks h_base; /* where does the hole begin? */ phys_clicks h_len; /* how big is the hole? */;4、PM同內(nèi)核一樣用一個(gè)32位無符號(hào)數(shù)mp_flags說明進(jìn)程的狀態(tài)信息,目前定義的狀態(tài)值共有以下幾種:/* Flag values */#define IN_USE 0x001/* set when mproc slot in use */#define WAITING 0x002/* set by WAIT system call */#define ZOMBIE 0x004/* set by EXIT, cleared by WAIT */#define PAUSED 0x008/* set by PAUSE system call */#define ALARM_ON 0x010/* set when SIGALRM timer started */#define SEPARATE0x020/* set if file is separate I & D space */#defineTRACED0x040/* set if process is to be traced */#define STOPPED0x080/* set if process stopped for tracing */#define SIGSUSPENDED 0x100/* set by SIGSUSPEND system call */#define REPLY 0x200/* set if a reply message is pending */#define ONSWAP 0x400/* set if data segment is swapped out */#define SWAPIN 0x800/* set if on the swap this in queue */#define DONT_SWAP 0x1000 /* never swap out this process */#define PRIV_PROC 0x2000 /* system process, special privileges */5、mproc的定義EXTERN struct mproc struct mem_map mp_segNR_LOCAL_SEGS; /* points to text, data, stack */ char mp_exitstatus;/* storage for status when process exits */ char mp_sigstatus;/* storage for signal # for killed procs */ pid_t mp_pid;/* process id */ pid_t mp_procgrp;/* pid of process group (used for signals) */ pid_t mp_wpid;/* pid this process is waiting for */ int mp_parent;/* index of parent process */ /* Child user and system times. Accounting done on child exit. */ clock_t mp_child_utime;/* cumulative user time of children */ clock_t mp_child_stime;/* cumulative sys time of children */ /* Real and effective uids and gids. */ uid_t mp_realuid;/* process real uid */ uid_t mp_effuid;/* process effective uid */ gid_t mp_realgid;/* process real gid */ gid_t mp_effgid;/* process effective gid */ /* File identification for sharing. */ ino_t mp_ino;/* inode number of file */ dev_t mp_dev;/* device number of file system */ time_t mp_ctime;/* inode changed time */ /* Signal handling information. */ sigset_t mp_ignore;/* 1 means ignore the signal, 0 means dont */ sigset_t mp_catch;/* 1 means catch the signal, 0 means dont */ sigset_t mp_sig2mess;/* 1 means transform into notify message */ sigset_t mp_sigmask;/* signals to be blocked */ sigset_t mp_sigmask2;/* saved copy of mp_sigmask */ sigset_t mp_sigpending;/* pending signals to be handled */ struct sigaction mp_sigact_NSIG + 1; /* as in sigaction(2) */ vir_bytes mp_sigreturn; /* address of C library _sigreturn function */ struct timer mp_timer;/* watchdog timer for alarm(2) */ /* Backwards compatibility for signals. */ sighandler_t mp_func;/* all sigs vectored to a single user fcn */ unsigned mp_flags;/* flag bits */ vir_bytes mp_procargs; /* ptr to procs initial stack arguments */ struct mproc *mp_swapq;/* queue of procs waiting to be swapped in */ message mp_reply;/* reply message to be sent to one */ /* Scheduling priority. */ signed int mp_nice;/* nice is PRIO_MIN.PRIO_MAX, standard 0. */ char mp_namePROC_NAME_LEN;/* process name */ mprocNR_PROCS;6、PM用數(shù)組Mem_map mp_seg3來記錄代碼段、數(shù)據(jù)段和棧段的基址虛擬地址和基址物理地址的映射,以便于通知內(nèi)核創(chuàng)建相應(yīng)段的段描述符,其元素mem_map結(jié)構(gòu)如下: struct mem_map vir_clicks mem_vir;/* virtual address */ phys_clicks mem_phys;/* physical address */ vir_clicks mem_len;/* length */;7、Minix中描述符結(jié)構(gòu)為segdesc_s,8字節(jié)長(zhǎng),與intel保護(hù)模式的描述格式相同:struct segdesc_s /* segment descriptor for protected mode */ u16_t limit_low; u16_t base_low; u8_t base_middle; u8_t access;/* |P|DL|1|X|E|R|A| */ u8_t granularity;/* |G|X|0|A|LIMT| */ u8_t base_high;8、局部描述附表LDT在每個(gè)進(jìn)程的進(jìn)程控制塊中,呈一個(gè)數(shù)組,每個(gè)元素為一個(gè)描述符,定義如下:Struct segdesc_s p_ldt2;9、特權(quán)級(jí)結(jié)構(gòu)體,用于訪問控制。struc

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(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)論