簡析linux內(nèi)核的內(nèi)核執(zhí)行流程_第1頁
簡析linux內(nèi)核的內(nèi)核執(zhí)行流程_第2頁
簡析linux內(nèi)核的內(nèi)核執(zhí)行流程_第3頁
簡析linux內(nèi)核的內(nèi)核執(zhí)行流程_第4頁
簡析linux內(nèi)核的內(nèi)核執(zhí)行流程_第5頁
已閱讀5頁,還剩12頁未讀 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、簡析liinuxx內(nèi)核的的執(zhí)行流流程從boootssectt.s到到maiin.cc(內(nèi)核核版本00.111)Linuux啟動動的第一一階段(從開機機到maain.c)33個任務(wù)務(wù):A、啟動動BIOOS,準準備實模模式下的的中斷向向量表和和中斷服服務(wù)程序序。B、從啟啟動盤加加載操作作系統(tǒng)程程序到內(nèi)內(nèi)存。C、為執(zhí)執(zhí)行322的maain函函數(shù)做過過渡準備備。內(nèi)存變化化如下:、0 xFFE0000到00 xFFFFFFF是BIIOS啟啟動塊,其中上上電后第第一條指指令在00 xFFFFF00。、而后00 x0000000到0 xx0033FF總總共1KKB存放放中斷向向量表,而接下下去的地地址到00

2、 x0004FFF共2556B存存放BIIOS數(shù)數(shù)據(jù),從從0 x00E055B開始始的約88KB的的內(nèi)存中中存放中中斷服務(wù)務(wù)程序。、利用BBIOSS中斷00 x199h把硬硬盤的第第一扇區(qū)區(qū)boootseect.s的代代碼加載載到內(nèi)存存中,即即0 x007c000處,后轉(zhuǎn)到到該處執(zhí)執(zhí)行。、將boootssectt.s的的代碼復(fù)復(fù)制到00 x9000000處。、利用中中斷0 xx13hh將seetupp.s程程序加載載到內(nèi)存存0 x9902000處。、再將剩剩余的約約2400個扇區(qū)區(qū)的內(nèi)容容加載到到0 x110000000 x2EEFFFF處。、開始轉(zhuǎn)轉(zhuǎn)到seetupp.s處處執(zhí)行,第一件件事就

3、利利用BIIOS提提供的中中斷服務(wù)務(wù)程序從從設(shè)備上上獲取內(nèi)內(nèi)核運行行的所需需系統(tǒng)數(shù)數(shù)據(jù)并存存在0 xx900000的的地址處處,這時時將原來來boootseect.s的代代碼覆蓋蓋得只剩剩2Byyte的的空間。、關(guān)中斷斷并將系系統(tǒng)代碼碼復(fù)制到到0 x0000000處,將原來來放在這這里的中中斷向量量表與BBIOSS數(shù)據(jù)區(qū)區(qū)覆蓋掉掉,地址址范圍是是0 x000000000 x1EEFFFF。同時時制作兩兩表與兩兩寄存器器。開地址線線A200,尋址址空間達達到4GGB,后后對82259重重新編程程,改變變中斷號號。、轉(zhuǎn)到hheadd.s(大小是是25KK+1884B)執(zhí)行,執(zhí)行該該程序完完后是這這

4、樣的:0 x00000000 xx04FFFF:頁目錄錄與4個個頁表,每一項項是4KKB,共共20KKB;0 x05500000 xx054400:共1KKB的空空間是軟軟盤緩沖沖區(qū);0 x05540110 xx0544b8:共1884B沒沒用;0 x0554b990 xx05ccb8:共2KKB的空空間存中中斷描述述符表;0 x055cb990 xx0644b8:共2KKB的空空間存全全局描述述符表;之后就是是maiin函數(shù)數(shù)的代碼碼了!第二階段段、從mmainn.c函函數(shù)到系系統(tǒng)準備備完畢階階段。第一步:創(chuàng)建進進程0,并讓進進程0具具備在332位保保護模式式下載主主機中的的運算能能力。流流

