uboot启动时间优化

来源:互联网 发布:奥速usb监控软件 编辑:程序博客网 时间:2024/05/06 17:35

最近在搞启动时间优化,首先必须要知道整个启动流程,然后统计时间消耗在哪个阶段,具体消耗多少,然后有针对性的去优化,做到有的放矢。

首先是时间统计函数
rct_timer_get_count()
这个是安霸平台提供的函数,读取ticks寄出去的值,然后再转换成毫秒ms,用这个函数来统计时间,可靠性和准确度还是非常有保障。

通过时间打印,发现在镜像加载时差不多使用了700ms时间,显然这个时间是有大量提升空间的。

uboot启动时间优化,网上查找了下,有好几个方面,具体要根据自己的代码来取舍。

1、打开icache和dcache
尝试将cache打开,效果立竿见影,读取镜像时间降到280ms左右
那么问题就来了,cache是什么?启动速度加快这么多,为什么默认没有将它打开呢?
第一个问题,网上搜一下,或者是专业的书籍上应该可以找到答案,反正我是没怎么搞清楚。。。
第二个问题,找了下,基本上就是运行速度加快的机制,让主处理器直接从cache中去取指令和数据,在系统起来之后,长时间的运行,会导致读取不到正确的数据。
列出一些文章链接,有兴趣的去看看
http://blog.csdn.net/bytxl/article/details/50275377
http://blog.csdn.net/iodoo/article/details/8954014
(刚说不稳定,真的就暴出来了,开启cache后,用tftp下载大文件时,会中断死机)

2、uboot启动流程
建议看下面这篇文章:
http://blog.csdn.net/andy_wsj/article/details/8614905
主要是它把内核加载的两种方式讲出来了,而且正好是我需要的,这一部分到时我也会整理一篇文章出来的

u_boot_hush_start –> install_auto_complete –> getenv(“bootcmd”) –> abortboot(bootdelay) –> parse_string_outer

u_boot_hush_start和parse_string_outer开启以hush的方式来解析命令,parse_string_outer将bootcmd的启动运行命令逐一解析。
bootcmd=kload 0x2000000;bootm 0x2000000
kload为加载内核镜像命令,bootm为运行内核命令。
parse_string_outer具体实现不要深入去追究它的实现,它的功能就是去逐一解析bootcmd的命令。

kload实现相对较简单,本质就是将内核镜像从flash中加载到内存中指定的位置。
bootm命令,是uboot自身命令,其实现过程可参考下面这篇文章:
http://blog.csdn.net/g_salamander/article/details/8463854
最后调用的启动函数,arm架构下是bootm.c的do_bootm_linux
do_bootm流程:
bootm_start –>disable_interrupts –> usb_stop –> bootm_load_os –> boot_os[] –> boot_fn

bootm_start :分析镜像信息,包括内核镜像头信息,加载地址,长度,压缩类型等。主要调用函数:boot_get_kernel –> image_get_kernel
bootm_load_os:主要判段镜像是否需要解压,并且将镜像移动到加载地址

abortboot(bootdelay)

0 0
原创粉丝点击