已閱讀5頁,還剩6頁未讀, 繼續(xù)免費(fèi)閱讀
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
此文檔收集于網(wǎng)絡(luò),如有侵權(quán),請聯(lián)系網(wǎng)站刪除 操作系統(tǒng)實(shí)驗(yàn)(minix部分) 顯示當(dāng)前進(jìn)程信息 實(shí)驗(yàn)?zāi)康囊弧?運(yùn)用操作系統(tǒng)所學(xué)原理知識,加深進(jìn)程機(jī)制在Minix操作系統(tǒng)中的實(shí)現(xiàn);二、 分析Minix系統(tǒng)進(jìn)程PCB數(shù)據(jù)結(jié)構(gòu),包括進(jìn)程調(diào)度、內(nèi)存管理和文件系統(tǒng)三部分中各數(shù)據(jù)成員的具體含義;三、 了解Minix操作系統(tǒng)整體實(shí)現(xiàn)機(jī)制;四、 學(xué)習(xí)Minix操作系統(tǒng)中進(jìn)程間通信機(jī)制,查看Minix這方面的源碼。實(shí)驗(yàn)過程一、 實(shí)驗(yàn)準(zhǔn)備在此實(shí)驗(yàn)的預(yù)習(xí)過程中我們需要了解操作系統(tǒng)中有關(guān)于進(jìn)程方面的知識,并且要更深層的了解進(jìn)程機(jī)制在minix中的實(shí)現(xiàn)。此外,還有進(jìn)程的通信機(jī)制也需要注重了解。這樣我們作實(shí)驗(yàn)才能更高效。首先,我們先從最基本的概念入手。進(jìn)程是操作系統(tǒng)中最重要的一個基本點(diǎn),深入并且透徹的理解好進(jìn)程的含義,不僅是做好此次實(shí)驗(yàn)的關(guān)鍵,更是我們學(xué)好操作系統(tǒng)整個課程的重中之重?!斑M(jìn)程”這一術(shù)語有許多人在不同角度對其下過定義,其中最能進(jìn)程實(shí)質(zhì)的定義有:(1) 進(jìn)程是程序的一次執(zhí)行;(2) 進(jìn)程是可以和別的計算并發(fā)執(zhí)行的計算;(3) 進(jìn)程可定義為一個數(shù)據(jù)結(jié)構(gòu)及能在其上進(jìn)行操作的一個程序;(4) 進(jìn)程是一個程序及其數(shù)據(jù)在處理機(jī)上順序執(zhí)行時所發(fā)生的活動;(5) 進(jìn)程是程序在一個數(shù)據(jù)集合上的運(yùn)行過程,是系統(tǒng)進(jìn)行資源分配和調(diào)度的一個獨(dú)立單位。據(jù)此,我們可以把“進(jìn)程”定義為:“可并發(fā)執(zhí)行的程序在一個數(shù)據(jù)集合上的運(yùn)行過程”。我們在理解好上述進(jìn)程定義的基礎(chǔ)上,在對進(jìn)程進(jìn)行一下自己的思考,是進(jìn)程的概念在自己的腦海里形成一個自己的概念,然后再去對進(jìn)程的其他特征進(jìn)行了解和分析。例如進(jìn)程的動態(tài)性、并發(fā)性、獨(dú)立性、異步性和結(jié)構(gòu)特性。我們還需要知道進(jìn)程的三個最基本的狀態(tài),就緒狀態(tài)、執(zhí)行狀態(tài)和阻塞狀態(tài),以及三者之間的相互關(guān)系:結(jié)束新進(jìn)程執(zhí)行就緒阻塞接納 完成 中斷 進(jìn)程調(diào)度 I/O完成或事件發(fā)生 I/O請求或等待某事件 此外,我們還需要知道引起進(jìn)程創(chuàng)建的事件有用戶登錄、作業(yè)調(diào)度、提供服務(wù)和應(yīng)用請求。進(jìn)程的創(chuàng)建又大概分為:1、申請空白PCB;2、為新進(jìn)程分配資源;3、初始化進(jìn)程控制塊;4、將新進(jìn)程插入就緒隊列。PCB就是進(jìn)程控制塊,它是進(jìn)程存在的唯一標(biāo)志,當(dāng)系統(tǒng)創(chuàng)建一個新進(jìn)程時,就為它建立一個PCB;進(jìn)程結(jié)束時又收回其PCB,進(jìn)程于是也隨之消亡。 了解完進(jìn)程的概念,我們開始去認(rèn)識進(jìn)程間的通信。進(jìn)程是經(jīng)常要與其他進(jìn)程通信。例如,在一個shell管道中,第一個進(jìn)程的輸出必須傳送到第二個進(jìn)程,這樣沿著管道傳遞下去。因此需要在通信的進(jìn)程間,最好使用一種結(jié)構(gòu)較好的方式,而不用中斷。這就是我們所說的進(jìn)程通信。我們在做此實(shí)驗(yàn)時應(yīng)該著重去學(xué)習(xí)消息傳遞這個概念。這種通信方法使用兩條原語SEND和RECEIVE。他們像信號量一樣是系統(tǒng)調(diào)用,因此很容易地被加入庫例程。例如:send(destination,&message); receive(source,&message);前一個調(diào)用向一個給定的目標(biāo)發(fā)送一條消息,后一個調(diào)用從給定的源接受一條消息。但消息傳遞系統(tǒng)有它自己的缺點(diǎn),就是在設(shè)計上有很多的難點(diǎn),消息傳遞有很多變體,因此對于我們初學(xué)者,我們來看如何對消息編址這種方法:為每個進(jìn)程分配一個唯一的地址,按進(jìn)程為消息指定地址。 對進(jìn)程的總體有了了解后,我們該入主題了,看看進(jìn)程機(jī)制是如何在MINIX中實(shí)現(xiàn)的。Minix本身就是一組進(jìn)程的集合。它們相互之間,以及與用戶進(jìn)程之間使用進(jìn)程間通信機(jī)制(消息傳遞)來進(jìn)行通信,這種設(shè)計使得minix的結(jié)構(gòu)更加模塊化和靈活。 我們首先大體瀏覽一下Minix整個系統(tǒng),Minix被組織成4層,每一層執(zhí)行很完好的功能。這4層為:1、進(jìn)程管理,這是最低層,它捕獲所有的中斷和陷入,完成進(jìn)程調(diào)度,并向高層提供一個采用消息進(jìn)行通信的獨(dú)立順序進(jìn)程模型,其中斷處理最低層部分用匯編語言編寫,其余部分和其他層次用C語言編寫;2、I/O進(jìn)程,每類設(shè)備都有一個I/O進(jìn)程,為了將其與其他普通用戶進(jìn)程相區(qū)別我們稱之為任務(wù),第2層的所有任務(wù)和第一層的代碼鏈接成一個單一的二進(jìn)制程序,稱作內(nèi)核(kernel),盡管任務(wù)和內(nèi)核被編譯在一起,但在執(zhí)行時內(nèi)核被賦予比任務(wù)更高的特權(quán)級,所以真正的內(nèi)核代碼可以訪問任一部分內(nèi)存,及任一處理器寄存器;3、服務(wù)器進(jìn)程,這些服務(wù)器進(jìn)程在低于任務(wù)和內(nèi)核的特權(quán)級上運(yùn)行,不能直接訪問I/O端口,也不能訪問屬于自己段以外的內(nèi)存,主要有內(nèi)存管理(Memory Manager,MM)負(fù)責(zé)執(zhí)行所有牽涉到內(nèi)存管理的系統(tǒng)調(diào)用,文件系統(tǒng)(File System,FS)負(fù)責(zé)執(zhí)行文件系統(tǒng)的調(diào)用,盡管從它們的禁用的機(jī)器指令來看,它們與用戶進(jìn)程運(yùn)行在相同的特權(quán)級上,但它們的執(zhí)行優(yōu)先級比用戶進(jìn)程高;4、用戶進(jìn)程,包含所有的用戶進(jìn)程shell、編譯器、編輯器以及用戶的a.out程序。 下面我們來了解minix的進(jìn)程管理。計算機(jī)開機(jī)時,硬件從引導(dǎo)盤上將第一道第一扇區(qū)讀入內(nèi)存并從那里開始執(zhí)行。Minix的引導(dǎo)程序裝入一個更大的程序boot,由boot裝入操作系統(tǒng)。一旦裝入操作系統(tǒng)完成,內(nèi)核開始運(yùn)行,在其初始化階段,內(nèi)核先啟動各任務(wù),然后是內(nèi)存管理器、文件系統(tǒng)及所有在第三層運(yùn)行的服務(wù)器。當(dāng)所有這些都開始運(yùn)行并完成初始化之后,它們將阻塞,等待執(zhí)行某種操作。當(dāng)所有的任務(wù)和服務(wù)器被阻塞之后,將執(zhí)行第一個用戶進(jìn)程,init。MINIX中兩條最重要的系統(tǒng)調(diào)用是FORK和EXEC,F(xiàn)ORK是創(chuàng)建一個新進(jìn)程的唯一途徑,EXEC允許一個進(jìn)程執(zhí)行一個指定的程序,當(dāng)一個程序被執(zhí)行時,將按照文件頭中指定的大小為其分配一部分內(nèi)存。 Minix中的進(jìn)程間通信。Minix提供了三條原語來發(fā)送和接受消息,它們均通過C庫例程調(diào)用,send(dest,&message)用來向進(jìn)程dest發(fā)送一條消息;receive(source,&message)用來從進(jìn)程source(或任何地方)接受一條消息;send_rec(src_dst,&message)用來發(fā)送一條消息,并等待同一個進(jìn)程的應(yīng)答。了解完原理,我們再來看看minix源代碼的組織。源代碼從邏輯上分為兩個目錄。在一個標(biāo)準(zhǔn)的minix系統(tǒng)中,其完整路徑分別為/usr/include和/usr/src。Include/目錄包含了許多符合POSIX標(biāo)準(zhǔn)的頭文件,它又包含3個子目錄:1、sys/ 包含POSIX頭文件;2、minix/ 包含操作系統(tǒng)使用的頭文件;3、ibm/ 包含IBMPC特有定義的頭文件。Src/目錄包含3個重要的子目錄,其中包含了操作系統(tǒng)的源代碼:1、kernel/ 第1層和第2層(進(jìn)程、消息和驅(qū)動程序);2、mm/ 內(nèi)存管理器代碼;3、fs/ 文件系統(tǒng)代碼。操作系統(tǒng)當(dāng)然要支持在其上運(yùn)行的命令,所以有一個很大的命令目錄src/commands/,其中包含工具程序(如cat、cp、data、ls、pwd)的源代碼。由于minix是一個用于教學(xué)的操作系統(tǒng),這就意味著對它常常要做修改,所以有一個src/test/目錄包含有一些被設(shè)計用來對新編譯好的minix系統(tǒng)進(jìn)行完整測試的工具。最后/src/inet/目錄包含了重新編譯minix以使之支持網(wǎng)絡(luò)的源代碼。二、設(shè)計思想 有了上面的理論指導(dǎo),具體再實(shí)現(xiàn)某個實(shí)驗(yàn)應(yīng)該是比較容易了。對于本次實(shí)驗(yàn),我們應(yīng)該具體分析進(jìn)程在minix中實(shí)現(xiàn)機(jī)制。minix系統(tǒng)本身分為四個進(jìn)程:kernel、mm、fs、init。而我們所要打印的PCB信息分別在kernel、mm、fs中,要想直接的到這些信息并不是一件容易的事情。因?yàn)樗械倪M(jìn)程所占用的內(nèi)存空間都是受一定保護(hù)的,更何況這里牽涉到的是操作系統(tǒng)本身的進(jìn)程,用戶進(jìn)程不可能直接對他們進(jìn)行訪問,因此要得到所需要的信息有一定的困難。 Minix系統(tǒng)所有進(jìn)程依靠消息進(jìn)行通信和協(xié)作,包括kernel、mm和fs。所以,我們只能從這里開始。然而,系統(tǒng)本身并沒有給我們提供用來的到進(jìn)程控制塊所有信息的方法,因此,修改內(nèi)核、內(nèi)存管理以及文件系統(tǒng)相應(yīng)的代碼是必需的。據(jù)此,我們做出了如下的總體設(shè)計。 為了得到系統(tǒng)中的進(jìn)程控制塊信息,我們必須取得對kernel、mm、fs三個進(jìn)程的內(nèi)存區(qū)域的訪問權(quán),而最簡單的辦法就是修改系統(tǒng)的內(nèi)核、內(nèi)存管理、文件系統(tǒng)本身的源代碼,將我們所需要的功能在操作系統(tǒng)內(nèi)部實(shí)現(xiàn),這樣一來,就不存在了訪問權(quán)的問題。 我們這里要用到一個叫做“調(diào)用轉(zhuǎn)儲”的概念(操作系統(tǒng):設(shè)計與實(shí)現(xiàn)第二版上冊第213頁)。在鍵盤驅(qū)動程序中kb_read的開始調(diào)用func_key來檢測用來控制和調(diào)試的掃描碼。在檢測到F1和F2鍵時調(diào)用的轉(zhuǎn)儲例程位于dmp.c中。首先,p_dmp(第14613行)為所有的進(jìn)程顯示基本的處理信息,包括在按下F1鍵時顯示的內(nèi)存使用信息。第二,map_dmp(第14660行)在按下F2時提供更詳細(xì)的內(nèi)存使用信息。我們利用這個特性,增加了幾個功能鍵的定義:鍵功能F1顯示進(jìn)程表F2顯示進(jìn)程內(nèi)存空間的詳細(xì)使用情況F3在硬件滾屏和軟件滾屏之間切換F5顯示以太網(wǎng)統(tǒng)計流量(如果網(wǎng)絡(luò)支持編譯)CF7(CtrlF7)發(fā)送SIGQUIT信號,同CTRL-效果CF8(CtrlF8)發(fā)送SIGINT信號,同DEL效果CF9(CtrlF9)發(fā)送SIGKILL信號,同CTRL-U效果F10顯示kernel中的PCB信息(除F1種已經(jīng)有的)(我們的成果)F11顯示mm中的PCB信息(我們的成果)F12顯示fs中的PCB信息(我們的成果) 對于調(diào)用系統(tǒng)信息,我們采用功能鍵中斷方式直接由kernel接受中斷,在usr/kernel/keyborad中添加F10、F11、F12分別調(diào)用kernel、mm、fs中的子程序輸出該部分的進(jìn)程信息。對于mm和fs我們還要在kernel里添加語句發(fā)送消息到mm和fs使之執(zhí)行相應(yīng)的處理程序。 程序功能流程圖如下: Send(0, &message)Send(1, &message)kernelvirtual consoledo_printpcb打印kernel中的PCBdo_tomm將打印消息傳給mmdo_tofs將打印消息傳給fsfunc_keycase :F10case :F11case :F12mm:main函數(shù)得到消息,并辨別出消息內(nèi)容,調(diào)用pr_mprocpr_mproc打印mm中的PCBfs:main函數(shù)得到消息,并辨別出消息內(nèi)容,調(diào)用pr_mprocpr_fproc打印fs中的PCB設(shè)計中的思路應(yīng)該是基于學(xué)習(xí)過程中的重點(diǎn),但在實(shí)踐中的靈活運(yùn)用更為重要,如何能更方便更有效的完成要求,便是看自己對掌握的知識的深淺。Minix本身就是一種教學(xué)軟件,所以我們應(yīng)該從另一個角度去做這個實(shí)驗(yàn),那就是那種方法更能幫助我們更好的理解理論知識,那種方法更能運(yùn)用更多方面的知識。這樣,便會使我們能從多角度的理解問題,能更好的達(dá)到做實(shí)驗(yàn)的目的。 三、編碼階段:首先,了解Minix的進(jìn)程結(jié)構(gòu),Minix進(jìn)程存放在內(nèi)核、內(nèi)存管理和文件系統(tǒng)三部分中,當(dāng)在系統(tǒng)下鍵入F1F12時,Minix系統(tǒng)都會有相應(yīng)。利用此原理,采用中斷方式顯示進(jìn)程信息。所以,在src/kernel/keyboard.c中的func_key過程中添加F10、F11、F12的相應(yīng)程序。程序改為如下:(注:其中黑體部分為Minix源程序,紅色粗體為我們添加的程序)PRIVATE int func_key(scode)int scode;/* scan code for a function key */* This procedure traps function keys for debugging and control purposes. */ unsigned code; code = map_key0(scode);/* first ignore modifiers */ if (code F12) return(FALSE);/* not our job */ switch (map_key(scode) /* include modifiers */ case F1:p_dmp(); break;/* print process table */ case F2:map_dmp(); break;/* print memory map */ case F3:toggle_scroll(); break;/* hardware vs. software scrolling */#if ENABLE_NETWORKING case F5:dp_dump(); break;/* network statistics */#endif case F10:do_printpcb();break;/*print pcb 2002.4.20。在 func_key過程中添加控制打印kernel的pcb中內(nèi)容的F10的中斷代碼*/ case F11:do_tomm(); break;/*send to mm 2002.4.20。在func_key過程中添加控制打印mm的pcb中內(nèi)容的F11的中斷代碼*/case F12:do_tofs(); break;/*send to fs 2002.4.20。在 func_key過程中添加控制打印fs 的pcb中內(nèi)容的F12的中斷代碼*/ case CF7:sigchar(&tty_tableCONSOLE, SIGQUIT); break; case CF8:sigchar(&tty_tableCONSOLE, SIGINT); break; case CF9:sigchar(&tty_tableCONSOLE, SIGKILL); break; default:return(FALSE); return(TRUE); 有如上程序知道,按入F10鍵時,直接調(diào)用do_printpcb函數(shù),而do_printpcb函數(shù)將進(jìn)程在kernel中的內(nèi)容打印在屏幕上,其程序如下:#include kernel.h #include #include proc.h /*在do_printpcb函數(shù)中用到的庫函數(shù)*/PRIVATE void do_printpcb() /*F10調(diào)用的打印kernel中pcb的函數(shù)*/ register struct proc *rp; /*定義一個指針來指向中斷時的某一進(jìn)程*/ static struct proc *oldrp=BEG_PROC_ADDR; /*定義另一指針來指向進(jìn)程的 地址,初始值為第一個進(jìn)程的地址*/ int n=0; /*設(shè)置一個計數(shù)器,來存放在屏幕上顯示的行數(shù)*/ printf(nshow kernel info); /*開始打印pcb內(nèi)容*/ printf(np_reg-sel-block-held-chu-chs-alam-carq-from-send-next-ping-pend-namen); /*打印要顯示的pcb中內(nèi)容的具體名字*/ for(rp=oldrp;rpp_flags&P_SLOT_FREE) continue; /*在程序外設(shè)有標(biāo)志位p_flag標(biāo)明程序可以執(zhí)行,P_SLOT_FREE是標(biāo)識還有空間給進(jìn)程分配*/if (+n20) break; /*當(dāng)打印完20行后使程序跳出*/ printf(n%6u%6x%5d%7d%7u%7u%5u%5x%5d%5d%3x%6x%2u%5c,rp-p_reg,rp-p_ldt_sel,rp-p_int_blocked,rp-p_int_held,rp-child_utime,rp-child_stime,rp-p_alarm,rp-p_callerq,rp-p_getfrom,rp-p_sendto,rp-p_nextready,rp-p_pending,rp-p_pendcount,rp-p_name16); /*將pcb中的各項(xiàng)具體數(shù)據(jù)按 列打印出來*/ if(rp=END_PROC_ADDR) rp=BEG_PROC_ADDR; else printf(n-more-r); oldrp=rp; /*檢驗(yàn)進(jìn)程是否結(jié)束,如果結(jié)束指針再指向新的進(jìn)程,反之打印 more繼續(xù)打印本進(jìn)程的內(nèi)容*/當(dāng)鍵入F11鍵時,調(diào)用do_tomm()過程,將打印的消息傳送到內(nèi)存管理中去,其消息的內(nèi)容是讓mm執(zhí)行第70條語句pr_mproc(在跳轉(zhuǎn)表src/mm/table.c中用戶定義):PRIVATE void do_tomm()message mes;mes.m_type=70;send(0,&mes); /*定義do_tomm()過程,將打印的消息傳到內(nèi)存管理中去,讓其執(zhí)行第70條語句pr_mproc(在跳轉(zhuǎn)表src/mm/table.c中用戶定義),這就是消息傳遞的方法,給每個進(jìn)程分配唯一地址*/當(dāng)鍵入F12鍵時,調(diào)用do_tofs()過程,將打印的消息傳送到內(nèi)存管理中去,其消息的內(nèi)容是讓mm執(zhí)行第70條語句pr_fproc(在跳轉(zhuǎn)表src/fs/table.c中用戶定義):PRIVATE void do_tofs()message mes;mes.m_type=70;send(1,&mes);/*這個過程同mm,只是將消息傳到fs中*/由以上的程序,完成了kernel部分的任務(wù)。然后,開始修改內(nèi)存管理和文件系統(tǒng)相應(yīng)代碼,以完成進(jìn)程控制塊的輸出任務(wù),在mm塊中,首先要更改src/mm/table.c的內(nèi)容: no_sys,/* 68 = TASK_REPLY */no_sys,/* 69 = unused*/pr_mproc,/* 70 = Print Mproc Info user defined 2002.4.20。 在跳轉(zhuǎn)表中定義用戶進(jìn)程,并分配地址。*/do_sigaction,/* 71 = sigaction */do_sigsuspend,/* 72 = sigsuspend */修改完改table表后,由kernel那傳來的第70信號,執(zhí)行pr_mproc,同時,pr_proc是由src/mm/proto.h定義的:/* forkexit.c */_PROTOTYPE( int do_fork, (void);_PROTOTYPE( void pr_mproc, () );/* User Difine 2002.4.20*/_PROTOTYPE( int do_mm_exit, (void);_PROTOTYPE( int do_waitpid, (void);_PROTOTYPE( void mm_exit, (struct mproc *rmp, int exit_status);在此完成的了pr_mproc()定義和調(diào)用,而pr_mproc的主程序在src/mm/forkexit.c中,完成了對mproc結(jié)構(gòu)的內(nèi)容的讀取和寫入屏幕:/*略去頭文件和所用到的庫函數(shù),這些在源代碼中都有明確寫出*/int mm_count=0; /*定義一個計數(shù)器,因?yàn)閜cb中的內(nèi)容太多,一行不能全打 出所以這是一個所用屏幕數(shù)的計數(shù)器*/PUBLIC void pr_mproc() /*開始打印mm中的pcb內(nèi)容*/ register struct mproc *rp;/*定義一個指針來指向中斷時的某一個進(jìn)程*/ static struct mproc *oldrp=&mproc0;/*定義另一個指針指向進(jìn)程的地址,初始值為第一個進(jìn)程的地址*/ int n=0; /*設(shè)置一個計數(shù)器,來存放在屏幕上顯示的行數(shù)*/ printf(nSHOW stc/mm/mproc.hn); switch(mm_count)/*將pcb中的內(nèi)容最多分為4個屏幕打出*/ case 0:printf(n-mp_exitstatus-mp_sigstatus-mp_pid-mp_procgrp-mp_wpid-mp_parentn);/*第一個屏幕打出的pcb內(nèi)容*/for (rp=oldrp;rp20)break;/*打完一個屏幕程序跳出*/ printf(n%15d%14d%8d%12d%9d%11d,rp-mp_exitstatus,rp-mp_sigstatus,rp-mp_pid,rp-mp_procgrp,rp-mp_wpid,rp-mp_parent); break;/*按列打印出對應(yīng)的具體數(shù)據(jù)內(nèi)容*/ case 1: printf(n-mp_realuid-mp_effuid-mp_realgid-mp_effgid-mp_ino-mp_dev-mp_ctimen); for (rp=oldrp;rp20)break; printf(n%12d%11d%10d%11d%8d%8d%15d,rp-mp_realuid,rp-mp_effuid,rp-mp_realgid,rp-mp_effgid,rp-mp_ino,rp-mp_dev,rp-mp_ctime); break;/*打印第二個屏幕的內(nèi)容,具體程序同第一個*/ case 2: printf(n-mp_ignore-mp_catch-mp_sigmask-mp_sigmask2-mp_sigpending-mp_sigreturnn); for (rp=oldrp;rp20)break; printf(n%11d%10d%12d%13d%15d%14d,rp-mp_ignore,rp-mp_catch,rp-mp_sigmask,rp-mp_sigmask2,rp-mp_sigpending,rp-mp_sigreturn); break;/*打印第三個屏幕的內(nèi)容*/ case 3: printf(n-mp_func-mp_flags-mp_procargsn); for (rp=oldrp;rp20)break; printf(n%9d%10d%13d,rp-mp_func,rp-mp_flags,rp-mp_procargs); break;/*打印的第四個屏幕的內(nèi)容*/ mm_count=mm_count+1; if (mm_count=4) mm_count=0;/*打印完所有內(nèi)容,初始化mm_count*/dont_reply=TRUE;同樣,在文件系統(tǒng)中,要完成進(jìn)程控制塊的輸出任務(wù),也要更改相應(yīng)的src/fs/table.c : no_sys,/* 68 = TASK_REPLY*/no_sys,/* 69 = unused */pr_fproc, /* 70 = Print Fproc Info user defined 2002.4.20。 在fs跳轉(zhuǎn)表中為進(jìn)程分配地址。*/no_sys,/* 71 = SIGACTION */no_sys,/* 72 = SIGSUSPEND */同樣,pr_fproc在src/fs/proto.c中有如下的定義: _PROTOTYPE(void pr_fproc, () );/*2002.4.20。聲明過程pr_fproc*/對于pr_fproc的主程序在src/fs/main.c中,完成了對mproc結(jié)構(gòu)的內(nèi)容的讀取和寫入屏幕:/*略去頭文件和所用到的庫函數(shù),這些在源代碼中都有明確寫出*/int fs_count=0; /*定義一個計數(shù)器,因?yàn)閜cb中的內(nèi)容太多,一行不能全打 出所以這是一個所用屏幕數(shù)的計數(shù)器*/PUBLIC void pr_fproc()/*開始打印fs中的pcb內(nèi)容*/ register struct fproc *rp;/*定義一個指針來指向中斷時的某一個進(jìn)程*/ static struct fproc *oldrp=&fproc0; /*定義另一個指針指向進(jìn)程的地址,初始值為第一個進(jìn)程的地址*/ int n=0; /*設(shè)置一個計數(shù)器,來存放在屏幕上顯示的行數(shù)*/ printf(show src/fs/fproc.hn); switch(fs_count) /*將pcb中的內(nèi)容最多分為3個屏幕打出*/ case 0: printf(n-fp_umask-*fp_workdir-*fp_rootdir-); printf(*fp_filpOPEN_MAX-fp_realuid-fp_effuidn); /*第一個屏幕打出的pcb內(nèi)容*/ for(rp=oldrp;rp20)break; /*打完一個屏幕程序跳出*/ printf(%10d%11d%13x%20x%12d%11dn,rp-fp_umask,(rp-fp_workdir),(rp-fp_rootdir),(rp-fp_filpOPEN_MAX),rp-fp_realuid,rp-fp_effuid); break; /*按列打印出對應(yīng)的具體數(shù)據(jù)內(nèi)容*/ case1: printf(n-fp_realgid-fp_effgid-fp_tty-fp_fd-*fp_buffer-fp_nbytes-fp_cum_io_partialn);for(rp=oldrp;rp20) break; printf(%12d%11d%8d%7d%12c%11d%19dn,rp-fp_realgid,rp-fp_effgid,rp-fp_tty,rp-fp_fd,rp-fp_buffer,rp-fp_nbytes,fp-fp_cum_io_partial); break;/*打印第二個屏幕的內(nèi)容*/ case2: printf(n-fp_suspended-fp_revived-fp_task-fp_sesldr-fp_pid-fp_cloexecn); for(rp=oldrp;rp20) break; printf(%14c%12c%9c%11c%8d%12ld,rp-fp_suspended,rp-fp_revived,rp-fp_task,rp-fp_sesldr,rp-fp_pid,rp-fp_cloexec); break;/*打印第三個屏幕的內(nèi)容*/ fs_count=fs_count+1; if(fs_count=3) fs_count=0;/*打印完所有內(nèi)容,初始化fs_count*/ dont_reply=TRUE;四、編譯階段:在完成了以上的文件的修改和編寫輸入后,存盤退出,轉(zhuǎn)到/src/tools目錄下,對Minix系統(tǒng)進(jìn)行重新編譯,輸入: make在編譯通過后,在當(dāng)前目錄下生成image文件,是Minix的映象文件,接著輸入: mount /dev/hd1a hd1a my image /hd1a/minix.test sync完成后,就可以停機(jī)重起!在monitor狀態(tài)下,鍵入hd0 image = minix.testhd0 save重新進(jìn)入Minix ;這時Minix將相應(yīng)我們定義的功能鍵!五、運(yùn)行結(jié)果:F10 ( Kernel ) :F10顯示在kernel中的進(jìn)程信息,各項(xiàng)消息如下:p_reg-sel-block-held-chu-chs-alam-carq-from-send-next-ping-pend-name第一次鍵入F10將顯示20個進(jìn)程信息(如果有這么多的話),其它未能顯示的(將會有more給出提示)進(jìn)程將在再鍵入F10時顯示,每次顯示20個,直到全部顯示完畢。F11 ( MM ) :F11顯示在MM中的進(jìn)程信息,由于信息內(nèi)容較多,這需要多次輸入F11顯示更多的信息,同樣,如果未能顯示全部進(jìn)程信息,將有提示再鍵入F11顯示更多進(jìn)程的信息:-mp_exitstatus-mp_sigstatus-mp_pid-mp_procgrp-mp_wpi
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 課程設(shè)計預(yù)制樁
- 門窗研發(fā)課程設(shè)計
- 送料車 plc課程設(shè)計
- 齒輪傳動課程設(shè)計 慕課
- 鋅精礦焙燒課程設(shè)計
- GB/T 45156-2024安全與韌性應(yīng)急管理社區(qū)災(zāi)害預(yù)警體系實(shí)施通用指南
- 2024版我國鐵路運(yùn)輸合同的公約及約定
- 2024版夫妻共有財產(chǎn)分割合同樣本版B版
- 2024旅游風(fēng)光攝影作品買賣合同
- 2024年短視頻平臺全托管理服務(wù)合同版B版
- 文化沖突與民族認(rèn)同建構(gòu)-洞察分析
- 企業(yè)會計機(jī)構(gòu)的職責(zé)(2篇)
- 《疥瘡的防治及治療》課件
- Unit4 What can you do Part B read and write (說課稿)-2024-2025學(xué)年人教PEP版英語五年級上冊
- 2025年MEMS傳感器行業(yè)深度分析報告
- 《線控底盤技術(shù)》2024年課程標(biāo)準(zhǔn)(含課程思政設(shè)計)
- 學(xué)校對口幫扶計劃
- 倉庫倉儲安全管理培訓(xùn)課件模板
- 風(fēng)力發(fā)電場運(yùn)行維護(hù)手冊
- 河道旅游開發(fā)合同
- 情人合同范例
評論
0/150
提交評論