在线看毛片网站电影-亚洲国产欧美日韩精品一区二区三区,国产欧美乱夫不卡无乱码,国产精品欧美久久久天天影视,精品一区二区三区视频在线观看,亚洲国产精品人成乱码天天看,日韩久久久一区,91精品国产91免费

<menu id="6qfwx"><li id="6qfwx"></li></menu>
    1. <menu id="6qfwx"><dl id="6qfwx"></dl></menu>

      <label id="6qfwx"><ol id="6qfwx"></ol></label><menu id="6qfwx"></menu><object id="6qfwx"><strike id="6qfwx"><noscript id="6qfwx"></noscript></strike></object>
        1. <center id="6qfwx"><dl id="6qfwx"></dl></center>

            新聞中心

            EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > linux內(nèi)核中的fastcall和asmlinkage宏

            linux內(nèi)核中的fastcall和asmlinkage宏

            作者: 時(shí)間:2016-11-22 來源:網(wǎng)絡(luò) 收藏
            內(nèi)核版本:2.6.14

            linux內(nèi)核中我們都會(huì)經(jīng)常見到FASTCALL和armlinkage,它們各有什么不同呢?下面我們來具體分析一下。

            本文引用地址:http://www.biyoush.com/article/201611/319989.htm

            在標(biāo)準(zhǔn)C系中函數(shù)的形參在實(shí)際傳入?yún)?shù)的時(shí)候會(huì)涉及到參數(shù)存放的問題,那么這些參數(shù)存放在哪里呢?對(duì)x86比較了解的話,應(yīng)該知道這些函數(shù)參數(shù)和函數(shù)內(nèi)部局部變量一起被分配到了函數(shù)的局部堆棧中。linux操作系統(tǒng)支持多種CPU架構(gòu),比如x86、ppc和arm等,在不同的處理器結(jié)構(gòu)上不能保證都是通過 局部棧傳遞參數(shù)的。ARM對(duì)函數(shù)調(diào)用過程中的傳參定義了一套規(guī)則,即 ATPCS,規(guī)則中明確指出ARM中R0-R4都是作為通用寄存器使用,在函數(shù)調(diào)用時(shí)處理器從R0-R4中獲取參數(shù),在函數(shù)返回時(shí)再 將需要返回的參數(shù)一次存到R0-R4中,也就是說可以將函數(shù)參數(shù)直接存放在寄存器中,所以為了嚴(yán)格區(qū)別函數(shù)參數(shù)的存放位置,引入了兩個(gè)標(biāo)記,即 asmlinkage和FASTCALL,前者表示將函數(shù)參數(shù)存放在局部棧中,后者則是通知編譯器將函數(shù)參數(shù)用寄存器保存起來。

            1.x86平臺(tái)

            [plain]view plaincopy
            print?
            1. #defineasmlinkageCPP_ASMLINKAGE__attribute__((regparm(0)))
            2. #defineFASTCALL(x)x__attribute__((regparm(3)))
            3. #definefastcall__attribute__((regparm(3)))

            函數(shù)定義前加宏asmlinkage,表示這些函數(shù)通過堆棧而不是通過寄存器傳遞參數(shù)。gcc編譯器在匯編過程中調(diào)用c語言函數(shù)時(shí)傳遞參數(shù)有兩種方法:一種是通過堆棧,另一種是通過寄存器。缺省時(shí)采用寄存器,假如你要在你的匯編過程中調(diào)用c語言函數(shù),并且想通過堆棧傳遞參數(shù),你定義的c函數(shù)時(shí)要在函數(shù)前加上宏asmlinkage。

            其中 __attribute__是關(guān)鍵字,是gcc的c語言擴(kuò)展。__attribute__機(jī)制是GNU C的一大特色,它可以設(shè)置函數(shù)屬性、變量屬性和類型屬性等??梢酝ㄟ^它們向編譯器提供更多數(shù)據(jù),幫助編譯器執(zhí)行優(yōu)化等。
            __attribute__((regparm(0))):告訴gcc編譯器該函數(shù)不需要通過任何寄存器來傳遞參數(shù),參數(shù)只是通過堆棧來傳遞。
            __attribute__((regparm(3))):告訴gcc編譯器這個(gè)函數(shù)可以通過寄存器傳遞多達(dá)3個(gè)的參數(shù),這3個(gè)寄存器依次為EAX、EDX 和 ECX。更多的參數(shù)才通過堆棧傳遞。這樣可以減少一些入棧出棧操作,因此調(diào)用比較快。
            asmlinkage大都用在系統(tǒng)調(diào)用中。有一些情況下是需要明確的告訴編譯器,我們是使用stack來傳遞參數(shù)的,比如x86中的系統(tǒng)調(diào)用,是先將參數(shù)壓入stack以后調(diào)用sys_*函數(shù)的,所以所有的sys_*函數(shù)都有asmlinkage來告訴編譯器不要使用寄存器來編譯。

            2.arm平臺(tái)

            對(duì)于arm處理器的,沒有定義FASTCALL和armlinkage,所以沒有意義(對(duì)于ARM平臺(tái)來說,要符合ATPCS過程調(diào)用標(biāo)準(zhǔn),即通過寄存器傳遞的。ARM中R0-R4用于存放傳入?yún)?shù),所有函數(shù)的參數(shù)不應(yīng)該大于5個(gè),如果超過5個(gè),多余的參數(shù)被存放到局部棧中。)。

            [plain]view plaincopy
            print?
            1. #ifndefFASTCALL
            2. #defineFASTCALL(x)x
            3. #definefastcall
            4. #endif
            5. #ifndefasmlinkage
            6. #defineasmlinkageCPP_ASMLINKAGE
            7. #endif

            3.CPP_ASMLINKAGE

            [plain]view plaincopy
            print?
            1. #ifdef__cplusplus
            2. #defineCPP_ASMLINKAGEextern"C"
            3. #else
            4. #defineCPP_ASMLINKAGE
            5. #endif

            extern "C" 包含雙重含義,從字面上即可得到:首先,被它修飾的目標(biāo)是“extern”的;其次,被它修飾的目標(biāo)是“C”的。
             ?。?) 被extern "C"限定的函數(shù)或變量是extern類型的extern是C/C++語言中表明函數(shù)和全局變量作用范圍(可見性)的關(guān)鍵字,該關(guān)鍵字告訴編譯器,其聲明的函數(shù)和變量可以在本模塊或其它模塊中使用。與extern對(duì)應(yīng)的關(guān)鍵字是static,被它修飾的全局變量和函數(shù)只能在本模塊中使用。因此,一個(gè)函數(shù)或變量只可能被本模塊使用時(shí),其不可能被extern “C”修飾。
             ?。?) 被extern "C"修飾的變量和函數(shù)是按照C語言方式編譯和連接的。



            評(píng)論


            技術(shù)專區(qū)

            關(guān)閉