庖丁解牛Linux核心
這一章節介紹了儲存程式計算機的結構以及關於彙編的基礎知識,由於之前看過re4b,所以權當複習了。
從硬體角度講,儲存程式計算機包括輸入、輸出、儲存、計算和控制五部分。
從程式設計師的角度,一個程式的執行過程就是CPU不斷從記憶體中獲取指令並執行的過程。從組合語言的角度可以比較清晰的看出計算機是如何執行程式的,當然,由於編譯器以及平臺的不同,使用高階語言編寫的程式可能會生成不同的彙編指令,這裡只針對linux 的x86系統,gcc編譯器。
實驗過程
main.c檔案:
int g(int x) { return x + 3; } int f(int x) { return g(x); } int main(void) { return f(8) + 1; }
main.s檔案(處理後):
該彙編指令頻繁使用了三個暫存器ebp, esp和eax。ebp是基址指標暫存器;esp是棧指標暫存器,通常指向棧頂;eax可以暫存資料,同時也作為函式返回值的預設儲存位置。
從main.s檔案中可以清楚的看到三個函式的彙編程式碼,其中有一段程式碼重複出現
pushl %ebp
movl %esp, %ebp
這段程式碼在出現在每個函式的初始部分,相當於儲存現場,與函式結束時的leave指令(恢復現場)相對應。
現在對程式碼執行過程中的棧情況進行分析。
高階語言對計算機的工作過程進行了抽象,通過分析對應的彙編程式碼,可以對計算機的工作過程有一個更為清晰的認識,看似複雜的過程,實際上只是CPU與記憶體之間重複性的互動過程,計算機將資料與程式碼分別儲存在資料段(DS)和程式碼段(CS)中,CPU按照EIP暫存器中儲存的指令地址,逐條獲取並執行CS中的指令,並將中間結果儲存在DS中。
--------------------------------------------------------------------------------------------------
by 陳秋陽
原創作品轉載請註明出處
《Linux核心分析》MOOC課程http://mooc.study.163.com/course/USTC-1000029000