天天看點

linux程序管理實驗視訊,Linux程序管理實驗

《Linux程序管理實驗》由會員分享,可線上閱讀,更多相關《Linux程序管理實驗(11頁珍藏版)》請在人人文庫網上搜尋。

1、Linux程序管理實驗一、實驗内容:1. 利用bochs觀測linux0.11下的PC程序控制結構。2. 利用bochs觀測linux0.11下的fork.c源代碼檔案,簡單分析其中 的重要函數。3. 在fork.c适當位置添加代碼,以驗證fork函數的工作原理。二、Linux程序管理機制分析Linux有兩類程序:一類是普通使用者程序,一類是系統程序,它既可以在使用者空間運作,又可以通過系統調用進入核心空間,并在核心空間運作;另一類叫做核心程序,這種程序隻能在核心空間運作。 在以i386為平台的Linux系統中,程序由程序控制塊,系統堆棧, 使用者堆棧,程式代碼及資料段組成。Linux系統中的每一個。

2、使用者程序 有兩個堆棧:一個叫做使用者堆棧,它是程序運作在使用者空間時使用的 堆棧;另一個叫做系統堆棧,它是使用者程序運作在系統空間時使用的 堆棧。1. Linux程序的狀态:Linux程序用程序控制塊的state域記錄了程序的目前狀态,一個 Linux程序在它的生存期中,可以有下面6種 狀态。1. 就緒狀态(TASK_RUNNING)在此狀态下,程序已挂入就緒隊列, 進入準備運作狀态。2. 運作狀态(TASK_RUNNING)當程序正在運作時,它的state域中的 值不改變。但是Linux會用一個專門指針(current)指向目前運作的任3. 可中斷等待狀态(TASK_INTERRUPTIBLE程序。

3、由于未獲得它所申請 的資源而處在等待狀态。不管是資源有效或者中斷喚醒信号都能使等 待的程序脫離等待而進入就緒狀态。即”淺睡眠狀态”4. 不可中斷等待狀态(TASK_UNINTERRUPTIBLE這個等待狀态與上面等待狀态的差別在于隻有當它申請的資源有效時才能被喚醒,而其它信号不能。即深睡眠狀态”5. 停止狀态(TASK_STOPPED當程序收到一個SIGSTO信号後就由運 行狀态進入停止狀态,當收到一個SINCON信号時,又會恢複運作狀 态。挂起狀态。6. 終止狀态(TASK_ZOMBIE)程序因某種原因終止運作,但程序控制 塊尚未登出。即僵死狀态”狀态圖如下所示:2. Linux程序控制塊:。

4、 在Linux中,程序控制塊為資料結構task_struct,它包含了大量該進 程的資訊,這些資訊大緻為以下幾類:1) .程序的目前狀态2) .排程資訊3) .程序辨別4) .程序的通信資訊5) .程序與其它程序之間關系的資訊6) .使用檔案的資訊7) .虛拟記憶體與實體記憶體的關系8) .計時器9) .處理器與程序的有關資訊3. Fork 函數:父程序建立一個子程序最友善快捷的方式就是把父程序的控制 塊照原樣複制一個,然後再根據子程序的修改特點對它進行必要的修 改,形成子程序的控制塊。系統調用 fork() 通過調用 find_empty_process 及copy_process 等 函數複制。

5、一個目前程序的程序控制塊,然後用新程序辨別修改舊辨別, 填寫子程序與父程序關系,建立子程序堆棧和資料區。是以,fork()執行後,父子程序共享同一個存儲空間,父程序的所有可共享資源都被子程序通過資料結構的複制繼承了過來。在父程序調用fork()與在子程序中調用fork() ,fork()的傳回值不 同!如果是在父程序調用fork(),則fork()就複制出一個子程序,并傳回子程序的辨別ID,如果建立子程序失敗,則fork()的傳回值為-1;而如果在子程序調用fork(),貝陀傳回的是0。三、實驗步驟及結果在安裝目錄下輕按兩下bochs.exe,選擇提供好的linux0.11配置檔案,點選start。

6、,啟動虛拟機,如下圖所示:Licenced f or use mi th boch courtesy of MandralkcSoft-For inforMotion on this op other UGA deuelopment products contact El in Sys terns at - (800) 723-9938 or uuu .elji tin. comHochs J3 1US - builA:RRftuisinn: 1.Z31 $ SDrtte: Z6fin4/26 17:1?;0? SPpt ioTE : apirtbios pc ib ids e 1 tor i。

