接上一篇
Hi3861系统LoaderBoot流程介绍,这次再说一下FlashBoot。
FlashBoot负责启动固件也就是启动操作系统的,它的入口函数如下:
套路很一样,配方很一样,从汇编跳转到c入口:
start_fastboot中设置了看门狗,初始化了io,flash,nv等最后调用
execute_upg_boot,execute_upg_boot中获取配置判断是升级还是启动,然后调用boot_head,boot_head如下:
获取完启动地址后调用boot_kernel启动了操作系统内核,boot_kernel函数实现
如下:
- hi_void boot_kernel(uintptr_t kaddr)
- {
- __asm__ __volatile__("ecall"); /* switch U-MODE -> M-MODE */
- hi_void (*entry)(hi_void) = (hi_void*)(kaddr);
- entry();
- }
复制代码
这个函数有意思吧,不光嵌入了汇编,还拿地址当函数去跳转,为啥这样,
因为FlashBoot和kernel,是两套代码程序,他们之间没有依赖引用关系,
但是他们在一个地址空间,所以直接地址跳转,这也是从boot到kernel通用
的跳转方式。