
Cache和DMA本身似乎是两个毫不相关的事物。Cache被用作CPU针对内存的缓存,利用程序的空间局部性和时间局部性原理,达到较高的命中率,从而避免CPU每次都必须要与相对慢速的内存交互数据来提高数据的访问速率。DMA可以作为内存与外设之间传输数据的方式,在这种传输方式之下,数据并不需要经过CPU中转。
假设DMA针对内存的目的地址与Cache缓存的对象没有重叠区域,DMA和Cache之间将相安无事。但是,如果DMA的目的地址与Cache所缓存的内存地址访问有重叠,经过DMA *** 作,与Cache缓存对应的内存中的数据已经被修改,而CPU本身并不知道,它仍然认为Cache中的数据就是内存中的数据,那在以后访问Cache映射的内存时,它仍然使用陈旧的Cache数据。这样就会发生Cache与内存之间数据“不一致性”的错误。
样。注:以下代码在内核目录linux-2.6.29/arch/arm/mach-s3c2440/mach-mini2440.c。
静态映射的建立方法,是在内核启动的时候,读取struct
map_desc结构体里面的成员:
/*arch/arm/include/asm/mach/map.h*/
14
struct
map_desc
{
15
unsigned
long
virtual
//存放以后需要 *** 作的虚拟地址,由自己定义
16
unsigned
long
pfn
//需要 *** 作的硬件的物理地址对应的页帧号,即物理地址右移12
17
unsigned
long
length
//需要映射的大小
18
unsigned
int
type
//类型
19
}
这里要说明两个成员:
1)物理地址的页帧号pfn:如果你了解linux的页式管理,那你应该知道,一个页的大小是4096B(2
<<
12),所以一个地址的31-12位是用来表示一个地址对
如果你想在外网访问这个服务器的web应用,可以在外网出口路由上做nat端口映射或者是nat静态转换,这样就可以了,如果此web应用只用于内网访问,直接访问即可,使用dns的话就需要假设内网dns服务器了,欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)