學號:sa×××310 姓名:××濤
通過上面一些對進程的學習和一些代碼的驗證,我們對Linux下的進程方面的知識有了一個很好的瞭解。
相關的文章:
進程式控制制
Linux作業系統分析(2)- 進程的建立與可執行程式的載入
下面來簡單總結一些核心裝載ELF的過程總結。
簡單的說,整個流程分為三步:
1)建立一個獨立的虛擬位址空間;
2)讀取可執行檔頭,並且建立虛擬空間與可執行檔的映射關係;
3)將cpu的指令寄存器設定成可執行檔的入口地址。
過程的基本流程如
首先,在使用者層,bash進程會調用fork()系統調用建立一個新的進程,然後新的進程調用exeve()系統調用執行制定的ELF檔案,原先的bush進程繼續返回等待剛才啟動的新進程結束,然後繼續等待命令輸入。
exeve系統調用的原型如下:
int exeve(const char *filename, char *constt argv[], char *const envp[]);
三個參數分別是被執行的程式檔案名稱,執行參數和環境變數。
在進入exeve()系統調用之後,Linux核心就開始進行真正的裝載工作。在核心中,execve()系統調用相應的入口是sys_execve(), sys_execve進行一些參數的檢查複製之後,調用do_execve (),doexecve()會首先尋找被執行的檔案,如果找到檔案,則讀取檔案的前128個位元組,之後調用scarch_binary_handle ()去搜尋和匹配何時的可執行檔裝載處理過程,對於ELF檔案,相應的載入過程就是load_elf_binary().它的主要步驟是:
1)檢查ELF可執行檔格式的有效性,比如魔數等;
2)尋找動態連結的“.interp”端,設定動態連結路徑;
3)根據ELF課執行檔案的程式投標的描述,對ELF檔案進行映射,比如代數、資料、唯讀資料;
4)初始化ELF進程環境;
5)將系統調用的返回地址修改成ELF可執行檔的入口,這個進入點取決於程式的連結方式,對於靜態連結的可執行檔,這個程式進入點就是ELF檔案的檔案頭中e_entry所指地址;對於動態連結的ELF可執行檔,程式進入點就是動態連結器。
當load_elf_binary()執行完畢,返回至do_execve()再返回至sys_execve()時,第五步中已經把系統調用的返回地址改成了被裝載的ELF程式的入口地址了。所以當sys_execve()系統調用從核心態返回到使用者態時,eip寄存器直接跳轉到ELF程式的入口地址,於是新的程式開始執行,ELF可執行檔裝載完成。