进程的创建与可执行程序的加载
SA1***6*69??? 張*銘
實驗環境:ubuntu 12.04 LTS
????? 當在Linux下編寫一個源程序,經過編譯鏈接之后生成可執行程序,在終端shell命令行下輸入./(可執行程序的名字)來執行的過程,實際上是shell創建一個子進程,在子進程中加載可執行程序進行執行的過程,具體的子進程加載可執行程序之前的準備工作過程以及fork、exec的工作原理分別在
??????????????????????????? Linux操作系統學習_用戶進程之由新進程創建到可執行程序的加載
??????????????????????????????????????????Linux操作系統學習_用戶進程之fork()與exec函數族篇
1、task_struct進程控制塊
????? 為了管理進程,內核必須對每個進程所做的事情進行清楚的描述,這正是進程描述符的作用。進程描述符都是task_struct類型結構,它的字段包含了與一個進程相關的所有信息。當一個進程被創建時,系統就為該進程建立一個task_struct任務結構體。當進程運行結束時,系統撤消該進程的任務結構體。進程的任務結構體是進程存在的唯一標志。Linux在內存空間中開辟了一個專門的區域存放所有進程的任務結構體。
????????????????????????????????????????
2、ELF文件格式與進程地址空間的聯系
? ? ? ELF文件的結構如下圖:
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?? ???
????? 關于ELF Header,即ELF文件頭其作用這里不再贅述,上面Linux操作系統學習_用戶進程之由新進程創建到可執行程序的加載一文中已有闡述。.text單元中主要存儲的是ELF文件的程序正文部分。.data單元存儲的是已經初始化了的數據。.bss單元中存儲的主要是未初始化的數據。
????? 進程地址空間中的存儲區情況:
?????????????????????????????? ?? ????????
????? 可以看到堆是向上增長的,而棧是向下增長的。
????? 所以,在加載可執行文件時,ELF文件中的ELF文件頭和程序正文區域.text會映射到存儲區域的相應的程序文件區中,而ELF文件的數據區,包括已初始化的數據和未初始化的數據會分別映射到存儲區域的.data區域和.bss區域。而鏈接時的庫文件則主要映射到存儲區域中的存儲器映射區域。
3、動態鏈接庫在ELF文件格式中與進程地址空間中的表現形式
????? 調用定義好的函數,然后再用連接器與函數庫連接。這樣產生的可執行文件就會很大。因為連接器把程序需要用的所有函數的代碼都復制到了可執行文件中去了。這種連接方式就是所謂的靜態連接,與之相對的就是動態連接。連接器在可執行文件中標記出程序調用外部函數的位置,并不把代碼復制進去,只是標出函數在動態連接庫中的位置。用這樣的方式生成的特殊可執行文件就是動態連接。在運行這種動態程序時,系統在運行時把該程序調用的外部函數地址映射到程序地址,系統有一個程序叫做動態連接器,用以完成動態鏈接過程。動態連接器是由ELF可執行文件中的.interp段來指定的,該段的內容就是一個簡單的字符串。ELF可執行程序依賴的動態鏈接庫保存在ELF的.dynamic段中。??
????? 可以看到libc文件即為程序forkexample2的動態鏈接庫,而ld文件即為相應的動態鏈接器。
????? 可以使用readelf命令來查看ELF文件相應的信息,-h選項查看前面提到的ELF文件頭的信息:
?????
????? Magic:字段是一個標識符,只要Magic字段是7f 45 4c 46 01 01 01 00 00 00 00 00 00 00 00 00的文件都是elf文件。Class:字段是表示elf的版本,這是一個32位的elf。Machine:字段是指出目標文件的平臺信息,這里是 Intel 80386平臺。其他的字段可以從其字面上看出它的意義,這里就不一一解釋了。
????? 可以使用-d選項查看ELF文件的.dynamic段中動態鏈接庫的信息:
?????
?????
轉載于:https://www.cnblogs.com/vampirem/archive/2013/05/30/3108973.html
總結
以上是生活随笔為你收集整理的进程的创建与可执行程序的加载的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 地形 凹陷
- 下一篇: functionclass[LeetCo