新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > Arm-Linux二級頁表的問題

        Arm-Linux二級頁表的問題

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

        在do_page_fault()過程中,有下面函數會被調到:

        本文引用地址:http://www.104case.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] 

        它的功能是把在這一個新申請的二級頁表與PMD關聯起來。在這之前,pmdp指向的PMD項是空的,當前的過程正是在為它建立映射。在調用這個函數之前,已經申請好了一張4K大小的二級頁表。

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

        首先先看一張二級頁表有多大,arm-linux采用的是粗粒度二級頁表映射,使用這種一映射關系,一個PMD表項下面映射/覆蓋1M內存,一個PTE項下面映射/覆蓋4K內存,所以一張二級表應該有1M/4K=256個表項。而一個二級表項是4字節,所以一張二級表應該占用空間256*4=1K字節。一個4K的內存頁可以容納4張二級表。

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

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

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

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

        正是把第二張硬件表的對應的PMD值寫到接下來的一個PMD表項中去。

        這個函數實際上是完成了兩張二級表的映射。



        關鍵詞: ArmLinux二級頁

        評論


        技術專區

        關閉
        主站蜘蛛池模板: 峨山| 黑龙江省| 镇远县| 桐庐县| 晋江市| 阿拉善左旗| 巴中市| 舞钢市| 通州区| 苍梧县| 阿拉善右旗| 新沂市| 陆良县| 林西县| 平顶山市| 丰县| 五莲县| 南雄市| 镇平县| 利津县| 佛山市| 湖州市| 浦东新区| 开原市| 河北区| 垫江县| 修武县| 缙云县| 珲春市| 宣武区| 宣汉县| 南澳县| 焉耆| 长顺县| 自治县| 东丰县| 富源县| 泾源县| 白山市| 齐河县| 兰坪|