LINUX內核分析第七週學習總結

LINUX內核分析第七週學習總結

標籤(空格分隔): 20135328陳都linux


陳都 原創做品轉載請註明出處 《Linux內核分析》MOOC課程 http://mooc.study.163.com/course/USTC-1000029000shell

可執行程序的裝載

1.可執行程序時如何產生的

  • 編譯器預處理
gcc -E -o XX.cpp XX.c (-m32)//.cpp是預處理文件
  • 彙編器編譯成彙編代碼
gcc -x cpp-output -S -o hello.s hello.cpp (-m32)//.s是彙編代碼
  • 彙編代碼編譯成二進制目標文件(不可讀,含有部分機器代碼但不可執行)
gcc -x assembler -c hello.s -o hello.o (-m32)
  • 連接成可執行文件
gcc -o hello.static hello.c (-m32) -static

2.目標文件格式ELF

目標文件三種形式

  1. 可重定位文件(用來和其餘object文件一塊兒建立下面兩種文件)——.o文件
  2. 可執行文件(指出了應該從哪裏開始執行)
  3. 共享文件(主要是.so文件,用來被連接編輯器和動態連接器鏈)

ELF格式:


左半邊是ELF格式,右半邊是執行時的格式
其中,ELF頭描述了該文件的組織狀況,程序投標告訴系統如何建立一個進程的內存映像,section頭表包含了描述文件sections的信息。
當系統要執行一個文件的時候,理論上講,他會把程序段拷貝到虛擬內存中某個段編輯器

裝載可執行程序以前的工做

可執行程序的執行環境

通常咱們執行一個程序的Shell環境,咱們的實驗直接使用execve系統調用。
Shell自己不限制命令行參數的個數,命令行參數的個數受限於命令自身
例如,int main(int argc, char *argv[])
又如, int main(int argc, char argv[], char envp[])//envp是shell的執行環境
Shell會調用execve將命令行參數和環境參數傳遞給可執行程序的main函數函數

int execve(const char * filename,char * const argv[ ],char * const envp[ ]);

裝載時動態連接和運行時動態連接應用

動態連接分爲可執行程序裝載時動態連接和運行時動態連接(通常使用前者)學習

實驗過程



總結:Linux內核如何裝載和啓動一個可執行程序:

  1. 建立新進程
  2. 新進程調用execve()系統調用執行指定的ELF文件
  3. 調用內核的入口函數sys_execve(),sys_execve()服務例程修改當前進程的執行上下文;當ELF被load_elf_binary()裝載完成後,函數返回至do_execve()在返回至sys_execve()。ELF可執行文件的入口點取決於程序的連接方式:
  4. 靜態連接:elf_entry就是指向可執行文件裏邊規定的那個頭部,即main函數處。
  5. 動態連接:可執行文件是須要依賴其它動態連接庫,elf_entry就是指向動態連接器的起點。
    多進程、多用戶、虛擬存儲的操做系統出現之後,可執行文件的裝載過程變得很是複雜。引入了進程的虛擬地址空間;而後根據操做系統如何爲程序的代碼、數據、堆、棧在進程地址空間中分配,它們是如何分佈的;最後以頁映射的方式將程序映射進程虛擬地址空間。

相關文章
相關標籤/搜索