基于Linux源碼分析

基于Linux源碼分析

ID:39474265

大?。?1.00 KB

頁數(shù):4頁

時(shí)間:2019-07-04

基于Linux源碼分析_第1頁
基于Linux源碼分析_第2頁
基于Linux源碼分析_第3頁
基于Linux源碼分析_第4頁
資源描述:

《基于Linux源碼分析》由會(huì)員上傳分享,免費(fèi)在線閱讀,更多相關(guān)內(nèi)容在教育資源-天天文庫

1、Linux源碼分析1.Linux進(jìn)程概述進(jìn)程簡(jiǎn)單的說就是一個(gè)程序一次執(zhí)行的過程,它是一個(gè)動(dòng)態(tài)的概念。按照教科書上的定義,進(jìn)程是程序執(zhí)行的實(shí)例,是linux的基本調(diào)度單位。?對(duì)于程序員來說,最重要的就是要區(qū)分進(jìn)程和程序的區(qū)別,程序是指一段完成功能的代碼,或者說是一個(gè)工具,它是一個(gè)靜態(tài)的概念,而進(jìn)程,它是動(dòng)態(tài)的,比如,linux的vi編輯器,它就是一段在linux下用于文本編輯的工具,那么它是一個(gè)程序,而我們?cè)趌inux終端中,可以分別開啟兩個(gè)vi編輯器的進(jìn)程。一旦提到進(jìn)程,我們的腦子里就應(yīng)該產(chǎn)生——程序從代碼的第一句動(dòng)態(tài)的執(zhí)行到最后一句這樣的一個(gè)思路。?一個(gè)進(jìn)程由如下元素組成:?1.>進(jìn)程的

2、當(dāng)前上下文,即進(jìn)程的當(dāng)前執(zhí)行狀態(tài);?2.>進(jìn)程的當(dāng)前執(zhí)行目錄?3.>進(jìn)程訪問的文件和目錄?4.>進(jìn)程的訪問權(quán)限,比如它的文件模式和所有權(quán)?5.>內(nèi)存和其他分配給進(jìn)程的系統(tǒng)資源?在linux系統(tǒng)中,內(nèi)核使用進(jìn)程來控制對(duì)CPU和其他系統(tǒng)資源的訪問,并且使用進(jìn)程來決定在CPU上運(yùn)行哪個(gè)程序,運(yùn)行多久以及采用什么特性運(yùn)行它。內(nèi)核的調(diào)度器負(fù)責(zé)在所有的進(jìn)程間分配CPU執(zhí)行時(shí)間,稱為時(shí)間片(timeslice),它輪流在每個(gè)進(jìn)程分得的時(shí)間片用完后從進(jìn)程那里搶回控制權(quán)。?OS會(huì)為每個(gè)進(jìn)程分配一個(gè)唯一的整型ID,做為進(jìn)程的標(biāo)識(shí)號(hào)(pid)。進(jìn)程除了自身的ID外,還有父進(jìn)程ID(ppid),所有進(jìn)程的祖先進(jìn)程

3、是同一個(gè)進(jìn)程,它叫做init進(jìn)程,ID為1,init進(jìn)程是內(nèi)核自檢后的一個(gè)啟動(dòng)的進(jìn)程。init進(jìn)程負(fù)責(zé)引導(dǎo)系統(tǒng)、啟動(dòng)守護(hù)(后臺(tái))進(jìn)程并且運(yùn)行必要的程序。?2.Linux進(jìn)程源碼分析Linux中有3個(gè)系統(tǒng)調(diào)用fork、vfork和clone用來產(chǎn)生進(jìn)程,在核心中分別對(duì)應(yīng)sys_fork、sys_vfork和sys_cloen,進(jìn)一步都調(diào)用內(nèi)部函數(shù)do_fork()完成,區(qū)別僅是調(diào)用do_fork()的參數(shù)不同。do_fork參數(shù):unsignedlongclone_flags:特征參數(shù)unsignedlongstack_start:子進(jìn)程堆棧起始地址structpt_regs*regs:寄存

4、器結(jié)構(gòu)指針unsignedlongstack_size:堆棧容量,該參數(shù)未使用int__user*parent_tidptr:父進(jìn)程tid指針int__user*child_tidptr:子進(jìn)程tid指針sys_fork參數(shù):structpt_regs*regs調(diào)用do_fork時(shí)格式:clone_flags=SIGCHLD:子進(jìn)程結(jié)束(terminate)或停止(stop)時(shí)向父進(jìn)程發(fā)送該信號(hào)stack_start=regs->rsp:共用父進(jìn)程堆棧,使用COW機(jī)制進(jìn)行復(fù)制regs=regsstack_size=0parent_tidptr=NULLchild_tidptr=NULLsy

5、s_vfork參數(shù):structpt_regs*regs調(diào)用do_fork時(shí)格式:clone_flags=CLONE_VFORK

6、CLONE_VM

7、SIGCHLD:與父進(jìn)程共用一個(gè)地址空間;并且使父進(jìn)程掛起進(jìn)入等待狀態(tài),直至子進(jìn)程釋放地址空間,即結(jié)束或執(zhí)行一個(gè)新程序;其他與sys_fork相同sys_clone參數(shù):unsignedlongclone_flagsunsignedlongnewspvoid__user*parent_tidvoid__user*child_tidstructpt_regs*regs調(diào)用do_fork時(shí)格式:stack_start=newsp?:regs->rs

8、pstack_start=0其它參數(shù)對(duì)應(yīng)使用下面分析do_fork()過程1pid=alloc_pidmap():分配一個(gè)空閑的pid號(hào)2檢測(cè)current->ptrace標(biāo)記,如果需要跟蹤子進(jìn)程,則在clone_flags加入CLONE_PTRACE標(biāo)記3p=copy_process():創(chuàng)建進(jìn)程描述字I如果clone_flags同時(shí)帶有CLONE_NEWNS和CLONE_FS標(biāo)記則出錯(cuò)。CLONE_NEWNS表示使用新的命名空間(namespace);CLONE_FS表示與父進(jìn)程共享current->fs結(jié)構(gòu),即fs_structII如果clone_flags帶有CLONE_THREA

9、D標(biāo)記但沒有CLONE_SIGHAND標(biāo)記則出錯(cuò)。CLONE_THREAD:將子進(jìn)程加入到父進(jìn)程的線程組中,強(qiáng)制子進(jìn)程共享父進(jìn)程的信號(hào)描述符。CLONE_SIGHAND:共享信號(hào)標(biāo)示表,包括信號(hào)句柄(handler)、阻塞和掛起的信號(hào)III如果clone_flags帶有CLONE_SIGHAND標(biāo)記但沒有CLONE_VM標(biāo)記則出錯(cuò)。CLONE_VM:父子進(jìn)程共享虛地址空間IVp=dup_task_struct(orig=

當(dāng)前文檔最多預(yù)覽五頁,下載文檔查看全文

此文檔下載收益歸作者所有

當(dāng)前文檔最多預(yù)覽五頁,下載文檔查看全文
溫馨提示:
1. 部分包含數(shù)學(xué)公式或PPT動(dòng)畫的文件,查看預(yù)覽時(shí)可能會(huì)顯示錯(cuò)亂或異常,文件下載后無此問題,請(qǐng)放心下載。
2. 本文檔由用戶上傳,版權(quán)歸屬用戶,天天文庫負(fù)責(zé)整理代發(fā)布。如果您對(duì)本文檔版權(quán)有爭(zhēng)議請(qǐng)及時(shí)聯(lián)系客服。
3. 下載前請(qǐng)仔細(xì)閱讀文檔內(nèi)容,確認(rèn)文檔內(nèi)容符合您的需求后進(jìn)行下載,若出現(xiàn)內(nèi)容與標(biāo)題不符可向本站投訴處理。
4. 下載文檔時(shí)可能由于網(wǎng)絡(luò)波動(dòng)等原因無法下載或下載錯(cuò)誤,付費(fèi)完成后未能成功下載的用戶請(qǐng)聯(lián)系客服處理。