1. 程式人生 > >庖丁解牛Linux核心

庖丁解牛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