WINCE系统调用的本质

WINCE的系统调用采取的方式没有使用ARM推荐的软件中断方式(即SWI指令,现在改为SVC,不过ARM的内联汇编方式仍然认可SWI),而是使用的ARM的异常中断PrefetchAbort,关于这一点在WINCE的私有代码armtrap.s中可以看到具体实现:

sub     r12, lr, #0xF1000000
cmp     r12, #MAX_METHOD_NUM-0xF1000000 ; 0x20400 is the max value of API encoding
bhs     ProcessPrefAbort

从上面的代码看出,系统调用的trap区域是0xF1000000到0xF1020400,当系统执行到这一区域时将会触发PrefetchAbort异常中断,在PrefetchAbort的实现里首先会检测异常地址是否在系统调用trap区域,如果不是则执行ProcessPrefAbort,否则查找API地址来分派实际调用。

为此产生了一个疑问,PrefetchAbort是如何触发的呢?根据已知的知识,异常向量表的位置是可以通过设置cpsr来决定是0x00000000还是0xFFFF0000,因此同样的对于PrefetchAbort的trap区域是否也可以通过类似的设置来实现?

通过查看官方的CPU手册,暂未找到直接的论据,不过发现有一个IFAR寄存器有点关联,原文摘抄如下:
The purpose of the Instruction Fault Address Register (IFAR) is to hold the address of instructions that cause a prefetch abort.
从字面意义理解应该是这个寄存器用于记录产生PrefetchAbort异常时的指令地址。

还有一种可能性就是MMU建立二级映射表的时候,关于系统调用的trap区域没有建立虚拟内存映射表,造成访问该区域时触发PrefetchAbort,关于此猜测需要看建立MMU二级映射表具体实现了。

 

你可能感兴趣的:(WINCE系统调用的本质)