今天网上下载了一个操作系统,编译,运行,木有反应。跟移植者讨论了下,后来发现是异常向量表表的问题。他并没有开启MMU,而我是bootloader引导下载.bin代码的。0地址处存放的是bootloader,操作系统本身也要从0地址处读取向量表的信息,包括reset中断,设置堆栈指针等一系列的问题。找不到中断向量表,那其他的步骤就无从谈起了。所以后来解决方法是使用的tq2440的bootloader中的menu choice 1 ,即将 此操作系统下载到 nandflash的bootloader分区。然后再将tq的开关调制从nandflash启动。那样就能够正常运行了。

          至此,分析了下有无bootloader的读取中断向量表的情况:

          有bootloader的时候,在bootloader的引导下,将程序下载到响应的地址,大于0x30000000(sdram区域),然后运行,此时发生异常时,到0地址处取异常向量表。因为此时程序是在sdram中的,如从0x30000000开始存放的,那异常向量表就在0x30000000处,此时如果发生异常的话,从0地址找就找不到,所以两种方法,一种开启MMU,映射0地址到0x30000000处,另外一种是在程序里面进行异常向量表的拷贝,拷贝到0地址。     
在没有bootloader的时候,直接烧到0地址,但是在代码中执行了cp2sdram的操作,目标地址是0x30000000,此时有两个地方存着异常向量表,一是0地址,二是0x30000000处,没有进行MMU的时候程序读取的是0地址处的异常向量表,如果进行映射了的话,异常出现的时候,也还是去0地址找,但是此时0地址已经被MMU映射了,所以到相关映射的地址处寻找。

           要点:发生异常,永远是去0地址找。(特指arm下)。