首页 > 其他分享 >cache操作函数 --20240310

cache操作函数 --20240310

时间:2024-03-10 18:12:02浏览次数:19  
标签:缓存 20240310 -- kmem cache dcache 内存 数据

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));

标签:缓存,20240310,--,kmem,cache,dcache,内存,数据
From: https://www.cnblogs.com/lethe1203/p/18064526

相关文章

  • 若依管理系统演示截图
    首页1首页2首页图标搜索框预览1预览证书2添加证书证书详情编辑证书导入证书删除证书......
  • 5
    《程序是怎样跑起来的》第五章在计算机科学中,内存和磁盘之间的关系是至关重要的。它们不仅是硬件层面的亲密伙伴,更是程序运行中不可或缺的两个核心组件。内存,也称为随机存取存储器(RAM),是计算机中用于存储运行中的程序和数据的核心组件。它为CPU提供了快速访问数据的能力,使得程序......
  • 6
    《程序是怎样跑起来的》第六章首先介绍了RLE算法,这是一种非常直观的数据压缩算法。在没有大幅度损失数据信息的前提下,RLE算法有效地减小了数据的存储空间。尽管它的实现过程相对简单,但其能力不容小觑。在实际应用中,RLE算法能够在许多场景中发挥作用,尤其是对于可预测的数据序列。......
  • 2.2 关闭防火墙并设置开机不启动
    查看防火墙状态:systemctlstatusfirewalld.service关闭防火墙:systemctlstop firewalld.service开启防火墙:systemctlstartfirewalld.service关闭开机防火墙自启动:systemctldisablefirewalld 开启开机防火墙自启动(enabled状态):systemctlenablefirewalld 查看......
  • python实现批量运行命令行
    python实现批量运行命令行背景:对于不同参数设置来调用同一个接口,如果手动一条条修改再运行非常慢且容易出错。尤其是这次参数非常多且长。比如之前都是输入nohuppython-uexe.py>>../log/exp3.log2>&1&来运行一次,在exe中会设置参数并调用接口运行preditction_uni(input_f......
  • 多进程、多线程知识再整理
    #threading模块'''cpython全局解释器锁导致同时只能有一个线程执行python,利用多cpu执行cpu密集型任务使用多进程,密集io型可以使用多线程并发classthreading.Thread(group=None,target=None,name=None,args=(),kwargs={},*,daemon=NoneThread类代表一个在独立控制线......
  • 程序是怎样跑起来的
    阅读《程序是怎样跑起来的》第一章,我了解了计算机的基本构成和运行原理。这不仅增强了我对计算机体系的认识,也让我认识到学习编程和软件开发必须建立在理解计算机底层机制的基础上。第一章详细介绍了CPU、内存以及输入输出设备等核心组件的功能和相互关系。这种深入浅出的方式,让......
  • comfy UI 的workflow对应的json文件
    {"3":{"inputs":{"seed":404663911490888,"steps":30,"cfg":7,"sampler_name":"dpmpp_2m","scheduler":"karras","denoi......
  • 4-2张量的数学运算
    张量的数学运算主要有:标量运算,向量运算,矩阵运算,以及使用非常强大而灵活的爱因斯坦求和函数torch.einsum进行任意维的张量运算。此外我们还会介绍张量运算的广播机制:本篇文章内容如下:标量运算向量运算矩阵运算任意维张量运算广播机制importtorchprint("torch.__vers......
  • 4-3nn.functional和nn.Module
    importtorchimporttorchkerasprint("torch.__version__="+torch.__version__)print("torchkeras.__version__="+torchkeras.__version__)"""torch.__version__=2.1.1+cu118torchkeras.__version__=3.9.4"""1......