7、to remb i 032Ct妞曲 master: Keneric 1Z34 ATA-b Hard-Disk (59 IIBytesIPress F12 f or boot menu kBootie。from Floppy,.hD(1 iFiy system * .Partit inn tflble ok .4510/fcG09G free blocks19ZZ0/Ze0O& free Inodes3462 buffers = 3545G08 bytes buffer spaceFree metfl: 1253291Z bytesOkL/usr/root Jtt利用bochs觀測linux0.。

8、11下的PCB程序控制結構檔案夾,如下所1.切換工作目錄到 /usr/src/linux/include/linux示:Llit cd n&rsrex* 1 inmix* iirtc ludel inurL usrZsxc( 1 i fiux/i nu 1, ndu” 1 inuLxl# 1 s匚oifiFig.h F s hhead hrm hsys Fif dresf h hdregkerine I . h sclied ti tty . hzusrzsi*c/ 1 inuxz inc Ludezl i nux IS2.利用vi編輯器打開sched.h頭檔案,尋找struct task_s。

9、truct 結構體的定義,如下:1stritcl tak_sti?uct G slopped wLong prior*i電Loit(r sigrna 1.struct s igfacion s igact lohL32JjLonir blockedvar- ions f ields *z1 nt exit _code;uns i gned Long 0士孔1*電_匚口|4空 # eindl_u口亠亡Endl_dlE *艮brk舍七也七_wit;k: Lon(r pid,f ather,pgrp,session leader;uns igned hoi。

10、-t hi4 j Euid t il id i unsigned short tjld jegid,sq id; long a lam;lon( utime j st ime, cut ime, cst imej start 11 me Ju.ns i gned short file sgsteht info */ Fn七 tty;uns iqned short str net m_Lnode struct m inodens Ed_raa七 :so i 七 milst be s ignedZ* 1 i f ria tty unasllong ebpPlong edi j long esi l。

11、ony gsj tong noneT long ebxJlong ecXjlong edx, long fslong esj Long dsje ip j lonq cs, long ef lags, iofiff esp j 1 ong ss JslaLe - TA5K_UMINTERKUFTIBLE, p pid 工 lci3t_pid; p fither = current id: p-couri ter = p-pr iot i ty :_p-s ignal = 0;在該函數中有*p=*current 代碼,這句代碼表示:current是指向父程序PCB吉構體的指針,p是指向子程序PC。

12、B吉構體的 指針,作業系統先把父程序的PC結構體完完整整的複制了一份給子 程序。2.找到copy_mer函數,發現其調用copy_page_tables。其中,copy_page_tables 的實作在 /usr/src/linux/mm/memory.c 檔案中,其代碼截圖如下:ini copymewit int nr t struct task_3trnct * p)uns igned .1 ong td_datfl_has:e, nRU_(iata_bfixe,data_J in it; unsianFd I nng n n巳u_r:rHl亡一血穴否亡.jm it :cudii_l in。

13、i1ml I CGxGf );lata limi L-irEL_liiiill CGxi?) u ld_c;udr_lKLJir -tLitiTEiiL- ldl 11 J );al(l_tlatn_lj4Sc - gcjt_bcsc (current ldt 2 1 ;i f tald_da ta_base !- o J d_code_base)pahicCUe den*t suppoift separate D)IIf (data_l i it stflrt_codft = new-cnde-hAsei set_bdsetp-IdtEU ,reu_code _baseJ; set_bcis。

14、K (ji- IdlLZJ j neu_ddt*_bt&se);IT (cupLi_pp 2Z;dlr = Z0) St Oxf f c ): / _pg_dLr = G *x fur scirt_co20)6OxTfc) i exper_page_t ab le=(unsijneA 1 DingC Qxf f ffC *exp ejr_ii i r ) J ;pr Lntk C p Id : z I An*p-pld ;pr Fnth ( pagc-tab i c -xldn * t *expcr_pcife_4ablc J :fdrtkl=6;kls七戶t_ccjde!:expEr_r1 。

15、ir-CnsignE?d 1 dug temperf c 5 exptr_pt!jc_ttille-(mis li|ntd 1uiil| * 】(Gf ff f f(*exper_d Ir),pf imk(1 p id :黒 ldnu/ tasJcEldl:pr intk5&p-father!=4)是為了差別系統程序與使用者程序而設定的。因為,如果不這樣區分,會導緻列印出一些我們不想 看到的資訊,造成混亂,不友善實驗觀察。p-start_code是p所指向 程序的頁目錄資訊。exper_page_table是p所指向程序的頁表資訊。For(k1=0;k1ttincludei n七 ma in()。

16、pid_t pi d :if(pid=forkC)=-lDpri ntF (,rfork errnr J ;else if(pid=6)pr intf (11 i am ch i Id my p i d is dSnir i d (); S lccpdGQ) Jelsepr intf(am father jmy pid is ZdSnetpidC3)J sleep(1G6D Jpeturn 0;編譯運作結果顯示如下:L口七 J tt . Z*flL . OUlt:17paye_tfl-b le : 1619573 state:0cnun-ter : 0pr i or i 七y:占li i d 。

17、: Orny number : 03031423pid:16page_-tati 1e : 1&445573 state : counter:15pr i or i ty:15aid :Gmy numher1 : O3Q914Z3i am father* , my pi d is 16 i am ch ild 怕y p i d is 17由運作結果可以看出,父子程序的頁表指向了同一個實體位址, 進而驗證了我們之前的理論,子程序會複制父程序的PCB共享其記憶體 空間。四、實驗結果與心得本次實驗主要通過學習Linux系統程序管理機制,并通過Bochs 進行驗證。實驗中通過初步閱讀linu x0.11作業系統源代碼,了解其 建立程序的大體流程。另外,通過修改源代碼,驗證了 fork函數的工 作原理。實驗中首先要比較深入的了解程序控制塊以及 fork函數,我覺得自 己了解起來還是有點困難。不過通過實驗,閱讀核心代碼的能力有所 提高,并初步學會如何去修改代碼并實作驗證。 為以後的學習打下一 個良好的基礎,是以收獲頗多。-文.範文。