记一个bootloader的cache问题
问题背景
最近往一个armv7板子的bootloader中移植了解压算法,移植本身还比较顺利,但移植完了发现,功能是正常的,但效率大打折扣。解压同样的数据,耗时大约是uboot的10倍。
初步定位
从这个10倍的量级上,比较怀疑是Cache相关,但其他怀疑的因素也要先确认了下。先确认下直接相关的DDR和CPU。
DDR的驱动是完全一样的,所以DDR先排除。
CPU的话,芯片上电后时钟是固化在芯片中的BootROM设定的,默认比较低,但看代码CPU时钟是调整过了,已经提高到1G了。为了确认改动是生效的,尝试将CPU频率设定降低了些,发现速度确实随之变慢了,那就说明CPU时钟配置确实生效了。退一步讲,CPU的设置即使没成功,也不应该造成十倍的性能差距。
那么目光就落在了Cache身上。从代码上看,MMU,DCache和ICache是都打开了的。那么既然使能了,得想个办法确认是否确实起作用了,一个简单的办法就是,故意不使能它,看性能是否有变化。
修改代码,分别测试了不使能DCacne和不使能ICache的解压时间,从结果看出ICache起作用了,而DCache没起作用,开关DCache对解压时间没什么影响。那问题肯定就在DCache上。
Cache设定
到了这一步,我想到之前解决的另一个Cache不起作用的问题,最终是查到必须设置smp bit,于是加上对应的设置代码,但加上后问题并没解决。
继续google,查阅了一些Cache的资料后,目光转向了mmu的page table设置。
简单来说,在启用mmu时,需要给出一个page table告知mmu,虚拟地址和物理地址如何映射,在这个page table中,每一项还有若干功能位,包括了权限,Cache等设置。
对于一些寄存器相关的地址,一般就不使能Cache,这样读写寄存器不会受Cache影响。而对于其他正常的地址,一般会启用Cache以提高效率。而启用Cache还需要具体配置Cache的模式,可以配置为write-through(写通/写穿) 或 wrike-back(写回)。对于write-through,数据会既写到Cache又写到主存,Cache和主存的数据总是一致的。对于write-back,数据只写到Cache,并标记为dirty,当Cache被换出时才写到主存。
对照实际的page table,发现设置的是write-through。write-through每次都需要实际写到主存,速度自然是慢的,赶紧修改为write-back测试下。果然解压速度获得了质的飞跃。
本次问题中,我的代码本身是运行在Sram上,而需要解压的源数据,以及解压后的数据则是在Dram上。在将Dram对应地址的设置改为write-back之后,速度获得了大约3倍的提升。进一步将Sram对应的地址也设置为write-back之后,速度再次获得约10倍的提升。累计提升约28倍,令人不仅赞叹Cache果然是个好东西。
顺便提一句,最开始加的smp bit确实是需要的,各位如果发现DCache没起作用,可以检查下这个设置,之前在另一个问题上也是坑了我好几天才从uboot中揪出这个配置。
Cache回刷
改完之后,解压速度杠杠的,但也带来了一些其他的问题,例如我的系统启动不了了,bootloader跳转过去就直接挂了。想了下,应该是改为write-back后Cache和主存的数据存在不一致导致的。
如果是在主系统中,那对Cache就得精细化控制,该回刷就回刷该无效就无效,但在这个问题中我的场景比较简单,bootloader一穷二白,就简单些吧,再移植一段刷Cache的代码,直接刷全部DCache。然后在几个关键的地方调用了下,果然,启动流程恢复正常了。
记一个bootloader的cache问题的更多相关文章
- 记一个社交APP的开发过程——基础架构选型(转自一位大哥)
记一个社交APP的开发过程——基础架构选型 目录[-] 基本产品形态 技术选型 最近两周在忙于开发一个社交App,因为之前做过一点儿社交方面的东西,就被拉去做API后端了,一个人头一次完整的去搭这么一 ...
- 一个Netfilter nf_conntrack流表查找的优化-为conntrack添加一个per cpu cache
独悲须要忍受.快乐须要分享对Linux协议栈多次perf的结果,我无法忍受conntrack的性能,然而它的功能是如此强大,以至于我无法对其割舍,我想自己实现一个高速流表.可是我不得不抛弃依赖于con ...
- 记一个http-proxy-middleware 代理访问nginx映射的接口不通过的问题(connection close)
工作过程中遇见一个问题,使用Vue-cli 搭建了一个工程,由于跨域的问题 使用了自带的dev-server Express Server(A后台) http-proxy-middleware 去访问 ...
- 记一个常见的ms sql server中取第N条记录的方法
前言 好好学习,天天向上. 正文 好像也是一个不难的问题,刚视频里看到的,就记一下吧. 下面是表中原始的数据结构,做了一个倒叙排序: select * from Employee order by S ...
- Python实现的一个简单LRU cache
起因:我的同事需要一个固定大小的cache,如果记录在cache中,直接从cache中读取,否则从数据库中读取.python的dict 是一个非常简单的cache,但是由于数据量很大,内存很可能增长的 ...
- salesforce零基础学习(一百一十五)记一个有趣的bug
本篇参考:https://help.salesforce.com/s/articleView?language=en_US&type=1&id=000319486 page layou ...
- 记一个mvn奇怪错误: Archive for required library: 'D:/mvn/repos/junit/junit/3.8.1/junit-3.8.1.jar' in project 'xxx' cannot be read or is not a valid ZIP file
我的maven 项目有一个红色感叹号, 而且Problems 存在 errors : Description Resource Path Location Type Archive for requi ...
- 记一个简单的sql查询
在我们做各类统计和各类报表的时候,会有各种各样的查询要求.条件 这篇主要记录一个常见的统计查询 要求如下: 统计一段时间内,每天注册人数,如果某天没有人注册则显示为0 现在建个简单的表来试试 建表语句 ...
- Entity Framework学习笔记——记一个错误解决方式及思路
继续之前设定的学习目标前,先来一篇小小的外篇.按照第一篇里的配置方式配置好的工程前两天还能正常工作,昨天却突然无法通过Add-Migration命令进行数据库的升级.错误信息如下: System.Da ...
随机推荐
- SVM详细笔记及总结
本文精品,如有疑问欢迎留言or微信咨询:523331232
- Ubuntu16.04下升级Python到3.6
转: 这里 有一篇帖子是说从源代码开始安装,这种方式原来尝试过,需要删除系统默认的软链命令,感觉比较粗暴,现在在想有没有更好的方式呢? 找到一个帖子:http://ubuntuhandbook.org ...
- SVN 下载与安装(超简单)!!!
一 SVN 是什么? 在公司做过团队开发都知道,一个项目的代码要保持最新的版本. 举个例子! 例如:一个公司的项目有5人开发(A,B,C,D,E五个人),有一个地方专门存放项目的最新的代码,这个地 ...
- 《Effective Java》 读书笔记(八)避免使用Finalizer和Cleaner机制
Finalizer和Cleaner并不等同于C++中的析构函数,是不确定多久会被调用的,甚至有时候可能不会被调用,因此除了作为一个安全网或者终止非关键的本地资源,不应该在Finalizer或Clean ...
- Spring Boot实战之定制URL匹配规则
本文首发于个人网站:Spring Boot实战之定制URL匹配规则 构建web应用程序时,并不是所有的URL请求都遵循默认的规则.有时,我们希望RESTful URL匹配的时候包含定界符". ...
- 安全路径——最短路径树+dsu缩边
题目描述 思路 首先想到$dijkstra$跑完之后$build$一棵最短路径树.要找到每个节点i到根的满足要求的最短路,考虑把一些非树边加进去. 对于非树边$(u,v)$,因为节点i上方的边被占领, ...
- [转载]2.1 UiPath条件判断活动If的介绍和使用
一.if的介绍 if语句是指编程语言(包括c语言.C#.Python.Java.汇编语言等)中用来判定所给定的条件是否满足,根据判定的结果(真或假)决定执行给出的两种操作之一. 二.if在UiPath ...
- 演示vsftpd服务匿名访问模式、本地用户模式的配置
文件传输协议(FTP,File Transfer Protocol) 即能够让用户在互联网中上传.下载文件的文件协议,而FTP服务器就是支持FTP传输协议的主机,要想完成文件传输则需要FTP服务端和F ...
- python面试题2.1:如何实现栈
本题目摘自<Python程序员面试算法宝典>,我会每天做一道这本书上的题目,并分享出来,统一放在我博客内,收集在一个分类中. 2.1 如何实现栈 [阿里巴巴面试题] 难度系数:⭐⭐⭐ 考察 ...
- shell编程-基础
1.linux 下 Bash 程序开 1.1 怎样写 shell 脚本 1.使用编辑工具编辑shell 脚本,例如 vim,脚本名字一般用.sh 为后缀,不用.sh 为后缀 时编辑的内容为全黑,不会有 ...