資源描述:
《基于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=