历史上的今天
返回首页

历史上的今天

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

正在发生

2020年01月20日 | armv8(aarch64)linux内核中flush_dcache_all函数详细分析

2020-01-20 来源:eefocus

/*


 *  __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是cache level(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/disableand 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                                                                                                                                          


     * msrdaif, 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)

推荐阅读

史海拾趣

Elekon Industries公司的发展小趣事

随着技术的不断进步和市场需求的不断变化,Elekon意识到只有不断创新才能保持竞争力。因此,公司加大了研发投入,致力于技术创新和产品升级。经过多年的努力,Elekon成功开发出一系列具有自主知识产权的电子产品,包括高性能的集成电路、智能传感器等。这些新产品的推出不仅丰富了Elekon的产品线,也提升了公司的市场竞争力。

Aleph America Corporation公司的发展小趣事

随着技术的不断进步和市场需求的不断变化,Elekon意识到只有不断创新才能保持竞争力。因此,公司加大了研发投入,致力于技术创新和产品升级。经过多年的努力,Elekon成功开发出一系列具有自主知识产权的电子产品,包括高性能的集成电路、智能传感器等。这些新产品的推出不仅丰富了Elekon的产品线,也提升了公司的市场竞争力。

Cosel公司的发展小趣事

随着全球化进程的加速,Cosel公司开始将目光投向国际市场。1990年,公司成立了U.S.ELCO INC.(现名为COSEL U.S.A.,INC.),正式进入美国市场。随后,公司又设立了欧洲常驻办事处,进一步拓展了欧洲市场。这些举措使得Cosel公司的产品和服务能够覆盖更广泛的地区,为公司带来了更多的商机和发展空间。

Global Components & Controls公司的发展小趣事
在保证性能和质量的前提下,合理控制元件成本,以提高产品的市场竞争力。
歌尔(Goertek)公司的发展小趣事
根据电路设计要求和实际使用需求选择合适的元件参数,如电阻的阻值、电容的容值以及可控硅的型号等。
DMEL Inc公司的发展小趣事

在技术创新的基础上,DMEL Inc开始积极拓展市场。公司首先瞄准了欧美等发达国家市场,通过参加国际展会、建立海外销售网络等方式,成功打开了国际市场的大门。同时,DMEL Inc也关注国内市场的变化,不断调整产品策略,满足国内消费者的需求。随着市场份额的逐步扩大,DMEL Inc的知名度也不断提升。

问答坊 | AI 解惑

在mtk做手机软件开发有前途么?很急,请各位指教!

  我现在拿到mtk的offer了,手机软件开发职位,11w/年左右,我也同时拿到了另一家国内比较有名的做网络安全的公司的offer,8~9w/年。     上面两个公司职位一个是偏嵌入式,一个是win c++软件开发, 我是计算机系的,自己感 ...…

查看全部问答>

求助:eVC开发数据库的问题

请教各位高人:     我使用的工具是eVC4.0,前期开发了一些程序,不是利用MFC框架编的,直接用API编写的 那么我想问一下在我目前的这样开发环境下,开发数据库数据库,选用SQLite和SQLCE哪个开发容易一些呢? 另外:我没有开发数据库 ...…

查看全部问答>

大锅和机顶盒的原理是?有点疑问,很愚昧

我这样问,好像是很简单的问题了。 大锅和机顶盒好像都是只会接受消息,不会回复消息。 如果大锅能回复消息,卫星怎能承受得了。 机顶盒也是一样。 如果是这样,怎么认证帐号呢?[img=http://forum.eeworld.net/PointForum/ui/scripts/eeworld/ ...…

查看全部问答>

请教USB DEVICE 驱动的一个问题

Bulk-Only时 如果HOST向DEVICE写数据时 出现如下情况: 1 HOST发送CBW 2 DEVICE接收后开始等待DATA 3 HOST没有接收硬件层的关于CBW的确认。(对USB不了解,其中可能出现了重传等过程。最终的结果就是,HOST认为CBW没有被接收,DEVICE则等待DATA ...…

查看全部问答>

--声卡驱动 找不到 啊 !!!

音频控制芯片 SiS Azalia Audio Controller 芯片制造商 SiS 子系统ID 304217AAh 板卡制造商 Lenovo 中断 IRQ 18,INT# A ------------------------以上是Windows优化大师 检测的信息 sis high definition audio controller 着驱动精灵的信息 ...…

查看全部问答>

VGA 转 RGB

请问有谁做过VGA 转 RGB的系统没? 电脑显卡出来的VGA显示信号,转变为RGB数字信号,24位的最好, 就是想用480x272的LCD液晶来显示电脑输出的显示信号呀 ,各位高 手请指点一下,用哪个芯片好?…

查看全部问答>

怎么理解 ??????????????????????????????????????????????????????????????????

8051的停止位怎么设置? -------------------------------------------------------------------------------- 发布时间: 2006-12-15 ; 上次回复: 2006-12-15; 总计回复: 1人次 -------------------------------------------------------------- ...…

查看全部问答>

sql ce 数据库联接的问题,困扰

需要做一个sql ce的程序,我的开发环境是.net 2005,pc端数据库是sql server 2000 Developer版,pda操作系统mobile 5,sql ce 2.0,数据库放在My Documents下。 在程序进行数据库pull时连接不上,提示“The database file cannot be found. Check ...…

查看全部问答>

IAR5.4所產生的library(.a)如何在GCC下使用??

Dear all, 有人使用過IAR5.4產生的library,然後在GCC(WINARM)下使用嗎??…

查看全部问答>