vivi运行过程分析 vivi作为一种Bootloader,其运行过程分成两个阶段。第一阶段的代码在vivi/arch/s3c2410 /head.s中定义,大小不超过10 KB,它包括从系统上电后在0x00000000地址开始执行的部分。这部分代码运行在Flash中,它包括对S3C2410的一些寄存器、时钟等的初始 化并跳转到第二阶段执行。第二阶段的代码在vivi\init\main.c中,主要进行一些开发板初始化、内存映射和内存管理单元初始化等工作,最后会 跳转到boot_or_vivi()函数中,接收命令并进行处理。需要注意的是在Flash中执行完内存映射后,会将vivi代码拷贝到SDRAM中执 行。 大多数Bootloader都分为stage1和stage2两部分,stage2 的代码通常用 C 语言来实现,以便于实现更复杂的功能并取得更好的代码可读性和可移植性。但是与普通C语言应用程序不同的是,在编译和链接Bootloader 程序时,不能使用glibc库中的函数。因此,从那里跳转进main()函数,而把main()函数的起始地址作为整个stage2执行映像的入口点也存 在两个缺点:无法通过main()函数传递函数参数且无法处理main()函数返回的情况。 一种较为巧妙的方法是利用弹簧床的概念,也就是用汇编语言 写一段trampoline 小程序,并将这段程序作为stage2可执行映象的执行入口点,然后在trampoline汇编小程序中用CPU跳转指令跳入main()函数中去执行。 当main()函数返回时,CPU执行路径再次回到trampoline程序。
|