蜗窝科技

bootloader和linux kernel如何协调MMU、dcache和icache的设定?

蜗窝讨论区存档 · Linux kernel技术问答 · 楼主 linuxer · 2016-04-19 · 5 帖

本文是原「蜗窝讨论区」的历史存档(2016-04-19),来自版块「Linux kernel技术问答」,共 5 帖。讨论区已停止服务,此处仅供查阅。

linuxer · 2016-04-19 19:16

1、bootloader是否需要开MMU? bootloader中没有多任务的需求,一般都是单线程的,因此也没有分隔各个任务的地址空间需求,MMU按理说不应该打开。

2、但是有些bootloader为何会打开MMU? 之所以在bootloader中打开MMU是因为想要打开dcache。一般而言,MMU和dcache是捆绑在一起的,想要打开dcache必须打开MMU。有的时候,在实际的项目中,为了加快bootloader的运行速度,打开dcache会有帮助,但是打开dcache必须要打开MMU,因此,一般做法是打开MMU,但是建立一致性映射(物理地址等于虚拟地址)。

3、为何MMU和dcache是捆绑在一起的?怎么不和icache捆绑在一起? 指令alway在memory中,打开不会产生歧义,而且打开总是能加快执行速度。但是对于数据而言就有些复杂了,有对memory的访问,有对外设的访问,有的需要cache,有的打开cache操作就错误了,因此,dcache的设定是在页表中的,从而和MMU捆绑在一起。

4、bootloader和linux kernel如何协调MMU、dcache和icache的设定? 在bootloader把控制权交给kernel的时候,kernel要求:MMU:off,dcache:off,icache:不要求,on或者off皆可。 因此,没有特殊要求,一般bootloader只是打开icache,而不会打开dcache。

5、在bootloader中打开icache不会有什么问题吗?对速度的改善如何? icache操作只是和取指操作相关,当保存指令的介质是慢速设备的时候(例如NOR FLASH),对速度改善非常大(程序都是符合局部性原理的)。即便是代码位于SDRAM或者DDR,速度改善也是很明显的。一般而言,icache在memory hierarchy中处于L0 level,仅次于寄存器,而SDRAM或者DDR处于L3或者L4,每个level都是相差一个数量级,因此,打开icache对速度的影响是非常明显的。

有一点要非常的注意,那就是program copy,这时候,由于打开了icache,要小心一点,不要访问到旧的icache的指令数据。一般而言,copy一段程序之后,立刻将该段icache设置为无效即可。

5、打开了dcache真的能提高执行速度吗? 这和bootload中对数据访问的模式相关,如果有很好的局部性,并且操作数据量比较大,打开dcache之后的速度的确会令人沉醉的。

注:该问题来自蜗窝科技的讨论群,这里整理出来,分享给大家。

linglongqion · 2016-04-19 19:25

:lol: Good reply!

弯曲的旅行 · 2016-04-19 21:08

楼主总结的很好,多谢。bootloader做的事情应该比较单纯才是,如果到了需要开cache的地步,是否需要反思呢?

上海-云 · 2016-04-20 09:52

非常棒的总结,特意注册了号来和大家交流 :rolleyes:

Daniel · 2016-04-20 18:09

linuxer研究的范围就是够广,够深啊,佩服