U-BOOT
cortexa8的引导过程,及存储空间的排布
芯片内部集成有irom,iram,其中,irom的起始地址就是0地址,程序启动时,先从0地址开始运行,此处集成的是三星厂家的引导程序,它的功能是:
通过nand控制器,从nand里面读取boot的前16K(iram的大小为16K)到iram中去执行。
uboot编译好后,已经有链接地址,并且大小大于16K,所以完整的uboot不可能放到iram中去执行,所以,iram只是一个跳板作用:通过u-boot的前16K,
完成把所有的u-boot搬移到ram中去,并跳转到ram中去执行。
听起来很完美,可是有一个问题,那就是编译bootload时,我们已经确定好了链接地址,即程序运行的位置,也就是说,程序必须位于它所在的链接地址,才能完美运行。
可是,不论我们的u-boot的链接地址是多少,irom始终把前16k放在固定的位置(iram的地址已经固定),所以必须保证u-boot的前16K必须用相对指令b、bl等,他们跳转的都是相对当前pc的偏转,不是绝对地址,和链接地址没关系。
决不能使用ldr pc xx,这是绝对地址,在链接时已经确定好了。
前16K代码初始化好ram,并把u-boot完整的搬移到链接地址的地方,跳转,就可以继续执行剩下的u-boot。
cortexa8的引导过程,及存储空间的排布
芯片内部集成有irom,iram,其中,irom的起始地址就是0地址,程序启动时,先从0地址开始运行,此处集成的是三星厂家的引导程序,它的功能是:
通过nand控制器,从nand里面读取boot的前16K(iram的大小为16K)到iram中去执行。
uboot编译好后,已经有链接地址,并且大小大于16K,所以完整的uboot不可能放到iram中去执行,所以,iram只是一个跳板作用:通过u-boot的前16K,
完成把所有的u-boot搬移到ram中去,并跳转到ram中去执行。
听起来很完美,可是有一个问题,那就是编译bootload时,我们已经确定好了链接地址,即程序运行的位置,也就是说,程序必须位于它所在的链接地址,才能完美运行。
可是,不论我们的u-boot的链接地址是多少,irom始终把前16k放在固定的位置(iram的地址已经固定),所以必须保证u-boot的前16K必须用相对指令b、bl等,他们跳转的都是相对当前pc的偏转,不是绝对地址,和链接地址没关系。
决不能使用ldr pc xx,这是绝对地址,在链接时已经确定好了。
前16K代码初始化好ram,并把u-boot完整的搬移到链接地址的地方,跳转,就可以继续执行剩下的u-boot。