<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>

新聞中心

EEPW首頁(yè) > 嵌入式系統 > 設計應用 > Arm-Linux二級頁(yè)表的問(wèn)題

Arm-Linux二級頁(yè)表的問(wèn)題

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

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

本文引用地址:http://dyxdggzs.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è)新申請的二級頁(yè)表與PMD關(guān)聯(lián)起來(lái)。在這之前,pmdp指向的PMD項是空的,當前的過(guò)程正是在為它建立映射。在調用這個(gè)函數之前,已經(jīng)申請好了一張4K大小的二級頁(yè)表。

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

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

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

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

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

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

正是把第二張硬件表的對應的PMD值寫(xiě)到接下來(lái)的一個(gè)PMD表項中去。

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



關(guān)鍵詞: ArmLinux二級頁(yè)

評論


技術(shù)專(zhuān)區

關(guān)閉
国产精品自在自线亚洲|国产精品无圣光一区二区|国产日产欧洲无码视频|久久久一本精品99久久K精品66|欧美人与动牲交片免费播放
<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>