1. 程式人生 > >虛擬地址空間佈局和編譯連結執行原理

虛擬地址空間佈局和編譯連結執行原理

一、

利用中間層訪問實體記憶體,一是提高了記憶體使用效率和最優分配,二是提高了安全性。中間層又被稱作虛擬地址空間,由此一來,程式訪問的不再是實際的實體記憶體地址,而是訪問虛擬地址,作業系統再將虛擬地址對映到實體記憶體上;linux系統下虛擬地址空間是這樣劃分的:

.data段和.bss段統稱為資料段,不同之處為:

.data段存放已初始化且初始化不為0的資料

.bss段存放未初始化或初始化為0的資料

二、

編譯執行一個hello world.c程式,它會在很短的時間內輸出一個”hello world”,但是計算機把其中的幾個步驟隱藏了,並沒有像我們展示,分別是:預編譯-> .i、編譯-> .s、彙編-> .o、連線、生成可執行檔案-> .exe。

這幾個步驟的詳細工作為:

預編譯:

                   處理與編譯指令(#define  #include #if #elif )、新增行號和檔案表示、刪除註釋、#pragma

編譯:

           詞法分析、語法分析、語義分析、程式碼優化

彙編:

           把指令翻譯成二進位制

連結:

           合併段和符號表、符號解析、分配地址和空間、符號重定位

生成可執行檔案:

           建立虛擬地址空間到實體記憶體的對映(建立核心對映結構體)、建立頁目錄和頁表、

載入指令和資料、程式的入口地址寫入PC暫存器