Linux下常用的函數調用棧規範

來源:互聯網
上載者:User

 

我們都應該知道,進階語言的函數調用過程中,有“棧”這麼一個概念,被調用函數的局部變數是存放在棧中的,函數調用的參數也是通過棧傳遞的。那麼,調用函數是怎麼把各種資料壓入棧中,被調用函數又是怎麼對棧進行操作以擷取必要的資料呢?函數調用發生完畢之後,誰又負責清理這個棧?這就用到了函數調用棧規範!

函數調用棧規範是指編譯器的一中“約定”,他規定了調用者如何傳遞參數,被調用者如何擷取參數,調用完成後怎麼清理棧,怎麼傳遞傳回值等。編譯器在編譯器的時候遵循這種規範,從而使程式正確的執行。對於不同的編譯器,不同的進階語言,這種規範是不盡相同的。

在X86平台下的Linux核心中,常用的函數調用規範有:C,FastCall,Pascal等,下面簡單介紹下這幾種規範:

1、C規範

規定調用者將參數從右至左壓棧,傳回值通過EAX寄存器傳遞,如果傳回值超過32位,則使用EDX:EAX傳遞,最後由調用者負責清理棧。這個規範被大多數C編譯器遵守。

我們需要注意的是,由調用者負責清理堆棧,可以支援變參函數,比如我們所熟悉的printf函數。讓我們看個例子:

printf("%d, %d, %d\n", i, j, k);

這個語句的目的是調用一個printf函數。被調用的函數在編譯的時候並不知道自己將要被傳遞多少個函數,但是調用者知道。這個語句返彙編後大概的樣子如下:

 

pushl   $k  //偽彙編,將k入棧pushl   $jpushl   $ipush    $addr //addr為第一個參數的語句的地址call     printfaddl    $0x10, %esp

或者翻譯成: 

sub    $0x10, %esp //先申請棧空間mov   $addr, (%esp)mov   $i, 0x4(%esp)mov   $j, 0x8(%esp)mov   $k, 0xc(%esp)call    printfaddl   $0x10, %esp

實際上,第二種翻譯和第一種完成的功能基本一致,都是越右邊的參數越靠近棧底,因為棧是從高地址往低地址增長的,所以地址也就越高。printf函數被調用後,先讀棧頂的參數,也就是"%d, %d, %d\n",然後根據這個參數確定其他參數的個數,並向高地址尋找即可。

從上面的彙編代碼可以看出,

addl   $0x10, %esp

 

這條指令是負責清理棧的,他位於調用者種,他知道自己應該清理多大的棧。而在被調用者中,往往通過
ret   $n
這條指令來清理棧的,因為printf在編譯時間並不知道自己會被傳遞多少個參數,因此這個n也就不能確定,所以沒辦法在被調用者中清理棧。

2、FastCall

顧名思義,fastcall就是快速調用的意思。因為壓棧操作必須要訪存,對於一些經常被調用的參數簡單的小函數來說會有一定的開銷,因此可以通過寄存器傳參。以gcc為例,gcc使用fastcall的時候,預設從左至右的前兩個參數通過ECX和EDX兩個寄存器來傳遞,其他參數使用棧傳遞,但是可以通過__attribute__((regparm(n)))來控制可使用寄存器的數目,例如regparm(3)就表示前三個參數使用寄存器來傳遞,預設寄存器是EAX,ECX,EDX。傳回值傳遞和棧清理同C規範相同。

這種規範應該是對C規範的一種補充和最佳化,在linux核心中經常用到,比如系統調用。

3、Pascal

參數從左至右入棧,被調用者負責清理棧,傳回值通過EAX或EDX:EAX傳遞。

參考書目:《獨闢蹊徑品核心:Linux核心原始碼導讀》

 

From:www.spongeliu.com

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.