精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

從創建進程到進入Main函數,發生了什么?

開發 前端
這篇文章主要討論的是操作系統層面上對于進程、線程的創建初始化等行為,而像Python、Java等基于解釋器、虛擬機的語言,如何進入到main函數執行,這背后的路徑則更長(包含了解釋器和虛擬機內部的執行流程),以后有機會再討論。

 [[349114]]

前幾天,讀者群里有小伙伴提問:從進程創建后,到底是怎么進入我寫的main函數的?

今天這篇文章就來聊聊這個話題。

首先先劃定一下這個問題的討論范圍:C/C++語言

這篇文章主要討論的是操作系統層面上對于進程、線程的創建初始化等行為,而像Python、Java等基于解釋器、虛擬機的語言,如何進入到main函數執行,這背后的路徑則更長(包含了解釋器和虛擬機內部的執行流程),以后有機會再討論。所以這里就重點關注C/C++這類native語言的main函數是如何進入的。

本文會兼顧敘述Linux和Windows兩個主要平臺上的詳細流程。

創建進程

第一步,創建進程。

在Linux上,我們要啟動一個新的進程,一般通過fork + exec系列函數來實現,前者將當前進程“分叉”出一個孿生子進程,后者負責替換這個子進程的執行文件,來執行子進程的新程序文件。

這里的fork、exec系列函數,是操作系統提供給應用程序的API函數,在其內部最終都會通過系統調用,進入操作系統內核,通過內核中的進程管理機制,來完成一個進程的創建。

操作系統內核將負責進程的創建,主要有下面幾個工作要做:

  • 創建內核中用于描述進程的數據結構,在Linux上是task_struct
  • 創建新進程的頁目錄、頁表,用于構建新進程的內存地址空間

在Linux內核中,由于歷史原因,Linux內核早期并沒有線程的概念,而是用任務:task_struct來描述一個程序的執行實例:進程。

在內核中,一個任務對應就是一個task_struct,也就是一個進程,內核的調度單元也是一個個的個task_struct。

后來,多線程的概念興起,Linux內核為了支持多線程技術,task_struct實際上表示的變成了一個線程,通過將多個task_struct合并為一組(通過該結構內部的組id字段)再來描述一個進程。因此,Linux上的線程,也稱為輕量級進程。

系統調用fork的一個重要使命就是要去創建新進程的task_struct結構,創建完成后,進程就擁有了調度單元。隨后將開始可以參與調度并有機會獲得執行。

加載可執行文件

通過fork成功創建進程后,此時的子進程和父進程相當于一個細胞進行了有絲分裂,兩個進程“幾乎”是一模一樣的。

而要想子進程執行新的程序,在子進程中還需要用到exec系列函數來實現對進程可執行程序的替換。

exec系列函數同樣是系統調用的封裝,通過調用它們,將進入內核sys_execve來執行真正的工作。

這個工作細節比較多,其中有一個重要的工作就是加載可執行文件到進程空間并對其進行分析,提取出可執行文件的入口地址。

我們使用C、C++等高級語言編寫的代碼,最終通過編譯器會編譯生成可執行文件,在Linux上,是ELF格式,在Windows上,稱之為PE文件。

無論是ELF文件還是PE文件,在各自的文件頭中,都記錄了這個可執行文件的指令入口地址,它指示了程序該從哪里開始執行。

這個入口指向哪里,是我們的main函數嗎?這里賣一個關子,先來解決在這之前的一個問題:進程創建后,是如何來到這個入口地址的?

不管在Windows還是Linux上,應用線程都會經常在用戶空間和內核空間來回穿梭,這可能出現在以下幾種情況發生時:

  • 系統調用
  • 中斷
  • 異常

從內核返回時,線程是如何知道自己從哪里進來的,該回到應用空間的哪里去繼續執行呢?

答案是,在進入內核空間時,線程將自動保存上下文(其實就是一些寄存器的內容,比如指令寄存器EIP)到線程的堆棧上,記錄自己從哪里來的,等到從內核返回時,再從堆棧上加載這些信息,回到原來的地方繼續執行。

前面提到,子進程是通過sys_execve系統調用進入到內核中的,在后面完成可執行文件的分析后,拿到了ELF文件的入口地址,將會去修改原來保存在堆棧上的上下文信息,將EIP指向ELF文件的入口地址。這樣等sys_execve系統調用結束時,返回到用戶空間后,就能夠直接轉到新的程序入口開始執行代碼。

