历史上的今天
返回首页

历史上的今天

今天是:2025年01月19日(星期日)

正在发生

2020年01月19日 | ARMv8 Linux内核源码分析:__flush_dcache_all()

2020-01-19 来源:eefocus

1.1 

/*


 *  __flush_dcache_all()


*  Flush the wholeD-cache.


 * Corrupted registers: x0-x7, x9-x11


 */


ENTRY(__flush_dcache_all)


//保证之前的访存指令的顺序


    dsb sy           


      //读cache level id register


    mrs x0, clidr_el1           // read clidr


      //取bits[26:24](Level of Coherency for the cache hierarchy.)


//需要遵循cache一致性的cache层级(例如有3级cache,但2级需要做一致性)


    and x3, x0, #0x7000000      // extract loc from clidr


      //逻辑右移23位,把bits[26:24]放到bits[2:0]


    lsr x3, x3, #23         // left align loc bit field


      //如果需要做cache一致性的层级为0,则不需要flush,跳转到finished标记处。


    cbz x3, finished            // if loc is 0, then no need toclean


      //x10存放cache级,从level0 cache开始做flush


      //以下三个循环loop3是set/way(x9),


//loop2是index(x7),loop1是cachelevel(x10)


    mov x10, #0             // start clean at cache level 0


loop1:


//x10+2后右移一位正好等于1,再加上x10本身正好等于3


      //每执行一次loop1,x2+3*执行次数,目的在于把x0(clidr_el1)右移3位,


//取下一个cache的ctype type fields字段,clidr_el1的格式见《ARMv8 ARM》


    add x2, x10, x10, lsr #1        /


      //x0逻辑右移x2位,给x1,提取cache类型放到x1中,x0中存放:clidr_el1


    lsr x1, x0, x2         


      //掩掉高位,只取当前cache类型


    and x1, x1, #7 


      /* 判断当前cache是什么类型:


* 000  No cache.


* 001  Instruction cache only.


* 010  Data cache only.


* 011  Separate instruction and data caches.


* 100  Unified cache.


*/


      //小于2说明data cache不存在或者只有icache,


//跳转skip执行,大于等于2继续执行


    cmp x1, #2             


    b.lt   skip               


/*


 * Save/disable and restore interrupts.


 * .macro save_and_disable_irqs, olddaif


 * mrs olddaif,daif                                                                                                                                                      

 * disable_irq


 * .endm


*/


      //保存daif到x9寄存器中,关闭中断


    save_and_disable_irqs x9        // make CSSELR and CCSIDR access atomic


      //选择当前cache级进行操作,csselr_el1寄存器bit[3:1]选择要操作的cache级


      //第一次执行时x10=0,选择level 0级cache


    msr csselr_el1,x10        


      //isb用于同步新的cssr和csidr寄存器


    isb                


      //因为执行了“msr csselr_el1,x10”,所以要重新读取ccsidr_el1


    mrs x1, ccsidr_el1          // read the new ccsidr


    /*


* .macro  restore_irqs, olddaif                                                                                                                                          


     * msr daif, olddaif


    . * endm


        */


    restore_irqs x9


      //x1存储ccsidr_el1内容,低三位是(Log2(Number of bytes in cache line)) – 4


      //加4后x2=(Log2(Numberof bytes in cache line))


    and x2, x1, #7          // extract the length of the cachelines


    add x2, x2, #4          // add 4 (line length offset)


    mov x4, #0x3ff


      //逻辑右移3位,提取bits[12:3](Associativityof cache) – 1,


      //x4存储cache的way数


    and x4, x4, x1, lsr #3     // find maximum number on the way size


      //计算x4前面0的个数,存到x5


    clz x5, x4              // find bit position of way sizeincrement


      //提取bits[27:13]位:(Number of sets in cache) - 1


    mov x7, #0x7fff


      //x7中存储cache中的set数


    and x7, x7, x1, lsr #13     // extract max number of the index size


loop2:


      //把x4值备份


    mov x9, x4              // create working copy of max waysize


loop3:


      //把需要操作哪个way存储到x6


    lsl x6, x9, x5


      //确定操作哪一级的哪个way(x10指定操作哪一级cache)


    orr x11, x10, x6            // factor way and cache number intox11


      //确定操作哪个set


    lsl x6, x7, x2


    orr x11, x11, x6            // factor index number into x11


      //x11中存储了哪一级cache(10),哪一路cache(x9),哪个set(x7)


    dc  cisw, x11           // clean & invalidate by set/way


      //way数-1


    subs   x9, x9, #1          // decrementthe way


    b.ge   loop3


    subs   x7, x7, #1          // decrementthe index


    b.ge   loop2


skip:


    add x10, x10, #2            // increment cache number,


//为什么加2不是1?见loop1标号处解释


    cmp x3, x10


    b.gt   loop1


finished:


    mov x10, #0             // swith back to cache level 0


    msr csselr_el1, x10         // select current cache level incsselr


    dsb sy


    isb


    ret


ENDPROC(__flush_dcache_all)

推荐阅读

史海拾趣

CP Technology Inc公司的发展小趣事

CP Technology Inc成立之初,便专注于半导体技术的研发。公司研发团队成功开发出一种高效能、低功耗的芯片,这一创新为公司的快速崛起奠定了基石。随着技术的不断完善和产品的广泛应用,CP Technology Inc逐渐在半导体市场上占据了一席之地。公司通过持续的技术创新和产品迭代,不断满足市场需求,赢得了客户的信赖和支持。

