下面是vivi的head.S一段代码
@ copy vivi to RAM ldr r0, =VIVI_RAM_BASE mov r1, #0x0 mov r2, #0x20000 bl nand_read_ll
VIVI_RAM_BASE=0x33f00000 我在vivi/arch/vivi.lds 连接文件里面看到 连接地址是0x33f00000
因此我估计main函数是以0x33f00000地址编译的(以后main函数代码必须放在这个地址开始的地方才可以正确运行啊),head.S编译后就连接main函数的编译后的目标文件,生产映象。
但是上面的代码是把head.S也拷贝到ram去了,因此在0x33f00000的代码不是main函数的入口
而是head.s的入口,main的代码运行地址相应的往后移了。这样stage2的main函数代码运行地址是不正确的,怎么可以正确运行呢????
如果说head.S文件是以0x33f00000开始编译整个bootloader包括main函数部分,那么一开始自动copy前4k到steppingstone的代码是不能正确运行的吧,因为steppingstone会在0地址开始。
linux下是用arm gcc来编译的,一打的makefile文件,写得好复杂,只看懂一个大概,但是还是无法理解上面提到的问题。
请高手指教。