1. 程式人生 > >編譯完成後的目標檔案與虛擬地址空間

編譯完成後的目標檔案與虛擬地址空間

一、目標檔案的格式

       在Windows下可執行檔案的格式通常為 .exe ,在Linux下則為ELF格式,而目標檔案就是原始碼經過了編譯階段但沒有進行連結的中間檔案,它的檔案結構和內容與可執行檔案很相似,因此一一般和可執行檔案一起採用同一種格式儲存。動態連結庫和靜態連結庫都可以按照可執行檔案的格式儲存

二、目標檔案中資料儲存格式

       彙編階段完成後,指令被翻譯成二進位制形式。所有的程式碼被分別放進對應的段中。

       

  .text 段存放指令,.data段存放資料,那麼為什麼要將指令和資料分開儲存呢?.bss 段又有什麼作用呢?

  •    將指令和資料分開儲存是因為由真實模式進入到保護模式後,增加了一個虛擬地址空間以此來對資料進行保護,每一段程序對應的虛擬地址空間最終對映到真實的實體地址後,只能訪問給定的實體地址,無法越界訪問其它程序的實體地址。程式被裝載後,資料和指令分別被對映到虛擬地址空間上對應的段中,而我們段的劃分是按照許可權劃分的。.text段的資料是不被允許修改的,只能進行讀操作和執行,而 .data 段的資料則可讀可寫,分開儲存以免將指令修改。
  •  .bss 段中儲存的是未初始化的全域性變數、初始化為0的變數和區域性靜態變數(即弱符號),更準確的講,.bss 段為他們預留了空間並沒有真實儲存,只是在最終連結成可執行檔案的時候再在 .bss 段分配空間。

                                                  

上圖的右側為虛擬地址空間的示意圖。

    虛擬地址空間在進行到真實的實體記憶體上的對映時,要進行以下三個步驟:

  1. 建立核心結構對映體,建立頁目錄和頁表
  2. 載入指令和資料(以頁為單位載入)
  3. 程式的入口地址下一行指令暫存器中