Linux作業系統分析(3)- 核心裝載ELF的過程總結

來源:互聯網
上載者:User

學號: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可執行檔裝載完成。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.