根据S3C2410芯片的CP15协处理器,可以将其异常向量的地址选择是高地址或是低地址。比如高地址的复位向量是0xFFFF 0000, 低地址的复位向量是0x0000 0000。对于使用ADS调试测试代码,我们通常都是使用低向量地址,因为S3C2410芯片自带一个4K的steppingStone,可以利用这4K的RAM作为向量地址的物理存储空间。
而WINCE是使用高异常向量地址,这个是在armTrap.s里面设置的,同时也在这个文件里设置了所有异常向量的地址。这里就有一个疑问了,在0xFFFF 0000的这个地址处并没有物理的存储空间可以存放代码啊?
我的理解是,WINCE启动首先是由OAL的startUp函数开始,在这个函数的末尾,他传递一个OemAddressTable的物理地址和虚拟地址的映射表给OS,然后跳转到KernelStart这个函数执行,这个函数首先就是根据传过来的表配置虚拟内存,在第二级页表时也配置好了0xFFFF 0000这个向量入口地址到某一个物理地址处,也就是说该0xFFFF 0000并不是某一个物理地址,它是一个虚拟地址,OS映射了一个物理地址给它,这样这些异常处理函数的入口就有实际的意义了,因此上面的疑问就可以解决了。
我设想的跳转过程是这样的,以复位异常为例。当设置为低异常向量地址,且没有使能MMU。当复位异常产生时,内核(不是OS,而是处理器内核)强制从0x0000 0000处取指,通常我们都会在0x0000 0000处放置一条跳转指令,然后执行复位异常。当设置为高异常向量地址,且使能了MMU,也就是WINCE的这种情况时,当复位异常产生时,内核(同样还是处理器内核)强制从0xFFFF 0000处取指,因为使能了MMU,它会自动将这个地址映射到对应的物理地址处,这样就跳转到了合适的异常处理程序的入口了。
我没有仔细的分析过armtrap.s的代码,请高手指教啊。等仔细分析过后,如果能分析通的话,我会把代码分析贴上来的。
希望有朋友可以一起沟通,交流!
my name: leo Email: _leo@live.cn (注意leo前有个下划线)