Linux kernel保证Cache和DMA的数据一致性

一、CPU、内存、Cache、DMA之间的关系

1. Cache

CPU,即中央处理器,是计算机的控制中心和数据处理中心。它的运算速度非常快。

内存,又称主存储器,通常由DRAM(Dynamic Random Access Memory,动态存储器)组成,在CPU运行时提供存储数据和代码的场所。

由于CPU的处理速度比内存的读写速度要快很多,CPU想要读写内存时,需要等待内存读写完成后才能进行接下来的操作,这样大大降低了CPU的运行效率,因此又引入Cache。

Cache,即高速缓冲存储器,通常由SRAM(Static Random Access Memory,静态存储器)组成。它位于CPU的寄存器和内存之间,读写速度慢于寄存器但快于内存,容量大于寄存器但小于内存。

计算机中最常见的存储器层次结构如下图。

Cache能提高计算机运行效率的依据是程序的局部性原理,该原理分为时间局部性和空间局部性。时间局部性是指如果程序中的某条指令一旦执行,则不久之后该指令可能再次被执行;如果某数据被访问,则不久之后该数据可能再次被访问。空间局部性是指一旦程序访问了某个存储单元,则不久之后,其附近的存储单元也将被访问。

因此,使用Cache保存CPU刚使用过或循环使用的数据,CPU直接访问Cache获取数据而不再访问内存。根据局部性原理可知,CPU有很大的概率是可以直接从Cache中得到数据的。但如果CPU想要访问的数据并不存在于Cache中,即未命中,则再从内存中将数据拷贝到Cache内,再由CPU进行访问。

2. DMA

DMA(Direct Memory Access,直接存储器访问)主要用于存储器与外设、外设与外设之间的数据传输。

在DMA出现之前,内存与I/O外设交换数据的方式通常采用中断传输方式。当外设想要与内存交换信息时,会先向CPU发出请求信号,CPU收到信号后会发生中断,暂停正在执行的程序,转而执行数据输入输出操作,将内存中的数据搬运给外设(或将外设的数据搬运到内存中),直到数据传输完成,才会继续之前的进程。

DMA的作用就是能够让外设与内存在交换数据时不经过CPU,传输数据时,CPU只需要告诉DMA从内存的哪个地址读多大的内存,DMA自己去读取然后转交给外设即可,CPU无需继续参与。

二、DMA和Cache的数据一致性问题

前文提到,CPU将处理的数据存储在Cache上,只有在特定的时机下才会将Cache上的数据同步更新到内存上。也就是说,内存上存储的数据并不时刻都是CPU处理得到的最新数据。如果外设想使用CPU处理后的数据,DMA直接读取内存并不一定能得到正确的结果。

反之也有同样的问题,外设将数据通过DMA写入内存后,CPU想要使用这些数据,CPU只能读取Cache中的数据,但Cache中的数据可能并没有与内存同步过,造成CPU得不到正确的数据。

为了保证Cache与内存的数据保持一致,提出了下面两种方法:

  • 写无效(Invalidate):DMA向内存中写入数据完成后,直接令Cache中的内容无效。这样CPU在读取Cache时必然要先从内存中读取数据到Cache。
  • 写回(Writeback):DMA从内存中读取数据时,先强制将Cache中的内容写回到内存中。

三、Linux kernel保护数据一致性

一些嵌入式平台可能包括两级Cache,称为Inner Cache和Outer Cache。前者是内部Cache,位于CPU内部,也称为一级Cache或L1 Cache;后者是外部Cache,位于CPU外部,也称为二级Cache或L2 Cache。

几个常见的嵌入式平台如ARM、MIPS、PPC都采用软件管理Cache,提供相应的接口来管理Cache,但需要我们编写代码主动操作Cache。以ARM平台为例,Linux对DMA的数据一致性操作函数为dmac_flush_range()函数和outer_flush_range()函数,两个函数都同时进行了写无效操作和写回操作确保数据一致性。

针对Inner Cache。

extern void dmac_flush_range(const void *, const void *);

针对Outer Cache。

static inline void outer_flush_range(phys_addr_t start, phys_addr_t end)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值