cache操作函数

Baremetal
不讨论多级cache的情况下,裸驱两种关于dcache的操作:
flush_dcache_all(); // 将cache里面的东西刷入内存 invalidate_dcache_all(); // 将数据缓存中的所有内容无效化(invalidate)。该指令一般用于确保缓存中的数据与主内存中的数据同步
flush_dcache_all()函数通常在嵌入式系统或需要对数据缓存进行手动管理的系统中使用。以下是一些常见的情况和原因:
  1. 操作系统启动和关闭时:
在某些嵌入式系统中,操作系统启动时可能需要执行 flush_dcache_all()来确保数据缓存中的数据已经写回到主内存,从而避免启动过程中的数据不一致性。同样,在关闭系统之前,也可能需要执行该函数以确保数据完整性。
  1. DMA 操作:
当使用直接内存访问(Direct Memory Access, DMA)进行数据传输时,需要确保缓存中的数据已经写回到主内存,否则可能会导致数据不一致或丢失。在进行 DMA 操作前或后,执行flush_dcache_all()可以确保数据的一致性。
  1. 内存映射设备:
在一些嵌入式系统中,可能存在内存映射设备,需要手动管理缓存以确保正确的数据传输和一致性。
  1. 共享内存:
当多个处理器或硬件模块共享同一块内存时,需要确保数据的一致性。在数据被共享之前或之后,执行flush_dcache_all()可以确保共享数据的正确性。
总的来说,flush_dcache_all()通常用于确保数据的一致性和完整性,特别是在涉及到硬件、内存映射和多处理器系统的场景中。
 
invalidate_dcache_all()是一个函数或指令名称,用于将数据缓存中的所有内容无效化(invalidate)。该指令一般用于确保缓存中的数据与主内存中的数据同步,在某些场景下非常重要。
具体来说,当处理器从主内存读取数据时,数据通常会被缓存到数据缓存中。而当数据被修改时,为了提高性能,处理器通常只会在必要时将修改后的数据写回到主内存,而不是立即更新主内存中的数据。这就可能导致缓存中的数据和主内存中的数据不一致。使用invalidate_dcache_all()可以强制刷新缓存,从而使缓存中的数据无效化,确保后续从主内存中读取数据时,总是可以获得最新的数据。
 
Linux内核
Linux 内核中操作缓存时一些常见的 cache 操作函数的解释:
  1. kmem_cache_create()
  • 功能:创建一个新的内核缓存(kmem_cache)。
  • 参数:包括缓存对象的大小、对齐方式、构造函数等。
  • 返回值:成功创建缓存时返回指向 kmem_cache 结构的指针,失败时返回 NULL。
  • 示例:my_cache = kmem_cache_create("my_cache", sizeof(struct my_struct), 0, SLAB_HWCACHE_ALIGN, NULL);
  1. kmem_cache_alloc()
  • 功能:从指定的内核缓存中分配一个对象。
  • 参数:要分配的缓存指针。
  • 返回值:成功时返回分配的对象的指针,失败时返回 NULL。
  • 示例:ptr = kmem_cache_alloc(my_cache, GFP_KERNEL);
  1. kmem_cache_free()
  • 功能:将一个对象释放回其所属的内核缓存中。
  • 参数:要释放的对象指针。
  • 返回值:无。
  • 示例:kmem_cache_free(my_cache, ptr);
  1. kmem_cache_destroy()
  • 功能:销毁一个内核缓存,释放其占用的资源。
  • 参数:要销毁的缓存指针。
  • 返回值:无。
  • 示例:kmem_cache_destroy(my_cache);
  1. flush_dcache_page()
  • 功能:刷新指定页面的数据缓存,确保数据被写入内存。
  • 参数:要刷新的页面指针。
  • 返回值:无。
  • 示例:flush_dcache_page(virt_to_page(ptr));
  1. flush_icache_page()
  • 功能:刷新指定页面的指令缓存,确保指令的正确性。
  • 参数:要刷新的页面指针。
  • 返回值:无。
  • 示例:flush_icache_page(virt_to_page(ptr));
posted @ 2024-03-10 18:08  lethe1203  阅读(284)  评论(0编辑  收藏  举报