乙個普通的c程式經過預處理器、編譯器、彙編器和鏈結器後生成乙個可執行的目標檔案,它由最初的一段ascii文字檔案轉化成為乙個二進位制檔案,且這個二進位制檔案包含引導程式到記憶體並執行它所需的所有資訊。
程序在執行時為c程式提供了乙個通用的執行時儲存器映像。
linux將這個執行時儲存器映像組織成若干段的集合,它主要有兩部分:程序虛擬儲存器、核心虛擬儲存器。程序虛擬儲存器有我們熟悉的**段、資料段、執行時堆、共享庫段、使用者棧。核心虛擬儲存器包括核心中的**和資料結構、與程序相關的資料結構。以32位系統的可執行檔案的執行時儲存器映像來說:
l **段總是從位址0x08048000處開始,它儲存編譯程式的機器**
l data段在接下來的乙個4kb對齊的位址處,儲存已初始化的全域性c變數和靜態變數
l bss段記錄的是未初始化的全域性c變數,事實上它並不佔據目標檔案的任何空間,只是乙個佔位符
l 執行時堆在接下來的第乙個4kb對齊的位址處,通過呼叫malloc庫向上增長,用於程式的動態記憶體管理
l 共享庫段,用於載入共享庫、對映共享記憶體和檔案i/o,使用mmap和unmap函式申請和釋放新的記憶體區
l 使用者棧佔據程序位址空間的最高部分,並向下增長,用於存放呼叫過程中的區域性變數、函式返回位址、引數
l 核心**和資料、物理儲存器,它們均被對映到所有程序共享的物理頁面,這就為核心提供乙個便利的方法來訪問記憶體中任何特定的位置。對於每個程序來說他們均是一樣的
l 最頂層的核心位址空間包括了與程序有關的資料結構,如頁表、核心在程序的上下文結構task_struct和mm結構,核心棧
**測試如下:
#include
#include
int glob1=120;
int glob2;
extern int etext,edata,end;
int func2()
int func1()
int main()
輸出如下:
結果看出這是乙個執行在64位機器上的程式(64位的**段總是從0x400000),函式位址main,func1,func2的位址均在**區域中,全域性變數glob1的位址在初始化資料區中,全glob2的位址在未初始化資料區中,指標遍歷dyn_addr的值在堆區域中,區域性變數m_local1、m_local2、f1_local1、f1_local2、f2_local1、f2_local2依次存放在棧(並且可知棧的增長方向是從高位址到低位址,堆的增長方向是從低位址到高位址)
乙個普通的c程式經過預處理器、編譯器、彙編器和鏈結器後生成乙個可執行的目標檔案,它由最初的一段ascii文字檔案轉化成為乙個二進位制檔案,且這個二進位制檔案包含引導程式到記憶體並執行它所需的所有資訊。
程序在執行時為c程式提供了乙個通用的執行時儲存器映像。
linux將這個執行時儲存器映像組織成若干段的集合,它主要有兩部分:程序虛擬儲存器、核心虛擬儲存器。程序虛擬儲存器有我們熟悉的**段、資料段、執行時堆、共享庫段、使用者棧。核心虛擬儲存器包括核心中的**和資料結構、與程序相關的資料結構。以32位系統的可執行檔案的執行時儲存器映像來說:
l **段總是從位址0x08048000處開始,它儲存編譯程式的機器**
l data段在接下來的乙個4kb對齊的位址處,儲存已初始化的全域性c變數和靜態變數
l bss段記錄的是未初始化的全域性c變數,事實上它並不佔據目標檔案的任何空間,只是乙個佔位符
l 執行時堆在接下來的第乙個4kb對齊的位址處,通過呼叫malloc庫向上增長,用於程式的動態記憶體管理
l 共享庫段,用於載入共享庫、對映共享記憶體和檔案i/o,使用mmap和unmap函式申請和釋放新的記憶體區
l 使用者棧佔據程序位址空間的最高部分,並向下增長,用於存放呼叫過程中的區域性變數、函式返回位址、引數
l 核心**和資料、物理儲存器,它們均被對映到所有程序共享的物理頁面,這就為核心提供乙個便利的方法來訪問記憶體中任何特定的位置。對於每個程序來說他們均是一樣的
l 最頂層的核心位址空間包括了與程序有關的資料結構,如頁表、核心在程序的上下文結構task_struct和mm結構,核心棧
**測試如下:
#include
#include
int glob1=120;
int glob2;
extern int etext,edata,end;
int func2()
int func1()
int main()
輸出如下:
結果看出這是乙個執行在64位機器上的程式(64位的**段總是從0x400000),函式位址main,func1,func2的位址均在**區域中,全域性變數glob1的位址在初始化資料區中,全glob2的位址在未初始化資料區中,指標遍歷dyn_addr的值在堆區域中,區域性變數m_local1、m_local2、f1_local1、f1_local2、f2_local1、f2_local2依次存放在棧(並且可知棧的增長方向是從高位址到低位址,堆的增長方向是從低位址到高位址)
《memory management in c: the heap and the stack》
nginx lua 執行階段
nginx 處理請求的過程一共劃分為 11 個階段,按照執行順序依次是 rewrite access 和 content 這三個最為常見的 nginx 請求處理階段 ngx.lua的執行階段 ngx realip 模組究竟有什麼實際用途呢?為什麼我們需要去改寫請求的 位址呢?答案是 當 nginx ...
RTTI 執行階段型別識別
rtti是執行階段型別識別 c 有3個支援rtti的元素 dynamic cast 如可能,使用乙個指向基類的指標生成派生類指標,否則返回空指標 typeid 返回乙個指出物件型別的值 type info 結構儲存了有關特定型別的資訊 只能將rtti用於包含虛函式的類層次結構 dynamic cas...
OpenResty 核心執行階段篇
前兩篇分別介紹了openresty核心概念和,優勢與架構等資訊,進行本篇之前建議至少 一遍。之前篇章介紹了openresty是基於nginx為基礎核心的開發平台,本篇將繼續介紹基礎平台 nginx 的主要特性。openresty將應用分為 個大階段,11個小階段,如下圖所示。開發中常用的7階段 ro...