需求背景
公司的无敌高端娱乐设备带了巨大的8T曲库盘,这么高端的东西竟然被市场诟病系统启动Launcher后,还在等待硬盘挂载,这个体验实在不咋地。为了维护产品的逼格,那么优化挂载速度刻不容缓,这个艰巨的任务由此拉开巨幕。
前期思路
- 比较直接,在kernel中sata驱动中下手,找到sata初始化慢的原因。
- 比较有经验的老大提出来的,在uboot中提前给硬盘上电,加速初始化。
实践过程:
第一个思路:
- 对比测试,发现影响sata硬盘挂载的因素非常多,有如下:
1. 硬盘类型,希捷的绿盘尤其垃圾,同时上电,初始化最慢
2. 硬盘容量,容量越大,挂载正常越慢
3. 硬盘格式,ext格式和ntfs也会有些差异
4. 硬盘从异常状态恢复挂载速度很慢,典型的机器异常断电导致
这些问题,最典型的莫过于硬盘本身的问题,比如希捷绿盘这个问题,经过分析sata驱动,发现ahci协议在硬盘初始化的流程中,有个soft reset的步骤,这一步希捷绿盘就会失败,其他别的型号的盘正常,然后失败后陷入漫长的等待,直到状态正常,执行下一步操作,最后从kernel启动到硬盘挂载正常需要28s,正常是一半的时间。这就无法从kernel sata驱动中优化赢得时间。直到现在我还没找到优化的方法。
第二个思路:
- uboot中提前给硬盘上电,测试了一些方法:
1. 确认硬盘上电的gpio,查到到uboot中设置gpio操作的方法,setGPIO(GPIO_NUM, 1), 输出电压用万用表量一下,一直不生效,陷入沉思;
2. 开始怀疑设置gpio的方法,再找了一个了led指示灯的方法去测试,发现可以生效,再次陷入深深的沉思。
3. 最后找了芯片原厂的工程师求助,发现gpio可能被复用为其他功能,需要按照他们提供的寄存器先配置为普通gpio的功能,经过一番尝试果然解决。忽略细节害死人。
4. 接下来就是找了一个uboot中sata初始化的代码,移植进来。结果喜人,即使是希捷这个坑人的绿盘,初始化到挂载速度也有大幅提升。挂载速度可以由28s缩短到15s。
番外
大部分的Android代码,没有考虑到硬盘的支持,所以一般厂商提供的uboot代码中没有sata相关的功能,这时就需要开启搜索技能,经过搜索发现,各大uboot代码中sata驱动这一块逻辑流程都差不多,差异的部分在于每家的芯片差异,导致某些寄存器、GPIO地址不同。这就需要认真研究代码流程,然后对照芯片手册,一点一点调试移植。
网友评论