所以,一個非常重要的特點是:exec系列函數正常情況下是不會返回的,一旦進入,完成使命后,執行流程就會轉向新的可執行文件入口。

另外需要提一下的是,在Linux上,除了ELF文件,還支持一些其他格式的可執行文件,如MS-DOS、COFF

除了二進制的可執行文件,還支持shell腳本,這個情況下將會將腳本解釋器程序作為入口來啟動

從ELF入口到main函數

上面交代了,一個新的進程,是如何執行到可執行文件的入口地址的。

同時也留了一個問題,這個入口地址是什么?是我們的main函數嗎?

這里有一個簡單的C程序,運行起來后輸出經典的hello world:

  1. #include <stdio.h> 
  2. int main() { 
  3.     printf("hello, world!\n"); 
  4.     return 0; 

通過gcc編譯后,生成了一個ELF可執行文件,通過readelf指令,可以實現對ELF文件的分析,這里可以看到ELF文件的入口地址是0x400430:

隨后,我們通過反匯編神器,IDA打開分析這個文件,看一下位于0x400430入口的地方是什么函數?

可以看到,入口地方是一個叫做 _start 的函數,并不是我們的main函數。

在_start的結尾,調用了 __libc_start_main 函數,而這個函數,位于libc.so中。

你可能疑惑,這個函數是哪里冒出來的,我們的代碼中并沒有用到它呢?

其實,在進入main函數之前,還有一個重要的工作要做,這就是:C/C++運行時庫的初始化。上面的 __libc_start_main 就是在完成這一工作。

在通過GCC進行編譯時,編譯器將自動完成運行時庫的鏈接,將我們的main函數封裝起來,由它來調用。

glibc是開源的,我們可以在GitHub上找到這個項目的libc-start.c文件,一窺 __libc_start_main 的真面目,我們的main函數正是被它在調用。

完整流程

到這里,我們梳理了,從進程創建fork,到通過exec系列函數完成可執行文件的替換,再到執行流程進入到ELF文件的入口,再到我們的main函數的完整流程。

Windows上的一些區別

下面簡單介紹下Windows上這一流程的一些差異。

首先是創建進程的環節,Windows系統將fork+exec兩步合并了一步,通過CreateProcess系列函數一步到位,在其參數中指定子進程的可執行文件路徑。

不同于Linux上進程和線程的邊界模糊,在Windows操作系統上,內核是有明確的進程和線程概念定義,進程用EPROCESS結構表示,線程用ETHREAD結構表示。

所以在Windows上,進程相關的工作準備就緒后,還需要單獨創建一個參與內核調度的執行單元,也就是進程中的第一個線程:主線程。當然,這個工作也封裝在了CreateProcess系列函數中了。

新進程的主線程創建完成后,便開始參與系統調度了。主線程從哪里開始執行呢?內核在創建時就明確進行了指定:nt!KiThreadStartup,這是一個內核函數,線程啟動后就從這里開始執行。

線程從這里啟動后,再通過Windows的異步過程調用APC機制執行提前插入的APC,進而將執行流程引入應用層,去執行Windows進程應用程序的初始化工作,比如一些核心DLL文件的加載(Kernel32.dll、ntdll.dll)等等。

隨后,再次通過APC機制,再轉向去執行可執行文件的入口點。

這后面和Linux上的機制類似,同樣沒有直接到main函數,而是需要先進行C/C++運行時庫的初始化,這之后經過運行時函數的包裝,才最終來到我們的main函數。

下面是Windows上,從創建進程到我們的main函數的完整流程(高清大圖:https://bbs.pediy.com/upload/attach/201604/501306_qz5f5hi1n3107kt.png):

 

責任編輯:武曉燕 來源: 編程技術宇宙
相關推薦

2021-03-18 09:06:17

函數MainJava

2022-05-26 23:36:36

SQLMySQL數據

2017-04-11 13:54:49

HTTPURLHTML

2022-04-28 07:52:05

HTTP瀏覽器

2023-11-02 08:00:00

ClickHouse數據庫

2017-05-04 10:54:08

大數據存儲數據分析

2025-06-30 09:26:47

2020-08-17 12:47:07

Mozilla裁員瀏覽器

2019-11-12 14:41:41

Redis程序員Linux

2010-02-07 09:00:29

AndroidLinux Kerne

2019-08-26 09:35:25

命令ping抓包

2021-01-18 08:23:23

內存時底層CPU

2021-04-11 10:40:16

Git軟件開發

2020-01-10 08:54:24

URLDNSTCP

2017-09-22 13:24:20

2023-08-29 16:26:20

Linux命令行

2015-07-03 09:27:43

網絡閏秒

2019-09-16 17:16:29

Hadoop數據湖數據結構

2022-06-03 08:12:52

InnoDB插入MySQL

2020-09-01 11:40:01

HTTPJavaTCP
點贊
收藏

51CTO技術棧公眾號

蜜桃av噜噜一区二区三区小说| 亚洲另类av| 亚洲动漫第一页| 久久国产精品-国产精品| 波多野结衣一区二区在线| 91九色精品国产一区二区| 日韩欧美一区二区视频| 日韩亚洲在线视频| 在线电影福利片| 久久久久久夜精品精品免费| 成人两性免费视频| 日韩三级视频在线| 色喇叭免费久久综合| 精品国产凹凸成av人导航| 99视频精品免费| 欧美aaa免费| 亚洲国产经典视频| 国产一区二区三区奇米久涩| 97在线视频人妻无码| 久久av在线| 国内精品久久久| 国产农村妇女精品一区| 日本妇女一区| 日韩欧美国产小视频| 爱情岛论坛亚洲首页入口章节| 99热国产在线| 国产精品女主播在线观看| 精品久久精品久久| www.久久综合| 狠狠网亚洲精品| 国产精品久久久久免费a∨| 日韩免费观看一区二区| 中文字幕一区二区三区久久网站| 尤物yw午夜国产精品视频| 影音先锋人妻啪啪av资源网站| 国产成人视屏| 欧美日韩欧美一区二区| 色婷婷综合久久久久中文字幕| 麻豆av在线播放| 亚洲欧美电影一区二区| 亚洲视频欧美在线| 国产视频网站在线| 久久久精品黄色| 美女一区视频| 亚洲 美腿 欧美 偷拍| 成人动漫在线一区| 国产精品久久精品视| www.蜜桃av.com| 国产精品一级在线| 亚洲va国产va天堂va久久| 亚洲一区二区三区网站| 蜜桃精品视频在线| 国产在线精品一区免费香蕉 | 亚洲欧美综合一区二区| 国产成人免费视| 成人黄色在线免费观看| 亚洲第一成年人网站| 国产高清不卡一区二区| 亚洲一区二区中文字幕| 精品久久久无码中文字幕| 国产一区二区久久| 成人国产一区二区| 亚洲av成人精品一区二区三区在线播放 | 日韩欧美高清视频| av免费在线播放网站| 精品欧美一区二区三区在线观看 | 欧美一区二区三区黄片| www.欧美.com| 免费在线观看一区二区| 韩国精品视频| 成人欧美一区二区三区白人| 色一情一乱一乱一区91| 成人性生交大片免费看在线播放| 亚洲无人区一区| 国产二区视频在线播放| 国产精品99| 日韩欧美国产麻豆| 疯狂揉花蒂控制高潮h| 国产探花在线精品一区二区| www.亚洲一区| 日本熟妇毛茸茸丰满| 国产精品久久久久久久久久妞妞| 国产精品第8页| 国产口爆吞精一区二区| k8久久久一区二区三区| 清纯唯美一区二区三区| 免费看美女视频在线网站| 亚洲综合色噜噜狠狠| 999香蕉视频| av一级久久| 亚洲欧美福利视频| 26uuu成人网| 亚洲综合99| 成人高h视频在线| 国产极品久久久| 91网站最新网址| 特级黄色录像片| 亚洲最大成人| 日韩一区二区麻豆国产| 亚洲av人人澡人人爽人人夜夜| 精品视频免费| 欧美精品aaa| 中文字幕a级片| 成人福利视频在线| 国产又黄又爽免费视频| 周于希免费高清在线观看 | 欧美一级淫片免费视频魅影视频| 国产视频一区在线播放| 国产美女主播在线| 欧美成人免费全部网站| 亚洲精品国产美女| 欧美国产日韩在线观看成人| 日韩高清中文字幕一区| 国产一区不卡在线观看| av网站免费在线观看| 91成人免费电影| 小毛片在线观看| 夜间精品视频| 国产精品自拍网| 国产在线观看黄| 五月激情六月综合| 乳色吐息在线观看| 欧美xxav| 国产精品免费看久久久香蕉| 嫩草精品影院| 婷婷综合久久一区二区三区| 无套内谢丰满少妇中文字幕| 日韩av片子| 国产成人欧美在线观看| 天堂中文字幕在线| 亚洲成人精品一区二区| 97超碰免费在线观看| 99久久综合| 国产精品一区二区久久久| 国产在线视频资源| 色哟哟精品一区| 国产精品三级在线观看无码| 1024日韩| 官网99热精品| 国内在线视频| 日韩欧美区一区二| 久久久国产精品人人片| 国产盗摄精品一区二区三区在线| 中文字幕一区二区三区四区五区六区| 亚洲精品一级二级| 亚洲欧美另类人妖| 在线精品免费视| 久久天天做天天爱综合色| 国产精品秘入口18禁麻豆免会员| 久久99精品久久久久久欧洲站 | 国产精品2020| 99久久综合精品| 国产男女在线观看| 夜夜春成人影院| 国产精品极品美女在线观看免费| 国产精品ⅴa有声小说| 欧美影院午夜播放| 国产又粗又猛又爽又黄的视频小说| 美腿丝袜一区二区三区| 一区二区三区四区五区视频| 欧美国产视频| 日韩视频免费中文字幕| 国产不卡av在线播放| 一区二区三区**美女毛片| 色综合久久久无码中文字幕波多| 亚洲第一黄网| 日韩欧美一区二区三区四区| 日本精品在线一区| 久久久精品一区二区| 亚洲av无码乱码国产麻豆| 亚洲国产精品人人做人人爽| 国产草草浮力影院| 日韩国产精品久久久| 中文字幕成人一区| 91免费精品国偷自产在线在线| 97视频在线观看成人| 超碰在线国产| 欧美一区二区三区在线看| 精品无码人妻一区二区三| 91免费观看视频| 在线观看国产中文字幕| 欧美日韩一卡| 欧美日韩在线观看一区| 婷婷成人av| 97超碰国产精品女人人人爽| yes4444视频在线观看| 欧美一区二区免费视频| 日本三级一区二区| 国产精品久久久久精k8| 在线看黄色的网站| 男男成人高潮片免费网站| 欧美在线观看黄| 国内精品久久久久久久久电影网| 51国偷自产一区二区三区的来源| 精精国产xxx在线视频app| 色偷偷综合社区| 欧美熟妇乱码在线一区| 欧美日韩国产影片| 久久亚洲精品国产| 亚洲卡通欧美制服中文| 精品国产av无码| 成人小视频在线| 一区二区xxx| 国产精品久久久亚洲一区| 一区二区三区|亚洲午夜| 欧美一区二区三区久久| 91欧美激情另类亚洲| 老司机成人影院| 久久久免费电影| 国产传媒在线播放| 一区二区三区视频免费在线观看| 日批视频在线播放| 91精品婷婷国产综合久久性色 | 日韩一区二区在线播放| 亚洲高清在线看| 精品久久久视频| 麻豆亚洲av成人无码久久精品| 国产欧美日韩综合| 中文字幕一区二区久久人妻网站 | 午夜一区不卡| 亚洲理论电影在线观看| 欧美~级网站不卡| 亚洲欧美99| 欧美日韩色图| 欧美 日韩 国产在线| 国内精品麻豆美女在线播放视频 | 国产情侣av在线| 欧美午夜精品一区二区蜜桃 | 日本三级韩国三级欧美三级| 日韩一区二区欧美| h网站视频在线观看| 亚洲区在线播放| 三级视频在线播放| 色综合天天爱| 久久久久久久久久久一区| 国产成人福利av| 粉嫩av四季av绯色av第一区| 日韩高清一区| 2014亚洲精品| 日韩中文字幕无砖| 91免费看网站| 9国产精品午夜| 99re视频在线观看| 66精品视频在线观看| 痴汉一区二区三区| caoporn成人免费视频在线| 亚洲综合在线小说| 日韩精品一区二区三区免费视频| 91视频8mav| 欧美日韩影视| 亚洲美女一区二区三区| 99自拍视频在线| 亚洲欧洲性图库| 老妇女50岁三级| 一区二区三区欧美在线观看| 久久黄色免费网站| 亚洲福利电影网| wwwwww国产| 日本乱人伦aⅴ精品| 亚洲精品国产精品国自产网站按摩| 日本乱码高清不卡字幕| 成人黄色激情视频| 欧美日本在线视频| 国产免费无遮挡| 日韩一区二区三区电影在线观看| 成人午夜免费福利| 亚洲精品一区在线观看香蕉| 国产黄色片在线观看| 日韩在线观看网站| 亚洲精品白浆| 欧美性受xxx| 国产情侣一区二区三区| 91免费版网站入口| 国产一区二区三区亚洲| 你懂的视频在线一区二区| 成人在线免费小视频| 可以在线看黄的网站| 亚洲伦伦在线| 在线观看的毛片| 国产精品一级片| 黄色正能量网站| 国产精品高潮久久久久无| 精品99在线观看| 色综合网站在线| 国产原创中文av| 亚洲精品理论电影| 中文字幕在线免费| 欧美黑人xxxx| 本网站久久精品| 国产精品视频免费一区| 日本a级不卡| 免费特级黄色片| 久久精品国产一区二区| 中国特级黄色大片| 国产清纯白嫩初高生在线观看91| 国产老头老太做爰视频| 欧美日韩一区二区在线| 国产乱码精品一区二三区蜜臂 | 日本成人免费视频| 亚洲精品成人少妇| 国产情侣小视频| 精品国产1区2区3区| 3d成人动漫在线| 91精品成人久久| 91麻豆精品一二三区在线| 久久精品五月婷婷| 中文字幕一区二区三区久久网站| 亚洲综合在线网站| 成人精品亚洲人成在线| 婷婷国产成人精品视频| 欧美小视频在线观看| av在线资源观看| 中文字幕精品av| 亚洲 精品 综合 精品 自拍| 亚洲免费av高清| 精品一区在线视频| 欧美日韩激情一区二区三区| 午夜视频免费在线| 色综合男人天堂| 高清久久一区| 亚洲资源视频| 丝袜亚洲另类欧美综合| 色婷婷精品久久二区二区密| 一区二区三区四区蜜桃| 一区二区三区免费在线| 一区二区三区视频在线| 欧美大电影免费观看| 精品九九九九| 日韩一级不卡| 精品视频站长推荐| 亚洲电影中文字幕在线观看| 午夜精品久久久久久久99热黄桃 | 青青草原国产免费| 日本不卡123| av手机在线播放| 日本精品视频一区二区| 青青草av免费在线观看| 97av在线影院| 日韩丝袜视频| www.com毛片| 久久综合九色综合97婷婷女人 | 亚洲欧美视频| 六十路息与子猛烈交尾| 性感美女久久精品| 空姐吹箫视频大全| 欧美激情一区二区三区在线视频观看| 精品一区二区三区亚洲| 超碰97在线看| 成人免费看视频| 中日韩精品视频在线观看| 亚洲第一视频网| 日本不卡网站| 日本不卡一区二区三区视频| 鲁大师成人一区二区三区| b站大片免费直播| 欧美性大战久久久| 免费av在线网站| 999热视频| 亚洲经典自拍| 欧美日韩高清丝袜| 欧美调教femdomvk| 精品国产99久久久久久| 91免费看网站| 亚洲在线黄色| 国产1区2区在线观看| 7777精品伊人久久久大香线蕉经典版下载| 黄色成人在线| 国产精品毛片一区视频| 免费在线欧美黄色| 国产wwwwxxxx| 欧美成人性福生活免费看| sm在线播放| 性刺激综合网| 国产电影一区二区三区| 精品欧美一区二区三区免费观看 | 国产一区在线观看免费| 日韩三级视频在线看| 性感女国产在线| 亚洲最大色综合成人av| 国产ts人妖一区二区| 欧美一区二区三区不卡视频| 久久天天躁狠狠躁夜夜躁| 精品三级av| 五月天婷婷亚洲| 午夜精品久久久久久久99樱桃| 成人精品一区二区| 99三级在线| 日本欧美一区二区三区乱码| 538精品在线观看| 亚洲免费av网址| 九九九九九九精品任你躁| 欧美黄色免费影院| 自拍偷拍欧美精品| 视频二区在线| 亚洲影院色在线观看免费| 美女尤物久久精品| 91视频免费在线看| 在线观看久久久久久| xxxxxhd亚洲人hd| 波多野结衣xxxx|