ARMLinux的TLB miss处理过程

发布者:bdwhsc最新更新时间:2016-07-25 来源: eefocus关键字:ARMLinux  TLB  miss  处理过程 手机看文章 扫描二维码
随时随地手机看文章
在ARM架构下,TLB miss后的工作绝大多数情况是由hardwarepage table walk完成,特殊情况下hardware page table walk可以被关闭,此时发生TLB miss后CPU就会产生一个translationfault,剩下的工作由OS接管,完成对于translation fault的异常处理。

默认情况下,发生TLB miss后,hardware page table walk自动启动开始扫描内存中的pagetable,若找到相应PTE(page table entry),则自动完成TLB entry的重填工作;如果找不到,则发出一个page fault异常,然后OS接管处理page fault。内核中有do_page_fault函数,该函数从硬盘中调换页面进内存,更新页表,然后重新执行发生TLB miss的那条指令,hardware page table walk重新执行,完成TLB重填的工作。

这里关心的是关闭hardware pagetable walk后,再发生TLB miss后的处理例程。如果发生这种情况,ARM CPU会发出一个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处理该异常的流程如下。

首先发生translation fault后,CPU会发出一个abort异常,然后跳转到该异常地址处(以发生指令预取中止异常为例,跳转到0x00000010)去执行,该地址处存放的是一个跳转指令 (W(b) vector_pabt +stubs_offset),然后,通过判断,若发生该异常的指令处于usr模式,则跳转到__pabt_usr函数去执行,该函数中有条跳转指令bl CPU_PABORT_HANDLER,CPU_PABORT_HANDLER是个宏定义,对于ARMv7,该定义是:# define CPU_PABORT_HANDLER v7_pabort,

v7_pabort函数中就读取了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中存储了发生异常的指令地址,IFSR中存储的是一个32位数,其中某些位表明异常类型等(参考Cortex-A15TRM p4-76)

剩余的工作就是根据以上两个寄存器提取出来的信息,调用相应函数(do_PrefetchAbort——>do_translation_fault)进行处理。OS接管后的操作是(do_translation_fault函数),首先判断发生TLBmiss的那条指令是用户指令还是系统指令,如果是系统指令则剩余工作是对页全局目录(pgd),页上级目录(pud),页中间目录(pmd)进行操作;如果是用户指令,则调用do_page_fault函数,剩下的工作就是page fault的处理过程,根据不同情况判断,包括权限检查,分配页面,发送SIGSEGV信号给进程,直接杀死进程等。不管哪种操作,OS都没有对TLB进行重填。

对于page fault的处理过程如下:在取数或者取指令时,发生指令或者数据的地址不存在的情况,则发生中止异常。

以取指发生异常为例。发生指令预取中止异常后,CPU自动跳转到0x0000000C(可配置成0xfffffffc,这里不考虑)去执行,该地址处是一个跳转指令 (W(b) vector_pabt + stubs_offset),然后,通过判断,若发生该异常的指令处于usr模式,则跳转到__pabt_usr函数去执行,该函数中有条跳转指令bl CPU_PABORT_HANDLER,CPU_PABORT_HANDLER是个宏定义,对于ARMv7,该定义是:# defineCPU_PABORT_HANDLER v7_pabort,v7_pabort函数中就读取了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中存储了发生异常的指令地址,IFSR中存储的是一个32位数,其中某些位表明异常类型等(参考Cortex-A15 TRM p4-76)

剩余的工作就是根据以上两个寄存器提取出来的信息,调用相应函数(do_PrefetchAbort——>do_page_fault)进行处理。

关键字:ARMLinux  TLB  miss  处理过程 引用地址:ARMLinux的TLB miss处理过程

上一篇:arm开发经验笔记
下一篇:ARM HMP ---- 异构移动多处理器

推荐阅读最新更新时间:2024-03-16 15:01

ARM处理器的未定义指令异常处理过程分析
在前面的两篇文章中已经介绍了ARM处理器的工作模式和ARM异常中断处理流程。这篇文章我们通过代码来详细介绍ARM处理器未定义指令的异常中断处理;当发生未定义指令异常中断时,CPU进入未定义指令模式。可以通过读取CPSR寄存器的值来判定是否真的进入了未定义指令模式。 开发板:tiny4412; 工具链版本:gcc version 4.5.1 (ctng-1.8.1-FA) 主要设置以下几个文件: start.S文件,详细内容如下: .text .global _start _start: b reset /* vector 0x46000000 reset*/ ldr pc, _undefined_ins
[单片机]
ARM异常---一个Uart中断的触发处理过程
首先给出一些定义: //2440addr.inc INTOFFSET EQU 0x4a000014 ;Interruot request source offset //option.inc _ISR_STARTADDRESS EQU 0x33ffff00 //2440init.s MACRO $HandlerLabel HANDLER $HandleLabel $HandlerLabel sub sp,sp,#4 ;decrement sp(to store jump address) stmfd sp!,{r0} ;PUSH the work regi
[单片机]
揭秘:变压器干燥处理过程及原理
1 变压器干燥处理的意义 变压器干燥的目的是除去变压器绝缘材料中的水分,增加其绝缘 电阻 ,提高其闪络 电压 。电压在3kV以上的变压器都必须进行干燥处理。变压器器身主要由铁心和线圈以及绝缘材料装配组成,装配好之后,在加入变压器油之前,一定要经过干燥处理工艺,以去除绝缘材料中的水分和气体,使其含水量控制在产品质量要求的限度之内,以保证变压器有足够的绝缘强度和运行寿命。对高压变压器,要求其绝缘材料的含水量在0.5%以内。 2 变压器绝缘干燥标准及干燥处理 (1)干燥标准: ①变压器绝缘油内不含水分。油的击穿电压不低于出厂数据的75%; ②绝缘电阻不低于出厂数据的70%; ③介质损失角正切不大于出厂数据
[电源管理]
Linux kernel的中断子系统之(六):ARM中断处理过程
一、前言 本文主要以ARM体系结构下的中断处理为例,讲述整个中断处理过程中的硬件行为和软件动作。具体整个处理过程分成三个步骤来描述: 1、第二章描述了中断处理的准备过程 2、第三章描述了当发生中的时候,ARM硬件的行为 3、第四章描述了ARM的中断进入过程 4、第五章描述了ARM的中断退出过程 本文涉及的代码来自3.14内核。另外,本文注意描述ARM指令集的内容,有些source code为了简短一些,删除了THUMB相关的代码,除此之外,有些debug相关的内容也会删除。 二、中断处理的准备过程 1、中断模式的stack准备 ARM处理器有多种processor mode,例如user mod
[单片机]
Linux kernel的中断子系统之(六):ARM中断<font color='red'>处理</font><font color='red'>过程</font>
keil51的中断处理过程
中断函数注意如下: (1)中断函数不能进行参数传递,如果中断函数中包含任何参数声明都将导致编译出错。 (2)中断函数没有返回值,如果企图定义一个返回值将得不到正确的结果,建议在定义中断函数时将其定义为void类型,以明确说明没有返回值。 (3)在任何情况下都不能直接调用中断函数,否则会产生编译错误。因为中断函数的返回是由8051单片机的RETI指令完成的,RETI指令影响8051单片机的硬件中断系统。如果在没有实际中断情况下直接调用中断函数,RETI指令的操作结果会产生一个致命的错误。 (4)如果在中断函数中调用了其它函数,则被调用函数所使用的寄存器必须与中断函数相同。否则会产生不正确的结果。 (5)C51编译器对中断函数编译时会
[单片机]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved