資源描述:
《西電Linux內(nèi)核分析大作業(yè)》由會(huì)員上傳分享,免費(fèi)在線閱讀,更多相關(guān)內(nèi)容在工程資料-天天文庫(kù)。
1、Linux內(nèi)核作業(yè)、程序設(shè)計(jì)思路題目中說(shuō)明要使用系統(tǒng)調(diào)用,所以首先要先下載編譯Linux內(nèi)核,并在內(nèi)核中加入相關(guān)的系統(tǒng)調(diào)用聲明,序號(hào)等等的。進(jìn)程是通過(guò)list_head雙向鏈表連接起來(lái)的,所以根據(jù)一個(gè)進(jìn)程就可以得到其他的進(jìn)程描述符。要獲得第一個(gè)進(jìn)程,我們選擇了init進(jìn)程。要把進(jìn)程以樹(shù)的形式輸岀,所以要用到深度優(yōu)先遍歷。在進(jìn)程描述符屮,通過(guò)children可以獲得這個(gè)進(jìn)程的了進(jìn)程。根據(jù)優(yōu)先遍丿力的方法,進(jìn)行遞歸的打卬輸出,就可以生成一棵進(jìn)程樹(shù)。打印過(guò)程中,縮進(jìn)采用層級(jí)的打印空格實(shí)現(xiàn)。二、程序內(nèi)容程序中首先要在一些表中進(jìn)行聲明。主要的
2、程序在sys.c屮實(shí)現(xiàn)。主要冇兩個(gè)函數(shù)構(gòu)成,一個(gè)系統(tǒng)調(diào)用函數(shù),一個(gè)用于遞歸調(diào)用的函數(shù)。在系統(tǒng)調(diào)用函數(shù)屮,會(huì)調(diào)用這個(gè)遞歸調(diào)用函數(shù)。三、問(wèn)題及解決辦法1.不了解進(jìn)程描述符structtask_struct{〃這個(gè)是進(jìn)程的運(yùn)行時(shí)狀態(tài),J代表不可運(yùn)行,0代表可運(yùn)行,>0代表已停止。volatilelongstate;/*flags是進(jìn)程當(dāng)前的狀;態(tài)標(biāo)志,貝-體的如:0x00000002表示進(jìn)程正在被創(chuàng)建;0x00000004表示進(jìn)程正準(zhǔn)備退岀;0x00000040表示此進(jìn)程被forkHl,但是并沒(méi)冇執(zhí)frexec;0x00000400表示此
3、進(jìn)程由于其他進(jìn)程發(fā)送相關(guān)信號(hào)而被殺死。*/unsignedintflags;〃表示此進(jìn)程的運(yùn)行優(yōu)先級(jí)unsignedintrt_priority;structlistheadtasks;〃該結(jié)構(gòu)體記錄了進(jìn)程內(nèi)存使用的相關(guān)情況structmmstruct*mm;/*進(jìn)程的一些狀態(tài)參數(shù)*/intexit_state;intexit_code,exit_signal;〃進(jìn)程號(hào)Pid_tpid;〃進(jìn)程組號(hào)pid_ttgid;//real_parent是該進(jìn)程的“親生父親”,不管其是否被“寄養(yǎng)”。structtask_struct*real_
4、parent;//parent是該進(jìn)程現(xiàn)在的父進(jìn)程,有可能是“繼父”structtask_struct*parent;〃這里children指的是該進(jìn)程孩子的鏈表,可以得到所有孩子的進(jìn)程描述符structlist_headchildren;//sibling該進(jìn)程兄弟的鏈表,也就是其父親的所冇孩子的鏈表structlist_headsibling;〃這個(gè)是主線程的進(jìn)程描述符structtask_struct*group_leader;〃這個(gè)是該進(jìn)程所有線程的鏈表。structlist_headthread_group;〃該進(jìn)程使用c
5、pu時(shí)間的信息,utime是在用戶(hù)態(tài)卜?執(zhí)行的時(shí)間,stime是在內(nèi)核態(tài)下執(zhí)行的時(shí)間cputime_tutime,stime;〃下而的是啟動(dòng)的時(shí)間,只是時(shí)間基準(zhǔn)不一樣structtimespecstart_time;structtimespecreal_start_time;//comm是保存該進(jìn)程名字的字符數(shù)組,長(zhǎng)度最長(zhǎng)為15,因?yàn)門(mén)ASK_COMM_LEN為16charcomm[TASK_COMM_LEN];/*文件系統(tǒng)信息計(jì)數(shù)*/intlink_count,totalJink_count;/*該進(jìn)程在特定CPU下的狀態(tài)*/st
6、ructthread_structthread;/*文件系統(tǒng)相關(guān)信息結(jié)構(gòu)體*/structfs_struct*fs;/*打開(kāi)的文件相關(guān)信息結(jié)構(gòu)體*/structfiles_struct*files;廠信號(hào)相關(guān)信息的句柄*/structsignal_struct*signal;structsignal_struct水signal;/*這些是松弛時(shí)間值,用來(lái)規(guī)定select()和poll()的超時(shí)時(shí)間,單位是納秒nanoseconds*/unsignedlongtimerslackns;unsignedlongdefault_tirne
7、r_slack_ns;};1.遍歷進(jìn)程的方法#definelist_entry(ptr,type,member)、container_of(ptr,type,member)//defineoffsetof(TYPE,MEMBER)((size_t)&((TYPE*)0)->MEMBER)#definecontainer_of(ptGtype,member)({consttypeof(((type*)O)->member)*_mptr=(ptr);(type*)((char*)_mptr-offsetof(type,member)
8、);})#definelist_for_each(pos,head)for(pos=(head)->next;prefetch(pos->next),pos!=(head);pos=pos->next)通過(guò)這些宏,知道了如何去使用