<meter id="pryje"><nav id="pryje"><delect id="pryje"></delect></nav></meter>
          <label id="pryje"></label>

          新聞中心

          EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計應(yīng)用 > linux內(nèi)核中的__read_mostly變量

          linux內(nèi)核中的__read_mostly變量

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

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

          本文引用地址:http://www.ex-cimer.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

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


          關(guān)鍵詞: linux內(nèi)核read_mostly變

          評論


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

          關(guān)閉
          看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();