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

下載本文檔

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

文檔簡介

965MINIX中的進程創(chuàng)建MINIX的系統(tǒng)中是由PM管理進程創(chuàng)建,但是具體創(chuàng)建操作由PM、內核、FS三部分完成。創(chuàng)建首先是用戶調用 lib/posix/_fork.c中的fork()要求創(chuàng)建進程,這條調用最終轉化成調用src/kernel/proc.c中的sys_call(),并構建一條消息message,其中寫明m-m_source為當前調用者進程號,消息類型m-m_type為FORK。消息(即圖中的m)的地址這時已經作為參數被傳遞進來,sys_call()可以據此得知m的內容,并在適當的時候將內容傳遞給PM(即圖中MM)。PM的工作就是不斷地獲取并處理消息,所以它能夠得到用戶進程發(fā)送的m,并將其存放在m_in中。當PM分析m_in-m_type為FORK,得知了消息的內容是要進行fork操作,它就進一步調用其do_fork()完成整個過程。PM進行FORK操作后,以發(fā)消息的形式通知內核中的系統(tǒng)任務SYSTEM和文件系統(tǒng)FS進行各自的Fork操作,最后由PM設置消息m_out向調用者進程進行回復和提供返回值。下圖1說明了用戶要求進程創(chuàng)建時,消息的傳遞過程。圖中使用了三種箭頭,實線表示消息的發(fā)送過程,點線表示消息的獲取過程,虛線表示發(fā)送和接收消息都會經歷的過程。圖1 Minix的fork調用消息傳遞過程1 FORK所操作的數據對象1.1 PM對數據對象的操作1.1.1 PM為子進程分配內存空間在執(zhí)行fork調用時,如果中途停止,是很困難的事情。所以PM擔心兩件事情會導致進程創(chuàng)建失敗,一是沒有空閑的進程表項,二是當前內存不足,不能為子進程分配足夠內存。為此,首先PM維護一個計數器procs_in_use,記錄當前的進程個數,以方便知道是否有空閑進程表項。其次,PM調用alloc_mem(total_size)嘗試為子進程分配內存,如果返回值為NO_MEM則直接退出并反饋內存不足,如果分配內存成功,那么這次fork就一定能成功。PM查看父進程的內存映射表mp_seg,計算其數據段長度、棧段長度和兩段的間隔gap的大小,以確定應該為子進程申請的內存大小,隨后為子進程申請內存空間。成功申請之后將父進程的內存數據段、棧段和兩段的中間間隔gap(也就是堆)完整的復制到子進程剛申請的內存頁面中。PM復制的內存是從數據段的開始一直到棧段的棧底部,至于代碼段有兩種情況,一是檢查父進程rmp-mp_flags & SEPARATE是否成立(附錄中有所有狀態(tài)定義),成立說明父進程是分離的I&D空間,那么父子進程可以共享代碼段,代碼段就不用復制,并且內存映射表mp_seg中代碼段映射mp_segT不用修改,二是父進程是不分離的I&D空間,就是代碼段和數據段是在一起的,即代碼在數據段中,那么上述內存拷貝從數據段的開始一直到棧段的棧底部,代碼段也就一同被拷貝到子進程內存空間中了。1.1.2 PM創(chuàng)建子進程的進程控制塊PM根據procs_in_use確定有空閑表項后。以遍歷的方式檢查每個表項的mp_flags,直到找到一個mp_flags的IN_USE位沒被置位的表項。通過復制的形式,將父進程進程控制塊復制到這個進程控制塊表項中,因為子進程內存的物理地址改變了,所以要修改子進程控制塊中的內存映射表mp_seg,將其代碼段、數據段和棧段的物理地址mem_phys進行更新,其次PM為子進程控制塊(記做rmc)做其他修改:1、修改其父進程rmc-parent為當前執(zhí)行fork調用的進程,2、修改子進程的進程狀態(tài)mp_flag、退出狀態(tài)mp_exitstatus、信號狀態(tài)mp_sigstatus和子進程運行時間mp_child_utime為默認,3、分配給子進程一個pid號。PM進程控制塊定義可見附錄中mproc。1.2 內核對數據對象的操作內核負責在為子進程創(chuàng)建內核中的進程控制塊,在復制控制塊前,內核先保存子進程控制塊中的LDT表選擇子p_ldt_sel。在復制了父進程控制塊后將子進程的LDT表選擇子重設為它原來的選擇子,這個選擇子內有LDT表描述符的索引并指示要從GDT表查找這個描述符,這樣GDT表和每個進程控制塊中LDT表的關聯關系始終被保持。內核為子進程復制進程控制塊,為子進程和父進程平分時間片,并將子進程的進程狀態(tài)進行修改以抑制它運行(它目前還不能運行),在收到PM發(fā)來的更新內存映射消息Sys_newmap后,內核了解了子進程的內存映射mp_seg,并以此設置進程的代碼段、數據段的段描述符segdesc_s,這兩個段描述符組成進程的局部描述符表p_ldt2,這個LDT表就在內核進程控制塊中,通過選擇子p_ldt_sel,最終可以找到它。具體由定位到對應段線性地址的說明見附錄示意圖。最后,凡是fork創(chuàng)建的進程都是普通用戶進程,不是特權進程,所以如果是特權進程(priv(rpp)-s_flag=SYS_PROC)執(zhí)行fork,那么內核將子進程控制塊中的特權結構體指針*priv指向用戶特權級結構體,即地址priv_addr(USER_PRIV_ID),這個特權級結構對象用于該進程的訪問控制(控制它對數據的訪問和說明它被允許的系統(tǒng)調用范圍,具體說明見priv)。1.3 FS對數據對象的操作FS在收到tell_fs調用消息后,根據消息m_in.child和m_in.parent找到子進程表項位置,為其復制進程控制塊,將與子進程相關的根文件目錄inode *fp_rootdir和工作目錄inode *fp_workdir加1,即該節(jié)點引用次數加1。1.4 PM設置回復消息并進而使子進程轉為就緒態(tài)在內核和FS處理完其工作后會返回PM,PM會向父進程和子進程發(fā)送回復消息,在內核負責轉發(fā)這兩條消息時,子進程就被重新設置為就緒態(tài),不再別抑制運行了。附錄: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維護有4個全局變量用于輔助完成服務,它們是: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不僅負責進程管理,還直接負責內存分配,所以它直接調用alloc_mem(total_size)函數嘗試分配內存。alloc_mem()函數功能是檢查PM維護的空閑鏈表hole,其鏈上的塊內存有沒有大小大于total_size的塊,有的話就切去這一塊內存分配給進程,同時修改這個空閑塊的大小和起始地址。hole鏈表中元素hole定義如下,它代表一塊空閑內存: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同內核一樣用一個32位無符號數mp_flags說明進程的狀態(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用數組Mem_map mp_seg3來記錄代碼段、數據段和棧段的基址虛擬地址和基址物理地址的映射,以便于通知內核創(chuàng)建相應段的段描述符,其元素mem_map結構如下: struct mem_map vir_clicks mem_vir;/* virtual address */ phys_clicks mem_phys;/* physical address */ vir_clicks mem_len;/* length */;7、Minix中描述符結構為segdesc_s,8字節(jié)長,與intel保護模式的描述格式相同: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在每個進程的進程控制塊中,呈一個數組,每個元素為一個描述符,定義如下:Struct segdesc_s p_ldt2;9、特權級結構體,用于訪問控制。struc

溫馨提示

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

評論

0/150

提交評論