|
长篇连载--arm linux演艺---第二回 <br /> -------------------------------------------------------------------------------- <br /> <br /> 上回书说到flashloader把bootloader load到0x0AFE0100, 然回跳了过去, <br /> 其实0x0AFE0100 就是烧在flash 0x0C000100中的真正的bootloader: <br /> <br /> bootloader 有几个文件组成,先是START.s,也是唯一的一个汇编程序,其余的都是C写成的,START.s主要初始化堆栈: <br /> <br /> _start: <br /> ldr r1,=StackInit <br /> ldr sp,[r1] <br /> b main <br /> //此处我们跳到了C代码的main函数,当C代码执行完后,还要调用 <br /> //下面的JumpToKernel0x跳到LINXU kernel运行 <br /> <br /> .equ StackInitValue, __end_data+0x1000 // 4K __end_data在连结脚本中指定 <br /> <br /> StackInit: <br /> .long StackInitValue <br /> <br /> .global JumpToKernel <br /> <br /> JumpToKernel: <br /> // jump to the copy code (get the arguments right) <br /> mov pc, r0 <br /> <br /> .global JumpToKernel0x <br /> // r0 = jump address <br /> // r1-r4 = arguments to use (these get shifted) <br /> JumpToKernel0x: <br /> // jump to the copy code (get the arguments right) <br /> mov r8, r0 <br /> mov r0, r1 <br /> mov r1, r2 <br /> mov r2, r3 <br /> mov r3, r4 <br /> mov pc, r8 <br /> .section ".data.boot" <br /> .section ".bss.boot" <br /> <br /> 欲知bootloader中的c代码如何运行,请看下集 |
|