kernel barrier 定義說明

#ifndef barrier
# define barrier() __memory_barrier()
#endif

  這裏表示如果沒有定義barrier函數,則定義barrier()函數爲__memory_barrier()。但在內核代碼裏,是會包含 compiler-gcc.h這個文件的,所以在這個文件裏,定義barrier()爲__asm__ __volatile__("": : :"memory")。barrier翻譯成中文就是屏障的意思,在這裏,爲什麼要一個屏障呢?這是因爲CPU在執行的過程中,爲了優化指令,可能會對部分指令以它自己認爲最優的方式進行執行,這個執行的順序並不一定是按照程序在源碼內寫的順序。編譯器也有可能在生成二進制指令的時候,也進行一些優化。這樣就有可能在多CPU,多線程或是互斥鎖的執行中遇到問題。那麼這個內存屏障可以看作是一條線,內存屏障用在這裏,就是爲了保證屏障以上的操作,不會影響到屏障以下的操作。然後再看看這個屏障怎麼實現的。__asm__表示後面的東西都是彙編指令,當然,這是一種在C語言中嵌入彙編的方法,語法有其特殊性,__volatile__表示不對此處的彙編指令做優化,這樣就會保證這裏代碼的正確性。""表示這裏是個空指令,那麼既然是空指令,則所對應的指令所需要的輸入與輸出都沒有。在gcc中規定,如果以這種方式嵌入彙編,如果輸出沒有,則需要兩個冒號來代替輸出操作數的位置,所以需要加兩個::,這時的指令就爲"" : :。然後再加上爲分隔輸入而加入的冒號,再加上空的輸入,即爲"" : : :。後面的memory是gcc中的一個特殊的語法,加上它,gcc編譯器則會產生一個動作,這個動作使gcc不保留在寄存器內內存的值,並且對相應的內 存不會做存儲與加載的優化處理,這個動作不產生額外的代碼,這個行爲是由gcc編譯器來保證完成的

發佈了53 篇原創文章 · 獲贊 40 · 訪問量 46萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章