新聞中心

        EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計應(yīng)用 > ARMLinux的TLB miss處理過程

        ARMLinux的TLB miss處理過程

        作者: 時間:2016-11-10 來源:網(wǎng)絡(luò) 收藏
        在ARM架構(gòu)下,TLB miss后的工作絕大多數(shù)情況是由hardwarepage table walk完成,特殊情況下hardware page table walk可以被關(guān)閉,此時發(fā)生TLB miss后CPU就會產(chǎn)生一個translationfault,剩下的工作由OS接管,完成對于translation fault的異常處理。

        默認(rèn)情況下,發(fā)生TLB miss后,hardware page table walk自動啟動開始掃描內(nèi)存中的pagetable,若找到相應(yīng)PTE(page table entry),則自動完成TLB entry的重填工作;如果找不到,則發(fā)出一個page fault異常,然后OS接管處理page fault。內(nèi)核中有do_page_fault函數(shù),該函數(shù)從硬盤中調(diào)換頁面進(jìn)內(nèi)存,更新頁表,然后重新執(zhí)行發(fā)生TLB miss的那條指令,hardware page table walk重新執(zhí)行,完成TLB重填的工作。

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

        這里關(guān)心的是關(guān)閉hardware pagetable walk后,再發(fā)生TLB miss后的處理例程。如果發(fā)生這種情況,ARM CPU會發(fā)出一個translation fault(If translation table walksare disabled, for example, PD0 or EPD0 is set to 1 for TTBR0, or PD1 or EPD1 isset to 1 for TTBR1, the processor returns a Translation fault.見cortex-A15TRM p 5-5)。OS處理該異常的流程如下。

        首先發(fā)生translation fault后,CPU會發(fā)出一個abort異常,然后跳轉(zhuǎn)到該異常地址處(以發(fā)生指令預(yù)取中止異常為例,跳轉(zhuǎn)到0x00000010)去執(zhí)行,該地址處存放的是一個跳轉(zhuǎn)指令 (W(b) vector_pabt +stubs_offset),然后,通過判斷,若發(fā)生該異常的指令處于usr模式,則跳轉(zhuǎn)到__pabt_usr函數(shù)去執(zhí)行,該函數(shù)中有條跳轉(zhuǎn)指令bl CPU_PABORT_HANDLER,CPU_PABORT_HANDLER是個宏定義,對于ARMv7,該定義是:# define CPU_PABORT_HANDLER v7_pabort,

        v7_pabort函數(shù)中就讀取了IFSR和IFAR兩個寄存器的值:

        //pabort-v7.S

        /*

        *Function: v6_pabort

        *

        *Params : r0 = address of aborted instruction

        *

        *Returns : r0 = address of abort

        * : r1 = IFSR

        *

        *Purpose : obtain information about current prefetch abort.

        */

        .align 5

        ENTRY(v7_pabort)

        mrc p15,0, r0, c6, c0, 2 @ get IFAR

        mrc p15,0, r1, c5, c0, 1 @ get IFSR

        mov pc,lr

        ENDPROC(v7_pabort)

        IFAR中存儲了發(fā)生異常的指令地址,IFSR中存儲的是一個32位數(shù),其中某些位表明異常類型等(參考Cortex-A15TRM p4-76)

        剩余的工作就是根據(jù)以上兩個寄存器提取出來的信息,調(diào)用相應(yīng)函數(shù)(do_PrefetchAbort——>do_translation_fault)進(jìn)行處理。OS接管后的操作是(do_translation_fault函數(shù)),首先判斷發(fā)生TLBmiss的那條指令是用戶指令還是系統(tǒng)指令,如果是系統(tǒng)指令則剩余工作是對頁全局目錄(pgd),頁上級目錄(pud),頁中間目錄(pmd)進(jìn)行操作;如果是用戶指令,則調(diào)用do_page_fault函數(shù),剩下的工作就是page fault的處理過程,根據(jù)不同情況判斷,包括權(quán)限檢查,分配頁面,發(fā)送SIGSEGV信號給進(jìn)程,直接殺死進(jìn)程等。不管哪種操作,OS都沒有對TLB進(jìn)行重填。

        對于page fault的處理過程如下:在取數(shù)或者取指令時,發(fā)生指令或者數(shù)據(jù)的地址不存在的情況,則發(fā)生中止異常。

        以取指發(fā)生異常為例。發(fā)生指令預(yù)取中止異常后,CPU自動跳轉(zhuǎn)到0x0000000C(可配置成0xfffffffc,這里不考慮)去執(zhí)行,該地址處是一個跳轉(zhuǎn)指令(W(b) vector_pabt + stubs_offset),然后,通過判斷,若發(fā)生該異常的指令處于usr模式,則跳轉(zhuǎn)到__pabt_usr函數(shù)去執(zhí)行,該函數(shù)中有條跳轉(zhuǎn)指令bl CPU_PABORT_HANDLER,CPU_PABORT_HANDLER是個宏定義,對于ARMv7,該定義是:# defineCPU_PABORT_HANDLER v7_pabort,v7_pabort函數(shù)中就讀取了IFSR和IFAR兩個寄存器的值:

        //pabort-v7.S

        /*

        * Function: v6_pabort

        *

        * Params : r0 = address ofaborted instruction

        *

        * Returns : r0 = address of abort

        * : r1 = IFSR

        *

        * Purpose : obtain information aboutcurrent prefetch abort.

        */

        .align 5

        ENTRY(v7_pabort)

        mrc p15, 0, r0, c6, c0, 2 @ get IFAR

        mrc p15, 0, r1, c5, c0, 1 @ get IFSR

        mov pc, lr

        ENDPROC(v7_pabort)

        IFAR中存儲了發(fā)生異常的指令地址,IFSR中存儲的是一個32位數(shù),其中某些位表明異常類型等(參考Cortex-A15 TRM p4-76)

        剩余的工作就是根據(jù)以上兩個寄存器提取出來的信息,調(diào)用相應(yīng)函數(shù)(do_PrefetchAbort——>do_page_fault)進(jìn)行處理。



        關(guān)鍵詞: ARMLinuxTLBmiss處理過

        評論


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

        關(guān)閉
        主站蜘蛛池模板: 德格县| 枣阳市| 深圳市| 寿宁县| 安阳县| 德惠市| 周宁县| 鱼台县| 大理市| 育儿| 如皋市| 定远县| 肇东市| 余姚市| 大宁县| 丰台区| 石嘴山市| 屯门区| 黑水县| 汕头市| 永泰县| 临漳县| 天峨县| 泰兴市| 南涧| 万安县| 永康市| 涞水县| 拉萨市| 凤阳县| 云南省| 正定县| 胶州市| 彭州市| 萨嘎县| 酉阳| 乌兰察布市| 平遥县| 肃宁县| 海安县| 舟山市|