<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è) > 嵌入式系統 > 設計應用 > ARMLinux的TLB miss處理過(guò)程

ARMLinux的TLB miss處理過(guò)程

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

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

本文引用地址:http://dyxdggzs.com/article/201611/317222.htm

這里關(guān)心的是關(guān)閉hardware pagetable walk后,再發(fā)生TLB miss后的處理例程。如果發(fā)生這種情況,ARM CPU會(huì )發(fā)出一個(gè)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.見(jiàn)cortex-A15TRM p 5-5)。OS處理該異常的流程如下。

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

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

//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中存儲的是一個(gè)32位數,其中某些位表明異常類(lèi)型等(參考Cortex-A15TRM p4-76)

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

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

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

//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中存儲的是一個(gè)32位數,其中某些位表明異常類(lèi)型等(參考Cortex-A15 TRM p4-76)

剩余的工作就是根據以上兩個(gè)寄存器提取出來(lái)的信息,調用相應函數(do_PrefetchAbort——>do_page_fault)進(jìn)行處理。



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

評論


技術(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>