5、程是:復(fù)制根設(shè)設(shè)備和硬硬盤參數(shù)數(shù)表 (maiin.cc中的1102、1100、1111行)物理內(nèi)存存規(guī)劃格格局(mmainn.c的的1122行1126行行,其中中有 rd_iniit函數(shù)數(shù)定義在在kerrnell/raamdiisk.c中,此函數(shù)數(shù)用于虛虛擬盤初初始化;而meem_iinitt函數(shù)是是用于內(nèi)內(nèi)存管理理結(jié)構(gòu)初初始化,定義在在memm/meemorry.cc中,該該函數(shù)頁頁面使用用虛擬盤設(shè)設(shè)置與初初始化次次數(shù)均設(shè)設(shè)置成1100,然后再再依據(jù)主主內(nèi)存的的起始位位置和終終止位置置將處于于主內(nèi)存存的所有有頁面的的使用次次數(shù)全部部清零,系統(tǒng)以以后把使使用次數(shù)數(shù)為0的的頁面視視為空閑閑頁面。

6、)內(nèi)存管理理結(jié)構(gòu)mmem_mapp初始化化 異常處理理類中斷斷服務(wù)程程序掛接接(在maain.c的1127行行,trrap()函數(shù)數(shù)定義 kkernnel/traap.cc,目的的是將各各種中斷斷與中斷斷描述符符表掛接接。)初始化塊塊設(shè)備與與字符設(shè)設(shè)備請求求項結(jié)構(gòu)構(gòu)(在mmainn.c的的1288、1229行,blkk_deev_iinitt()定定義在kkernnel/blkk_deev/lll_rrw_bblk.c,chr_devv_innit()定義義在keerneel/cchr_devv/ttty_iio.cc)將串口與與顯示器器外設(shè)的的中斷服服務(wù)程序序掛接(在maain.c的1130

7、行行,tty_iniit()定義在在kerrnell/chhr_ddev/ttyy_ioo.c)開啟時間間設(shè)置(在maain.c的1131行行,tiime_iniit()定義于于maiin.cc函數(shù)76行sstarrtupp_tiime)系統(tǒng)開始始激活進進程0(在maain.c的1131行行,scchedd_innit()定義義在keerneel/scheed.cc函數(shù)中中,該函函數(shù)實現(xiàn)現(xiàn)進程相相關(guān)事務(wù)務(wù)設(shè)置依據(jù)時鐘鐘中斷設(shè)設(shè)置,系系統(tǒng)調(diào)用用服務(wù)程程序掛接接。系統(tǒng)統(tǒng)調(diào)用函函數(shù)是對對用戶程程序的最最基本支支持,利利用的是是進程相關(guān)關(guān)事務(wù)初初始化設(shè)設(shè)置系統(tǒng)統(tǒng)調(diào)用軟軟中斷,詳細見見下面講講的。)時鐘

