Linux version 3.10.40
ARM处理器支持多种异常模式,如reset,irq,fiq等,发生异常后处理器根据配置跳到指定的地址运行,可以配置成从0地址开始,也可以配置成从0xFFFF0000地址开始。我们从两个角度分析Linux上的实现,第一是负责异常处理的代码是如何安装到该地址的,第二是这些代码的处理流程是什么样的。
一 放置异常处理代码流程
依次涉及:
init/main.c中的start_kernel函数
arch/arm/kernel/setup.c中的setup_arch函数
arch/arm/mm/mmu.c中的paging_init和devicemaps_init函数
arch/arm/kernel/traps.c中的early_trap_init函数
调用过程:
start_kernel -> setup_arch -> paging_init -> devicemaps_init -> early_trap_init
devicemaps_init:
devicemaps_init函数中代码片段如下,先分配保存异常处理代码的空间,然后调用early_trap_init
/*
* Allocate the vector page early.
*/
vectors = early_alloc(PAGE_SIZE * 2);
early_trap_init(vectors);
devicemaps_init函数调用完early_trap_init会通过以下代码将异常处理的代码映射到异常向量地址处。
/*
* Create a mapping for the machine vectors at the high-vectors
* location (0xffff0000). If we aren't using high-vectors, also
* create a mapping at the low-vectors virtual address.
*/
map.pfn = __phys_to_pfn(virt_