成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Linux內(nèi)核源碼do_fork分析

系統(tǒng) Linux 系統(tǒng)運(yùn)維
我們都知道進(jìn)程是Linux內(nèi)核中最為重要的一個(gè)抽象概念,那么我們平時(shí)在fork一個(gè)進(jìn)程時(shí),該進(jìn)程究竟是怎么產(chǎn)生的呢? 本篇推送會(huì)淺談一下在進(jìn)程創(chuàng)建過程中扮演著重要角色的do_fork函數(shù)。

我們都知道進(jìn)程是Linux內(nèi)核中最為重要的一個(gè)抽象概念,那么我們平時(shí)在fork一個(gè)進(jìn)程時(shí),該進(jìn)程究竟是怎么產(chǎn)生的呢?

本篇推送會(huì)淺談一下在進(jìn)程創(chuàng)建過程中扮演著重要角色的do_fork函數(shù)。

內(nèi)核如何來抽象一個(gè)進(jìn)程

 

內(nèi)核通過一個(gè)叫做task_struct的結(jié)構(gòu)體來抽象一個(gè)進(jìn)程,該結(jié)構(gòu)體的定義(以內(nèi)核2.6為例)在include/linux.sched.h中。

截取部分task_struct如下: 

截取部分task_struct 

上述task_struct屬性是我節(jié)選出的部分其結(jié)構(gòu)體中的屬性,我們從中可以大致了解到標(biāo)識(shí)一個(gè)進(jìn)程的屬性大致會(huì)有該用以表示該進(jìn)程所處的狀態(tài),進(jìn)程的標(biāo)志,以及進(jìn)程是否被其他進(jìn)程跟蹤,進(jìn)程鎖的深度,進(jìn)程的優(yōu)先級(jí),進(jìn)程的pid,進(jìn)程的父母,進(jìn)程的孩子鏈表,進(jìn)程所打開的文件描述符表,進(jìn)程所處的文件系統(tǒng),進(jìn)程的信號(hào)。。。。等等一堆我們平時(shí)可能遇到的和進(jìn)程相關(guān)的東西。

do_fork簡單分析 

接觸linuxC編程的人都知道,創(chuàng)建一個(gè)進(jìn)程我們需要調(diào)用fork函數(shù),fork其實(shí)又是調(diào)用了clone函數(shù)來實(shí)現(xiàn)的,而clone函數(shù)中最關(guān)鍵的函數(shù)就是do_fork函數(shù)。

在分析do_fork前我們腦海中可以大致想象一下,進(jìn)程究竟是如何被創(chuàng)建出來的,假如讓你來創(chuàng)建一個(gè)進(jìn)程你會(huì)咋么做?

我們可以這樣去分析,既然原來的進(jìn)程被抽象成一個(gè)task_struct,那么新進(jìn)程也是一個(gè)task_struct只不過它里面的一些屬性會(huì)不同與原來的task_struct,那么創(chuàng)建一個(gè)新進(jìn)程所要做的工作就是賦值一個(gè)與原來進(jìn)程一樣都的task_struct結(jié)構(gòu),然后然后將新進(jìn)程的task_struct不同于原來task_struct的屬性進(jìn)行修改即可。

do_fork定義在kernel/fork.c文件中。

在分析該函數(shù)之前我們先來分析一下它的函數(shù)的各個(gè)參數(shù)。

參數(shù)如下:  

參數(shù) 

1.clone_flags:該參數(shù)是此函數(shù)中最重要的一個(gè)參數(shù),該值中的每個(gè)位都代表對(duì)子進(jìn)程task_struct中的每種屬性的設(shè)置;

2.stack_start:子進(jìn)程用戶態(tài)堆棧的開始地址;

3.regs:當(dāng)系統(tǒng)發(fā)生系統(tǒng)調(diào)用時(shí),需從用戶態(tài)切換到內(nèi)核態(tài),此結(jié)構(gòu)體用來保存此時(shí)用戶態(tài)進(jìn)程中的通用寄存器中的值,并被存放在內(nèi)核態(tài)堆棧中;

4.stack_size:目前未被使用,通常設(shè)為0;

5.parent_tidptr:父進(jìn)程在用戶態(tài)下pid的地址;

6.child_tidptr:子進(jìn)程在用戶態(tài)下pid的地址;

其中clone_flags的標(biāo)志位宏定義如下:  

clone_flags的標(biāo)志位宏定義 

舉個(gè)簡單的例子當(dāng)我們的參數(shù)中設(shè)置了CLONE_VM這個(gè)宏,那么就以為這我們新創(chuàng)建的進(jìn)程和其父進(jìn)程要共享VM,當(dāng)我們?cè)O(shè)置了CLONE_FILES時(shí)意味這父子進(jìn)程之間共享打開的文件描述符。

do_fork開始執(zhí)行后首先做的就是為子進(jìn)程定義一個(gè)新的task_struct指針:

struct task_struct *p;

在下來會(huì)檢查一些clone_flags所不允許的位組合,例如:

  1. if (clone_flags & CLONE_NEWUSER) {  if (clone_flags & CLONE_THREAD)  return -EINVAL; 
  2.  
  3. }  

上述中不允許同時(shí)既設(shè)置了CLONE_NEWUSER標(biāo)志,還設(shè)置CLONE_THREAD標(biāo)志,這樣就會(huì)產(chǎn)生錯(cuò)誤。

類似上面當(dāng)一系列的安全檢查完畢之后,copy_process函數(shù)就登場(chǎng)了,copy_process函數(shù)工作流程具體如下:

1)調(diào)用dup_task_struct函數(shù)為新的進(jìn)程創(chuàng)建一個(gè)內(nèi)核棧,thread_info結(jié)構(gòu)和task_struct等,當(dāng)然此時(shí)的值都是和父進(jìn)程完全一樣的

dup_task_struct函數(shù)定義如下: 

dup_task_struct函數(shù)定義

 

2)檢查并確保新創(chuàng)建該子進(jìn)程后,當(dāng)前用戶所擁有的進(jìn)程數(shù)沒有超出給它分配的資源限制,代碼如下:  

 

3)子進(jìn)程著手使自己與父進(jìn)程區(qū)別開來,從父進(jìn)程那繼承過來的許多屬性都要被清0或設(shè)置一個(gè)初始值,但task_struct中的大多數(shù)數(shù)據(jù)還是未被修改,部分代碼如下:

 

  

 

4)給子進(jìn)程分配一個(gè)CPU,代碼如下:

  1. sched_fork(p, clone_flags); 

5) 接著就是子進(jìn)程拷貝父進(jìn)程的一些資源,具體如下,調(diào)用copy_files函數(shù)拷貝父進(jìn)程打開的文件描述符:   

 

調(diào)用copy_fs繼承父進(jìn)程所屬的文件系統(tǒng)。  

 

調(diào)用copy_signal函數(shù)拷貝并設(shè)置新的signal_struct,signal_struct包含了大量的進(jìn)程運(yùn)行的信息,調(diào)用copy_mm函數(shù)處理與新進(jìn)程的內(nèi)存問題。  

 

調(diào)用copy_io函數(shù)拷貝父進(jìn)程的I/O情況: 

 

還有調(diào)用copy_namespaces 和 copy_thread等,這里就不在贅述。

6)調(diào)用alloc_pid為新進(jìn)程分配一個(gè)pid。

pid = alloc_pid(p->nsproxy->pid_ns);

7)copy_process做一些收尾工作,并返回新進(jìn)程的task_struct指針,此時(shí)再次回到了do_fork,新創(chuàng)建的子進(jìn)程被喚醒,并讓其先投入運(yùn)行。 

 

總結(jié) 

