新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > linux內核中的__read_mostly變量

        linux內核中的__read_mostly變量

        作者: 時間:2016-11-22 來源:網絡 收藏
        內核版本:2.6.14

        在閱讀socket源碼的時候,有如下一句(net/socket.c):

        本文引用地址:http://www.104case.com/article/201611/319987.htm

        [plain]view plaincopy
        print?
        1. staticstructvfsmount*sock_mnt__read_mostly;

        感覺__read_mostly很奇怪,就深入分析了一下。

        __read_mostly原語將定義為存放在.data.read_mostly段中。

        [plain]view plaincopy
        print?
        1. #ifdefined(CONFIG_X86)||defined(CONFIG_SPARC64)
        2. #define__read_mostly__attribute__((__section__(".data.read_mostly")))
        3. #else
        4. #define__read_mostly
        5. #endif

        由此可見,我們可以將經常需要被讀取的數據定義為 __read_mostly類型,這樣Linux內核被加載時,該數據將自動被存放到Cache中,以提高整個系統的執行效率。另一方面,如果所在的平臺沒有Cache,或者雖然有Cache,但并不提供存放數據的接口(也就是并不允許人工放置數據在Cache中),這樣定義為 __read_mostly類型的數據將不能存放在Linux內核中,甚至也不能夠被加載到系統內存去執行,將造成Linux 內核啟動失敗。
        解決的方法有兩種:
        1. 修改include/asm/cache.h中的__ready_mostly定義為:#define __read_mostly
        2. 修改arch/xxx/kernel/vmlinux.S,將.data.read_mostly段的位置到實際內存空間中去,例如放置在 .data段之后等等。
        此外,內核源碼通過CONFIG_X86)和(CONFIG_SPARC64)來判斷該怎樣定義__read_mostly,因此在arm中這個宏沒有意義。


        評論


        技術專區

        關閉
        主站蜘蛛池模板: 长岛县| 道真| 福贡县| 大英县| 将乐县| 泰来县| 永寿县| 涟源市| 精河县| 随州市| 嘉义市| 扎鲁特旗| 安仁县| 原阳县| 陆河县| 汉中市| 麻阳| 雷波县| 西华县| 浙江省| 通榆县| 稷山县| 西藏| 丽江市| 永新县| 密云县| 洱源县| 吉水县| 凤山市| 水城县| 鲜城| 张家界市| 沽源县| 漯河市| 民乐县| 灵石县| 高邮市| 江永县| 习水县| 革吉县| 阿坝|