投訴做網(wǎng)站的電話服務(wù)器域名查詢
文章目錄
- __read_mostly 介紹
- __read_mostly 在 linux 中的使用
- .data.read_mostly 介紹
__read_mostly 介紹
__read_mostly
是一個(gè)在Linux內(nèi)核編程中用到的宏定義,這是一個(gè)gcc編譯器的屬性,用于告訴編譯器此變量主要用于讀取,很少進(jìn)行寫(xiě)入,最好將此變量放在具有相同特性的變量附近。使用這個(gè)宏可以優(yōu)化程序在運(yùn)行時(shí)的緩存性能,因?yàn)樘幚砥鲿?huì)緩存經(jīng)常讀取的部分。
這個(gè)宏在arm gcc中和其他平臺(tái)的gcc編譯器中都有同樣的作用。
以下是一個(gè)簡(jiǎn)單的使用示例:
static int __read_mostly my_variable = 0;
在這個(gè)示例中,my_variable
被聲明為一個(gè)主要用于讀取的靜態(tài)變量。這意味著在大多數(shù)情況下,my_variable
的值將被讀取,而不是寫(xiě)入。通過(guò)這種方式,編譯器可以進(jìn)行一些優(yōu)化,提高代碼執(zhí)行的效率。
__read_mostly 在 linux 中的使用
在 arch/arm/kernel/process.c
中有如下定義:
unsigned logn stack_chk_guard __read_mostly
參考網(wǎng)上資料了解到 __read_mostly
修飾的變量放在定義為存放在 .data.read_mostly
段中。
#if defined(CONFIG_X86) || defined(CONFIG_SPARC64)
#define __read_mostly __attribute__((__section__(".data.read_mostly")))
#else
#define __read_mostly
#endif
Linux 內(nèi)核被加載時(shí),__read_mostly
修飾的數(shù)據(jù)將自動(dòng)被存放到 Cache 中,以提高整個(gè)系統(tǒng)的執(zhí)行效率。
如果所在的平臺(tái) 沒(méi)有 Cache,或者雖然有Cache,但并不提供存放數(shù)據(jù)的接口(也就是并不允許人工放置數(shù)據(jù)在Cache中),這樣定義為 __read_mostly
類型的數(shù)據(jù)將不能存放在Linux內(nèi)核中,甚至也不能夠被加載到系統(tǒng)內(nèi)存去執(zhí)行,將造成Linux 內(nèi)核啟動(dòng)失敗。
解決的方法有兩種:
- 修改
include/asm/cache.h
中的__ready_mostly
定義為:#define __read_mostly
- 修改
arch/xxx/kernel/vmlinux.S
,將.data.read_mostly
段的位置到實(shí)際內(nèi)存空間中去,例如放置在.data
段之后等等。
.data.read_mostly 介紹
.data.read_mostly
是Linux內(nèi)核中的一個(gè)特殊的數(shù)據(jù)段。這個(gè)段用于存放被__read_mostly
宏標(biāo)記的變量。這些變量主要用于讀取,很少進(jìn)行寫(xiě)入,所以將它們放在同一個(gè)區(qū)域可以優(yōu)化處理器的緩存性能。
在Linux內(nèi)核編譯過(guò)程中,GCC編譯器會(huì)根據(jù)__read_mostly
宏的標(biāo)記,將對(duì)應(yīng)的變量放在.data.read_mostly
數(shù)據(jù)段中。這樣,處理器在進(jìn)行內(nèi)存訪問(wèn)時(shí),可以把這個(gè)段的數(shù)據(jù)預(yù)先加載到緩存中,從而提高訪問(wèn)效率。
需要注意的是,使用__read_mostly
標(biāo)記并不意味著這個(gè)變量永遠(yuǎn)不會(huì)被寫(xiě)入,而只是一個(gè)優(yōu)化建議,指示編譯器這個(gè)變量在大部分時(shí)間里是被讀取的,寫(xiě)入操作相對(duì)較少。