ET Enterprises Ltd公司的发展小趣事

在竞争激烈的电子行业中,ET Enterprises Ltd公司始终保持对技术创新的重视。公司不断投入研发资源,推动光电倍增管技术的不断进步。同时,公司也注重人才培养和团队建设,为公司的持续发展提供了有力保障。

Glenair公司的发展小趣事
电压比较器、继电器、可控硅等元件可能因老化、过流、过热等原因损坏,导致电路无法正常工作。
CAROLCABLE公司的发展小趣事

在激烈的市场竞争中,CAROLCABLE公司深知技术创新是企业发展的核心动力。因此,公司不断加大研发投入,引进先进的生产设备和技术人才,推动技术创新和产业升级。经过多年的努力,CAROLCABLE成功研发出了一系列具有自主知识产权的高性能线缆产品,这些产品在传输速度、稳定性和耐用性等方面均达到了行业领先水平。

随着产品技术的不断升级,CAROLCABLE开始积极拓展国内外市场。公司参加了多个国际电子线缆展会,与全球同行交流学习,寻找合作机会。同时,CAROLCABLE还加强与国内大型电子企业的合作,为其提供定制化的线缆解决方案。这些举措不仅为公司带来了更多的商机,也进一步巩固了CAROLCABLE在电子线缆行业的领先地位。

这两个故事仅是对CAROLCABLE公司发展起来的简要描述,实际上,公司的成长历程中还有许多值得探讨的细节和里程碑事件。如需了解更多关于CAROLCABLE公司的故事,建议查阅相关新闻报道或公司官方资料。

Ememory Technology Inc公司的发展小趣事

在2022年,eMemory宣布加入英特尔晶圆代工服务加速器(Intel Foundry Services Accelerator)计划。这一合作标志着eMemory的技术得到了国际半导体巨头的认可。通过这一计划,eMemory为使用英特尔晶圆代工服务的客户提供全球领先的安全IP解决方案,进一步提升了其产品在全球市场的竞争力。

Filtran Ltd公司的发展小趣事

面对日益严峻的环保压力,Filtran Ltd积极响应可持续发展号召,将环保理念融入产品设计中。公司研发出了一系列绿色滤波器产品,采用可回收材料制造,并在生产过程中减少能源消耗和废弃物排放。这些环保产品不仅满足了市场对高性能滤波器的需求,还赢得了客户的广泛赞誉和信任。Filtran Ltd因此成为了电子行业环保实践的典范。

问答坊 | AI 解惑

求高手们帮忙看看这个射频可调衰减器

求高手们帮忙看看这个射频可调衰减器求高手们帮忙看看这个射频可调衰减器中Q1是用什么管的。型号是多小!!!!!原来上面用的是这个3个脚的管子 …

查看全部问答>

读简历的人最不喜欢看到的字眼

你知道你的简历里哪些词语会在不经意间惹恼招聘者吗?   动词列表是简历编写指南里保留的项目,调查还发现:简历里尽可能的堆满动词、形容词和副词的求职成功率更高。几乎所有的人事经理都喜欢选择有效的字句,而不是花样繁多的词藻的简历。   ...…

查看全部问答>

无法弹出wifi登陆框

wince加了wifi组件,同时里面有wifi的驱动和注册表 但插入wifi模块时候为什么不能够弹出登录框 dnw也没有打印出wifi加载的信息 想问一下 这个现象是不是与定制explore的时候有关呢? 由于需要,将系统的部分功能裁减了,比如说将\"任务栏\"去 ...…

查看全部问答>

串口线不通用吗?

我有两根直连串口线,一个是LPC2114开发板用的,一个是2440开发板用的。这两根串口线只能在各自的板子上用!不能混用!就是说,把LPC2114板子用的那个串口线拿到2440的板子上就不能用(超级终端不能正常收发数据)! 我想串口线应该是通用的吧?? ...…

查看全部问答>

FATAL ERROR - InitDetectCPU Failed

Debug Serial Init SysInit: GDTBase=8103d0e8 IDTBase=8105e860 KData=81065800 Windows CE Kernel for i486 Built on Jun 24 2004 at 18:23:42 g_pPageDir = 81066000                &nb ...…

查看全部问答>

I2C总线库函数介绍

函数I2CMasterInitExpClk( )    …

查看全部问答>

LwIP在ucos ii下的移植,一点资料!

一个pdf,一个DSP的工程 网上找的,看了好久 还是没有实现! 大家一起来研究~~~…

查看全部问答>

M4开发板(14):硬件问题,关于Hanker开发板的VREF!

这几天又重新玩起了ADC采样功能,在测试AD采样加速度传感器的时候,我发现了问题,这个问题早在 https://bbs.eeworld.com.cn/viewthread.php?tid=330464这个帖子里,我就发现了,那就是AD采样的值不准确!!那个测倾角的程序,本来使用的那个MSP-E ...…

查看全部问答>

求助一下公模的问题

PCB板是不是也涉及到公模的问题,我做的是一块单片机最小系统板,想给它量产的话,上边要求要做适应公模,我想问一下公模的大小怎么确定,我从哪里可以得到公模尺寸…

查看全部问答>