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

          新聞中心

          EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > Arm-Linux二級(jí)頁表的問題

          Arm-Linux二級(jí)頁表的問題

          作者: 時(shí)間:2016-11-09 來源:網(wǎng)絡(luò) 收藏
          以前,在一些文檔和代碼中看到過說arm-linux的二級(jí)頁表分為linux版本和硬件版本。一直覺得概念比較混亂,沒有仔細(xì)研究,今天終于遇到了這個(gè)問題,不得不學(xué)習(xí)一下了。

          在do_page_fault()過程中,有下面函數(shù)會(huì)被調(diào)到:

          本文引用地址:http://www.ex-cimer.com/article/201611/317851.htm
          [c]static inline void __pmd_populate(pmd_t *pmdp, unsigned long pmdval){pmdp[0] = __pmd(pmdval);pmdp[1] = __pmd(pmdval   256 * sizeof(pte_t));flush_pmd_entry(pmdp);}[/c] 

          它的功能是把在這一個(gè)新申請(qǐng)的二級(jí)頁表與PMD關(guān)聯(lián)起來。在這之前,pmdp指向的PMD項(xiàng)是空的,當(dāng)前的過程正是在為它建立映射。在調(diào)用這個(gè)函數(shù)之前,已經(jīng)申請(qǐng)好了一張4K大小的二級(jí)頁表。

          pmdp[0] = __pmd(pmdval); 這一行很容易理解,這是在把根據(jù)pte生成的PMD表項(xiàng)值賦值給PMD項(xiàng)。但是下面這一句是為什么呢?

          首先先看一張二級(jí)頁表有多大,arm-linux采用的是粗粒度二級(jí)頁表映射,使用這種一映射關(guān)系,一個(gè)PMD表項(xiàng)下面映射/覆蓋1M內(nèi)存,一個(gè)PTE項(xiàng)下面映射/覆蓋4K內(nèi)存,所以一張二級(jí)表應(yīng)該有1M/4K=256個(gè)表項(xiàng)。而一個(gè)二級(jí)表項(xiàng)是4字節(jié),所以一張二級(jí)表應(yīng)該占用空間256*4=1K字節(jié)。一個(gè)4K的內(nèi)存頁可以容納4張二級(jí)表。

          其次,關(guān)于二級(jí)頁表,不知為什么內(nèi)核要為一張二級(jí)頁表提供兩份版本(一個(gè)Linux版本,一個(gè)硬件版本)。而且兩個(gè)版本的表的位置關(guān)系定義得很別扭。看pgalloc.h中的一個(gè)注釋圖:

          從上(低地址)到下(高地址)分別是:第一張表的硬件版本、第二張表的硬件版本,第一張表的Linux版本、第二張表的Linux版本??梢?,同一張表的linux版本和硬件版本是不連續(xù)的,但兩張不同表的同一版本是連續(xù)的。我想,把這樣的4張表放在一起,正是為了向4K的頁面大小對(duì)齊,不至于浪費(fèi)空間。

          這樣,一切就都好理解了。上述函數(shù)中,接下來這一行:

          pmdp[1] = __pmd(pmdval 256 * sizeof(pte_t));

          正是把第二張硬件表的對(duì)應(yīng)的PMD值寫到接下來的一個(gè)PMD表項(xiàng)中去。

          這個(gè)函數(shù)實(shí)際上是完成了兩張二級(jí)表的映射。



          關(guān)鍵詞: ArmLinux二級(jí)頁

          評(píng)論


          技術(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); })();