可執行檔的裝載過程

來源:互聯網
上載者:User

        應用程式,其實就是一系列的指令,以及指令所操作的資料。為了執行這些指令,並通過指令操作資料,需要將應用程式檔案載入到記憶體中。然後從程式的入口開始逐條執行程式檔案中的指令。

        在介紹應用程式的裝載過程之前,需要先瞭解可執行檔映射到記憶體後的布局情況。應用程式的記憶體通常是按如下方式分布:

       

       
每個應用程式的邏輯記憶體在32位機器上共有4GB,只標出了進程的使用者態記憶體布局,在Linux系統下為0x000000000~0xBFFFFFFF(3GB),Windows為0x00000000~0x7FFFFFFFF(2GB)。

       
在中,“exec從程式檔案中讀到”的部分即作業系統從可執行檔載入到記憶體的內容。

              
本文部分:程式碼片段(.code或.text)、唯讀資料區段.rodata(代碼中通過const修飾的全域變數)

               
初始化的資料:資料區段(.data)。

 

       
程式碼片段也就是編譯時間產生的機器指令,應用程式運行時通過執行程式碼片段的指令,操作資料(包括.data、.rodata、.bss即未初始化的資料、以及堆和棧中的資料)。

 

       
作業系統在裝載應用程式時,主要分為三步:

       
1.      為進程分配虛擬記憶體(邏輯記憶體)

       
2.      建立虛擬記憶體與可執行檔的映射

               
以4K大小為單位,將虛擬記憶體地址與可執行檔的位移建立映射關係。

       
3.      將CPU的指令寄存器設定為應用程式的入口地址,啟動運行

 

       
在完成3步後,程式開始執行。啟動運行時將訪問虛擬記憶體的地址。但由於虛擬記憶體還沒有映射到實體記憶體,因此會觸發“頁中斷”。在發生頁中斷時,作業系統為虛擬記憶體分配實體記憶體,映射到此虛擬記憶體,然後根據此地址以及虛擬記憶體與可執行檔的映射關係,尋找到可執行檔的位移,然後將檔案的內容載入到實體記憶體中。

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.