8、中斷斷設(shè)置系統(tǒng)調(diào)用用服務(wù)程程序掛接接初始化緩緩沖區(qū)管管理結(jié)構(gòu)構(gòu)(在mmainn.c中中1333行, bbufffer_iniit(bbufffer_memmoryy_ennd)定定義fss/buuffeer.cc)初始化硬硬、軟盤盤(maain.c中1134、1355行,hhd_iinitt與fllopppy_iinitt定義于于kerrnell/bllk_ddrv/hd.c和kkernnel/blkk_drrv/fflopppy.c)開中斷(maiin.cc中1336行,stii()第二步:以進程程0為母母本創(chuàng)建建進程11,使進進程1不不僅僅具具備進程程0所擁擁有的能能力,而而且還能能以文件

9、件的形式式與外設(shè)設(shè)進行數(shù)數(shù)據(jù)交互互。流程程是:操作系統(tǒng)統(tǒng)為進程程0創(chuàng)建建進程11做準備備 mmainn.c中中1377行,mmovee_too_userr_moode()定義義在inncluude/asmm/syysteem.hh,實現(xiàn)現(xiàn)從內(nèi)核態(tài)到到用戶態(tài)態(tài)。進程程0正式式開始執(zhí)執(zhí)行,而而后執(zhí)行maain.c的1138行行的“if(!foork()”,開始始創(chuàng)建在進程槽槽中為進進程1申申請一個個空閑位位置并獲獲取進程程號進程1,此時將將執(zhí)行uunisstedd.h中中的syyscaall00宏函數(shù)數(shù),得到一一個編號號,對于于forrk函數(shù)數(shù),其值值是2,具體在這個程程序中的的第622行有定定義

10、,然然后執(zhí)行行軟中斷斷復(fù)制進程程0的信信息之前前,先將將一些數(shù)數(shù)據(jù)壓棧棧,進入系系統(tǒng)調(diào)用用階段,跳到內(nèi)內(nèi)核態(tài),執(zhí)行kkernnel/sysstemm_caall.s中的的代碼,將一些些寄存器器的值壓壓棧后,通過剛剛才在uunisstedd.h中中給eaax賦值值初步設(shè)置置進程11管理結(jié)結(jié)構(gòu)的22偏移值值在系統(tǒng)統(tǒng)調(diào)用ssys_calll_ttablle中找找到syys_fforkk函數(shù),跳到該該函數(shù)執(zhí)執(zhí)行。進進入后首首先申請請一個空空閑位置置并獲取取進程號號。這同樣在在sysstemm_caall.s函數(shù)數(shù)中的ssys_forrk進程0創(chuàng)創(chuàng)建進程程1的過過程中發(fā)發(fā)生時鐘鐘中斷中中的_ffindd

11、_coopy_proccesss,再跳跳到該函函數(shù)的定定義處kkernnel/forkk.c中中,后返返回到ssys_forrk中,在從中斷返返回復(fù)制制進程信信息前,再將一一些數(shù)據(jù)據(jù)壓棧,此時有一一個寄存存器的值值和前面面的不一一樣,那就是eeax,此時是是1,它它從taask64中得到的。之后執(zhí)執(zhí)行coopy_proocesss,跳跳到調(diào)整進程程1的管管理結(jié)構(gòu)構(gòu)定義處處kerrnell/foork.c中,設(shè)置進進程1的的管理結(jié)構(gòu)構(gòu)。假如如此時發(fā)發(fā)生時鐘鐘中斷,系統(tǒng)會響應(yīng)并并執(zhí)行kkernnel/sysstemm_caall.s函數(shù)數(shù)中的tiimerr_innterrruppt定義義處,先先壓

12、棧后后設(shè)置進程程1的線線性地址址空間及及物理頁頁面進入入kerrnell/scchedd.c的do_timmer函函數(shù),別別忘了此此時仍在在進程0執(zhí)行,然后便便發(fā)現(xiàn)時時間片還還沒完,所以跳出,并并返回到到rett_frrom_syss_caall。這是繼續(xù)調(diào)整整進程11的管理理結(jié)構(gòu)在在kerrnell/syysteem_ccalll.s中中定義的的,接著直接接將剛才才的壓棧棧數(shù)據(jù)出出棧,繼繼續(xù)完成成剛才創(chuàng)建建進程11的任務(wù)務(wù),即在在forrk.cc中繼續(xù)續(xù)調(diào)整進程程1的管管理結(jié)構(gòu)構(gòu),同時時設(shè)置進進程進程0準準備切換換到進程程11的的線性地地址空間間及物理理頁面,直到執(zhí)行到這這條語句句“p-st

13、aate=TASSK_RUNNNINGG;reeturrn llastt_piid;”,標志志著系統(tǒng)切換換到進程程1執(zhí)行行進程11創(chuàng)建完完成。后后跳出ccopyy_prroceess.c函數(shù),返返回到ssysttem_calll.ss,將壓壓棧的進程1開開始執(zhí)行行的寄存存器值出出棧,此此時eaax是11。后中中斷返回回,進程由由從內(nèi)核核態(tài)變?yōu)闉橛脩魬B(tài)態(tài),即到到了unnistted.h的“if(_rees=0)”這條指指令中,_ress的值就就是eaax的值值,一判判斷成立立,就返返進程1開開始以數(shù)數(shù)據(jù)塊的的形式操操作硬盤盤回該值值。最后后回到了了maiin.cc的“iff(!fforkk()”

14、中,一一判斷不不成立,跳出執(zhí)執(zhí)行下一一條指令令“forr(;)paausee();”,同理理Pausse函數(shù)數(shù)也和fforkk函數(shù)一一樣,這這里就不不將找到的的緩沖塊塊與請求求項掛接接講了,進入ssys_pauuse()后將將進程00置為可中中斷等待待狀態(tài),并調(diào)用用在keerneel/schhed.c定義義的sccheddulee()函函數(shù)切換換進程。進程切換換中斷返返回后執(zhí)執(zhí)行了第第一條語語句將請求項項與硬盤盤處理函函數(shù)掛接接是“if(_rees=0)”,一判判斷,剛存的eeax值值為0,返回到到“if(!foork()”判斷為真真,執(zhí)行行iniit()函數(shù),這在mmainn.c定義。進進入

15、innit.c后其其程序執(zhí)執(zhí)行流程程見附錄錄,進行硬盤盤讀盤前前的工作作準備各各個程序序執(zhí)行目目的正如如左邊寫寫的一樣。給硬盤下下達讀盤盤命令進程1由由于等待待讀盤操操作掛起起系統(tǒng)切換換到進程程0執(zhí)行行進程0執(zhí)執(zhí)行過程程中發(fā)生生硬盤中中斷 硬盤中中斷服務(wù)務(wù)程序響響應(yīng)后,進程00繼續(xù)執(zhí)執(zhí)行再次響應(yīng)應(yīng)硬盤中中斷,并并喚醒進進程1 讀盤操操作完成成后進程程1繼續(xù)續(xù)執(zhí)行 進程11繼續(xù)設(shè)設(shè)置硬盤盤管理結(jié)結(jié)構(gòu) 進程11獲取軟軟盤超級級塊,為為加載根根文件系系統(tǒng)做準準備 進程11備份超超級塊數(shù)數(shù)據(jù) 進程11將根文文件系統(tǒng)統(tǒng)從軟盤盤拷貝到到虛擬盤盤進程1開開始加載載根文件件系統(tǒng)進程1準準備加載載根文件件系統(tǒng)超

16、超級塊進程1繼繼續(xù)加載載根文件件系統(tǒng)進程1準準備獲取取根目錄錄節(jié)點進程1加加載根目目錄節(jié)點點進程1結(jié)結(jié)束加載載根文件件系統(tǒng)的的過程進程1與與內(nèi)核文文件表掛掛接,為為打開文文件做準準備確定打開開操作的的起點獲取枝梢梢i節(jié)點點devv目錄文文件的ii節(jié)點確定deev的目目錄文件件i節(jié)點點為枝梢梢節(jié)點繼續(xù)返回回枝梢ii節(jié)點查找ttty0文文件的ii節(jié)點將ttyy0設(shè)備備文件的的i節(jié)點點,返回回給syys_oopenn系統(tǒng)調(diào)調(diào)用分析ttty0文文件i節(jié)節(jié)點設(shè)置文件件管理結(jié)結(jié)構(gòu)并返返回給用用戶進程程進程復(fù)制制ttyy0文件件句柄進程1繼繼續(xù)復(fù)制制ttyy0文件件句柄第三步:以進程程1為母母本創(chuàng)建建進程2

17、2,使進進程2在在全面具具備進程程1所擁擁有的能能力和環(huán)環(huán)境的基基礎(chǔ)上,進一步步具備支支持”人機交交互“的能力力,最終終實現(xiàn)準準備階段段完成。流程如如下:進程1準準備創(chuàng)建建進程22與進程程0創(chuàng)建建進程11一樣,創(chuàng)建進進程2,復(fù) 制制進程11的管理理結(jié)構(gòu),復(fù)制頁頁表、頁頁目錄 項項等,創(chuàng)創(chuàng)建進程程2后即即執(zhí)行到到iniit/mmainn.c中中復(fù)制進程程2的管管理結(jié)構(gòu)構(gòu)并進行行調(diào)整 1766行與1186行行,分別別是:iif(!(piid =forrk()中子子進程即即進程22執(zhí)行,而父進進程( 進進程1)執(zhí)行1186行行的iff(piid00),父父進程調(diào)整進程程2管理理結(jié)構(gòu)中中與文件件有關(guān)的

18、的內(nèi)容進進入waait函函數(shù),等等待! 進進入waait函函數(shù)后還還做了一一些動作作:首先先 查查找自己己的子進進程,確確定是進進程2后后,判斷斷進程1執(zhí)執(zhí)行過程程中發(fā)生生時鐘中中斷進程程2是否否處于終終止狀態(tài)態(tài)或是 僵僵死狀態(tài)態(tài),一判判斷不是是,就將將進程11設(shè)置為為 可可中斷等等待狀態(tài)態(tài),繼而而調(diào)用sscheedulle()函數(shù)進程1從從時鐘中中斷返回回 準備切切換到進進程2執(zhí)執(zhí)行 切換換到進程程2。 進入進進程2后后開始加加載shhelll程序。首先執(zhí)執(zhí) 行行iniit/mmainn.c中中1800行的“cloose(0);”,就是是進程1查查找它自自己的子子進程解解除fiilp20與f

19、iile_tabble64的第一一項關(guān)系,這這是從進進程1繼繼承過來來的。然然后 是“if(opeen(etcc/rcc,OO_RDDONLLY,00))”,對進程22的狀態(tài)態(tài)進行處處理其中中是將進進程2的的管理結(jié)結(jié)構(gòu)指針針表fiilp 200的第第一項與與fille_ttablle664的的第一項項建立 一個關(guān)關(guān)于資源源配置的的文件,而后再再執(zhí)行切換到進進程2執(zhí)執(zhí)行 eexeccve函函數(shù),并并映射到到syss_exxecvve系統(tǒng)統(tǒng)調(diào)用。 再調(diào)用用do_exeecvee函數(shù),目的便便是將參參數(shù) 與環(huán)境境變量加加載到主主內(nèi)存的的頁面中中去,中中斷為打開/etcc/rcc文件做做準備返返回,但

20、但此時在在該函數(shù)數(shù)里已經(jīng)經(jīng)將EIIP的 值值指向了了sheell程程序的入入口地址址,所以以返回后后 執(zhí)執(zhí)行的是是sheell的的第一條條指令,但這時時卻發(fā)現(xiàn)現(xiàn)進程2打打開”/ettc/rrc“配置文文件內(nèi)存存中沒有有這一條條指令的的映射, 所所以發(fā)生生“缺頁中中斷”,然后后調(diào)用ppagee_faaultt 函數(shù)數(shù)中的ddo_nno_ppagee。通過壓棧棧為加載載sheell文文件做準準備為參數(shù)和和環(huán)境變變量設(shè)置置做準備備得到shhelll文件ii節(jié)點為加載參參數(shù)和環(huán)環(huán)境變量量做準備備根據(jù)i節(jié)節(jié)點,為為sheell文文件進行行檢測檢測shhelll文件頭頭備份文件件頭并進進行分析析對shee

21、ll文文件進行行進一步步分析拷貝參數(shù)數(shù)與環(huán)境境變量調(diào)整進程程2的管管理結(jié)構(gòu)構(gòu)繼續(xù)調(diào)整整進程22的管理理結(jié)構(gòu)釋放進程程2繼承承的頁面面檢測協(xié)處處理器調(diào)整shhelll程序所所在的線線性地址址空間為sheell程程序準備備參數(shù)與與環(huán)境變變量繼續(xù)調(diào)整整進程22的管理理結(jié)構(gòu)調(diào)整EIIP,使使其指向向sheell程程序的入入口地址址Shelll程序序執(zhí)行發(fā)發(fā)生缺頁頁中斷缺頁中斷斷中shhelll程序加加載前檢檢測為即將載載入的內(nèi)內(nèi)容申請請頁面為sheell載載入新獲獲得的頁頁面根據(jù)shhelll進程的的情況,調(diào)整頁頁面內(nèi)容容將線性地地址空間間與程序序所在的的物理頁頁面相對對應(yīng)Shelll程序序開始執(zhí)執(zhí)行

22、,執(zhí)執(zhí)行的內(nèi)內(nèi)容是/etcc/ rrc里面面的命令令,其中中便有創(chuàng)創(chuàng)建uppdatte進Shelll進程程準備創(chuàng)創(chuàng)建uppdatte進程程 程,該進程程是為同同步緩沖沖區(qū)與硬硬盤而 設(shè)的的進程,它會時時不時的的進入睡睡眠狀 態(tài),經(jīng)過一一定的時時間再被被喚醒然然后更新新進程2開開始執(zhí)行行/ettc/rrc文件件緩沖區(qū)區(qū)與硬盤盤的數(shù)據(jù)據(jù)。之后后創(chuàng)建完完成后 SShelll進程程退出,退出操操作當(dāng)然然得釋放放它占用的資源源或者是是清除掉掉,或者者是將使使用次數(shù)數(shù)準備加載載upddatee進程減減1。然然后為進進程1找找到一個個子進程程, 那就就是uppdatte進程程了,發(fā)發(fā)信號告告訴進程程1 shhelll進程退退出,進進程1喚喚醒執(zhí)行行,重新新進入Shelll程序序檢測“etcc/rcc”文件maain.c函數(shù)數(shù)中執(zhí)行行1800行后面面的程序序 再再次創(chuàng)建建sheell進進程,現(xiàn)現(xiàn)在進程程號是44,同樣樣 與之前前的一樣樣,但此此時稍微微有點不不同的是是Shelll進程程退出 opeen的參參數(shù)是/devv/ttty0,這是一一個設(shè)備備 文件,與

溫馨提示

  • 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)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論