關(guān)于進(jìn)程創(chuàng)建的源碼理解,我感覺主要抓住倆點(diǎn)即可。***進(jìn)程被內(nèi)核抽象成了啥?它的數(shù)據(jù)結(jié)構(gòu)是咋樣的(task_struct)這點(diǎn)我們必須有所認(rèn)識(shí),第二創(chuàng)建進(jìn)程最主要的其實(shí)就是拷貝父進(jìn)程的task_struct里的屬性,但是關(guān)鍵點(diǎn)是拷貝哪些,哪些又是子進(jìn)程和父進(jìn)程所不同的,很簡單我們只需要把握住進(jìn)程創(chuàng)建函數(shù)里的clone_flags參數(shù)就可以知道怎么拷貝了。

責(zé)任編輯:龐桂玉 來源: 西郵Linux興趣小組
相關(guān)推薦

2023-04-28 08:42:08

Linux內(nèi)核SPI驅(qū)動(dòng)

2009-12-11 09:42:54

Linux內(nèi)核源碼進(jìn)程調(diào)度

2009-12-11 09:47:23

Linux內(nèi)核源碼進(jìn)程調(diào)度

2021-12-15 15:03:51

Linux內(nèi)核調(diào)度

2014-07-29 15:44:33

Linux內(nèi)核Crash

2023-05-08 07:41:07

Linux內(nèi)核ELF文件

2020-07-28 08:54:39

內(nèi)核通信Netlink

2021-09-06 07:45:08

LinuxLinux內(nèi)核

2021-09-28 07:12:09

Linux內(nèi)核入口

2017-08-16 16:20:01

Linux內(nèi)核態(tài)搶占用戶態(tài)搶占

2021-04-08 09:32:17

鴻蒙HarmonyOS應(yīng)用

2021-03-11 11:14:39

鴻蒙HarmonyOS應(yīng)用

2021-12-29 11:51:15

Linux 內(nèi)核源碼Linux 系統(tǒng)

2009-12-11 15:10:22

2022-03-11 20:23:14

鴻蒙源碼分析進(jìn)程管理

2009-08-09 20:39:11

Linux內(nèi)核虛擬環(huán)境虛擬主機(jī)

2022-03-31 16:26:49

鴻蒙源碼分析進(jìn)程管理

2022-04-13 11:02:12

鴻蒙事件模塊事件Event

2022-03-03 18:28:28

Harmony進(jìn)程任務(wù)管理模塊

2021-01-22 09:47:22

鴻蒙HarmonyOS應(yīng)用開發(fā)
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

主站蜘蛛池模板: 日日干日日操 | 婷婷在线免费 | 国产免费观看久久黄av片涩av | 国产精品亚洲综合 | 亚洲视频一区在线观看 | 国产伦精品一区二区三区四区视频 | 国产日韩久久久久69影院 | 国产高清美女一级a毛片久久w | 在线婷婷 | 亚洲欧美中文日韩在线v日本 | 欧美国产日韩在线观看成人 | 超碰精品在线 | 欧美性高潮| 国产精品女人久久久 | 在线观看深夜视频 | 99re| 2019精品手机国产品在线 | 中文字幕亚洲精品 | 免费一区二区三区 | 欧美日韩精选 | 99精品视频在线观看免费播放 | 午夜影院| 国产精品日女人 | 亚洲国产成人在线视频 | 99精品国产一区二区青青牛奶 | 免费同性女女aaa免费网站 | 精品国产不卡一区二区三区 | 国产成人精品久久二区二区91 | 青青激情网 | 亚洲欧美日韩一区二区 | 中文字幕视频在线免费 | 国产乱码精品一区二区三区中文 | 久在草 | 男人的天堂在线视频 | 国产精品视频一区二区三区 | 精品国产高清一区二区三区 | 毛片黄片免费看 | 亚欧精品 | 伊人青青久久 | 五月激情六月婷婷 | 成av在线|